Flowlog All, current items.

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:
wget https://web.liminal.cafe/~byakuren/flowlog/flowlog.tar.gz
git clone https://git.liminal.cafe/byakuren/flowlog.git
make
[ICO]NameLast modifiedSizeDescription

[PARENTDIR]Parent Directory  -  
[TXT]name.txt2026-01-05 11:38 8  
[TXT]gfl.pl2026-06-17 14:41 40  
[TXT]lr.pl2026-01-06 20:51 343  
[TXT]FLOWLOG-HEADER.html2026-07-28 14:07 25K 

Apache/2.4.67 (Debian) OpenSSL/3.0.18 Server at www.complang.tuwien.ac.at Port 443