- 41: *
Timeout
-
Having a nice answer description that effectively realizes a specific timeout
would be nice. The question is rather how to call it?
Maybe
takes_less_than(4s), needs_less_than.
- 40: *
quads: sto annotation
-
reads:
?- X = f(X).
sto, X = f(X) % With occurs-check: fails or error
| sto, loops. % Without occurs-check: may loop
This case is particularly ambiguous, as there is not a single system
that loops here. Many systems loop when writing the answer, though.
More explicitly:
?- X = f(X), Y = f(Y), X = Y.
sto, false % occurs-check
| sto, representation_error(term) % occurs-check error
| sto, loops
| sto, resource_error(...) % effectively implied by loops
| sto, X = f(X), X = Y % rational trees
| sto, X = f(f(Y)), Y = f(f(Y)) % literal substitution, Tau
| sto, ... .
- 39: *
quads: Malformed answer description accepted
-
?- X = 1.
1 = X. % not an answer substitution
- v4.11.0
- 38: *
multiple answer descriptions not supported
-
Currently, only a single answer description is possible. This is in
particular of relevance when reporting bugs. So a succession of bug
reports can be compactly described.
"✳54·43" ?- X is 1+1.
X = 3, unexpected. % almost
X = 1, unexpected. % too low
X = 2.0, unexpected.
% and after checking PM:
X = 2.
- 37: *
(?-)/2 not supported
- Same as (?-)/1 but with the
first argument a ground term to identify the test case. Like in
number_chars_quad.
- 36: *
quads: wrong documentation
-
In QUAD_TESTS
...
# Run a single quad file (two equivalent forms)
make quad tests/predicates/assertz_quad.pl
make quad QUAD_FILE=tests/predicates/assertz_quad.pl
The first version does not work, the second does.
- 35: *
Unclear quad
-
at_end_of_stream_quad.pl:
% Verify predicates exist
?- predicate_property(at_end_of_stream, built_in).
true
| predicate_property(at_end_of_stream, _).
This is not an answer description!
- 34: *
Some more specific test quads
-
arith_eq_quad.pl:
?- X =:= foo.
instantiation_error
| type_error(evaluable,foo/0).
?- foo =:= X.
idem.
Because in 7.12:
When more than one error condition is satisfied, the error
that is reported by the Prolog processor is implementation
dependent.
- 33: *
quads: arg/3
-
arg_quad.pl:
% Negative argument fails
?- arg(-1, foo(a,b), X).
false
| error(domain_error(not_less_than_zero, -1), _).
Should read just
?- arg(-1, foo(a,b), X).
domain_error(not_less_than_zero, -1).
- 32: *
quads: Minor naming
-
% Can't abolish static predicates
% ?- abolish(append/3).
% permission_error(modify, static_procedure, append/3).
Why not:
?- abolish(abolish/1)).
permission_error(modify, static_procedure, abolish/1)
| permission_error(modify, static_procedure, ...).
(It's not clear how you indicate modules, in case they appear ...)
- 31: *
quads: Impossible outcome
-
abolish_quad.pl:
% Abolish non-existent predicate (may succeed or error)
?- abolish(abolish_nonexistent_xyz/3).
true
| error(existence_error(procedure, abolish_nonexistent_xyz/3), _).
This can never happen, however
| permission_error(modify, static_procedure, ...).
might be possible. But since you implicitly imply qua the name that
abolish_nonexistent_xyz/3 does not exist, it cannot happen. (But then
note that we have again some implicit assumption, and testing should
avoid such nonchalant implications.)
- 30: *
quads: Unclear answer description
-
abolish_quad.pl:
?- assertz(abolish_test(1)), assertz(abolish_test(2)),
abolish(abolish_test/1),
\+ current_predicate(abolish_test/1).
true
| \+ abolish_test(_).
How can this alternative exist? The only alternative imaginable is
| permission_error(modify, static_procedure, ...).
- 29: *
quads: Missing error formats
-
asserta_quad.pl:
?- asserta(X).
error(instantiation_error, _).
This insists on the second argument being a variable. Instead:
?- asserta(X).
error(instantiation_error, ...).
instantiation_error. % compact like in 13211-1
throw(error(instantiation_error, ...)).
That is, all three are valid outcomes, and all three have to be tested.
In answer descriptions variables represent variables (or some
rational, infinite trees, but only when sto ...).
- Will continue testing
number_chars/2 extensively
after #28, #27, #19, #17,
- v4.10.2
- 27: *
segv
-
l(0).
l(N0) :-
l(N1),
N0 is N1+1.
?- l(N).
N = 0
; N = 1
; N = 2
; N = 3
; N = 4Segmentation fault (core dumped)
- 25: *
$-ambiguities
-
s#366
- 24: *
Valid term rejected
-
nihil --> [].
This is a valid term, even if you do not have any DCG support. It
should be at least a fact.
- v4.10.1
number_chars/2 passes
all current tests
- 23: *
Operator '|' needed for DCGs
-
Definite Clause Grammars are defined in 13211-3, they have the bar
operator defined. Including them by default does make a lot of sense.
Also quads need this operator defined in that way.
- v4.9.18 no progress for number_chars/2
- 22: *
Minor big integer problem
-
#7,
#8.
?- N is 2^63, functor(_,f,N).
error(type_error(integer,9223372036854775808),functor/3), unexpected.
type_error(...,...), unexpected. % any type error is bad
?- N is 2^63, arg(N,f(1),_).
error(type_error(integer,9223372036854775808),arg/3), unexpected.
false. % expected, but not found
- 21: *
Output in quads
-
For simple output there is
outputs/1 with a grammar
rule body as argument. To start with, a list of characters will do.
?- call((write(3), call(1)).
outputs("3"),
type_error(callable, 1).
Compare this to the original example in 7.8.3.4:
call((write(3), call(1)).
Outputs '3', then
type_error(callable, 1).
So it's outputs not output. The comma has here the meaning and
then. Answer constraints and answer substitutions come last in a
leaf-answer. (Unclear, if there are situations to put them first.
Maybe if constraints and side effects are involved. But this gets way
too complex.)
?- Ch = t, put_char(Ch).
outputs("t"),
Ch = t.
- 20: *
sub_string/5 unusual
-
Why the same as sub_atom/5? If (at all), it might be defined over
strings (lists of chars).
- 19: *
length/2
-
l#1, l#4 ...
And the actual quads
are here.
In case of difficulties, please refer to the sources of Scryer.
?- length(L,N). % #1
error(existence_error(procedure,length/2),length/2), unexpected.
L = [], N = 0
; ... . % expected, but not found
?- length(2,0). % #4
error(type_error(list,2),length/2), unexpected.
false. % expected, but not found
- v4.9.13
- v4.9.8
- v4.9.6
- v4.9.3
- v4.9.0
For the moment, I will stop testing Flowlog, since the most
elementary items are ignored. I will look
at s#1 only and
update other issues only after this has been addressed.
- 17: *
append/3 and double quotes entirely disfunctional
-
?- append("ab","cd",L).
false, unexpected.
L = "abcd". % expected, but not found
?- append([],Ys,Zs).
Segmentation fault (core dumped)
Ys = Zs. % expected, but not found
?- append("a",Ys,Zs).
false, unexpected.
?- member(X,"a").
false, unexpected.
?- member(X,[a]).
X = a.
?- [X] = "a".
X = a.
cons([_|_]).
?- cons("a").
false, unexpected.
- v4.8.0
- v4.7.2
- v4.7.1
- v4.6.14
- v4.6.13
- v4.6.10
- v4.6.8
- v4.6.6
- 11: *
append/3
does not work
-
(Example from the Prolog prologue)
?- append([a], Ys, Zs).
Segmentation fault (core dumped), unexpected.
Zs = [a|Ys]. % expected, but not found
Ys = _1, Zs = [a|_2], unexpected.
(above with default. Does work with interp. With wam:)
?- append([a], Ys, Zs).
Ys = Xs, Zs = [a|Xs], unexpected. % no longer
Ys = _1, Zs = [a|_2], unexpected. % new
Where does Xs come from?
- v4.6.5
- 9: *
git clone problem with old system
-
ulrich@p0:/tmp$ git clone https://git.liminal.cafe/byakuren/flowlog.git
Cloning into 'flowlog'...
fatal: unable to access 'https://git.liminal.cafe/byakuren/flowlog.git/': gnutls_handshake() failed: Handshake failed
ulrich@p0:/tmp$ cat /etc/issue
Ubuntu 14.04.6 LTS \n \l
This does not happen with github. There I follow various systems like
Scryer, Trealla.
- 2: *
compilation on older system does not work
-
ulrich@p0:/opt/gupu/flowlog$ make
cc -O2 -Wall -Wextra -pthread flowlog.c -lm -o flowlog
flowlog.c:41:23: fatal error: stdatomic.h: No such file or directory
#include
^
compilation terminated.
make: *** [flowlog] Error 1
ulrich@p0:/opt/gupu/flowlog$ cc --version
cc (Ubuntu 4.8.4-2ubuntu1~14.04.4) 4.8.4
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Installation: