Flowlog

13: * random answer order
Flowlog (v4.6.14)
Type 'help.' for help, 'halt.' to exit.
?- select(X,[1,2,3,4,5,6,7,8],_).
   X = 1
   X = 3, unexpected % too early
   X = 6, unexpected
   X = 2
   X = 7, unexpected
   ...
?- select(X,[1,2,3,4,5,6,7,8],_).
   X = 2, unexpected
   ...
?- select(X,[1,2,3,4,5,6,7,8],_),!.
   X = 2, unexpected. % sometimes, retry to see
v4.6.14
v4.6.13
v4.6.10
v4.6.8
v4.6.6
12: * infinite loop does not work
inf :-
   inf.

?- inf.
Segmentation fault (core dumped), unexpected.
   loops % expected
|  resource_error(...). % if you insist, ... but a WAM should loop
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
(above with default. Does work with interp. With wam:)
?- append([a], Ys, Zs).
   Ys = Xs, Zs = [a|Xs], unexpected.
Where does Xs come from?
v4.6.5
10: * Default of double_quotes
Consider chars as default. Like all new systems like Scryer, 1ban, Trealla, Tau. And now also Flowlog!
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.
8: * select/3 not conforming
Since 2011 select/3 is defined without any errors. Just with two clauses. (Actually, it was commonly defined like that since at least 1983. C&M:1981 did not use it, nor in the 5th ed. 2003) Thus the following is not conforming:
?- select(X, Xs, Ys).
false, unexpected.
?- select(X, Xs, Xs).
false, unexpected. % see p.p.5.4
?- select(X,Xs,[1,2,3]).
false, unexpected.
% this is the expected answer:
   Xs = [X,1,2,3]
;  Xs = [1,X,2,3]
;  Xs = [1,2,X,3]
;  Xs = [1,2,3,X].
?- select(X, [Y|nonlist], Xs).
error(type_error(list,[_G0|nonlist]),/(select1,3)), unexpected.
This type error would make sense, if the template and modes subclause would indicate ?list for the second argument, but it reads in p.p.5.2
select(?term, ?term, ?term)
?- Xs = [a|Xs], ( true ; catch(select(X, Xs, Ys), Err, true ) ).
   Xs = [a,a,a,a,a|...]
;  Xs = [a,a,a,a,a|...], error(representation_error(term),/(select1,3)), unexpected.
% expected behaviour:
   sto,
   false % occurs-check
|  sto,
   Xs = [a|Xs] % rational trees
;  Xs = [a|Xs], X = a, Ys = [a|Ys]
;  Xs = [a|Xs], X = a, Ys = [a|Ys]
;  ..., ad_infinitum
|  sto,
   representation_error(term).
A representation error can only be issued at a point in time when a goal attempts to create some term that cannot be represented. So this error prevents the creation of something. Thus the goal Xs = [a|Xs] may issue a representation error, if unification is defined in such a manner (e.g., set_prolog_flag(occurs_check, error) in Scryer or Trealla). But from above answer it is clear that this goal succeeds, and thus the infinite tree is created. (Do not call it an infinite term since terms are defined such that there are no cyclic structures in them).
7: * integer overflow incorrect
?- 62 = E, X is 2^E-1+2^E.
X = 9223372036854775807 % good
?- 62 = E, X is 2^E-1+2^E+1.
X = -9223372036854775808, unexpected.
?- X is 2^63.
error(evaluation_error(undefined),/(is,2)), unexpected.
   evaluation_error(int_overflow) % expected exceptional value (3.66, 7.9.2 e, 7.12.2 g, 9.1.2)
|  X = 9223372036854775808. % current_prolog_flag(bounded,false)
current_prolog_flag(bounded,false) in SICStus, Scryer, Trealla, YAP, B, IF, IV, SWI, ECLiPSe, Ciao. Internally, these implementations have two versions of integers, the small immediate ones and the large one which reside on the heap. In this manner the immediate integers may use less than 60..63 bits, which frees tagging space for other uses.

Only GNU, 1ban with current_prolog_flag(bounded,true) and correct overflows.

GNU:

| ?- 59 = E, X is 2^E-1+2^E.

X = 1152921504606846975

yes
| ?- 59 = E, X is 2^E-1+2^E+1.
uncaught exception: error(evaluation_error(int_overflow),(is)/2)
1ban:
?- 62 = E, X is 2^E-1+2^E.
X = 9223372036854775807.
?- 62 = E, X is 2^E-1+2^E+1.
2026/01/02 11:43:26 error(evaluation_error(int_overflow),is/2)
XSB, Cx, Minerva are also bounded, but miss some overflows.

In general, it is much easier to be conforming with unbounded integers, because this overflow evaluation_error never occurs which limits arithmetical optimizations. And one has to test for overflows anyway.

6: * writeq ignores operators
Before improving read-ing, consider writeq-ing. Such that you always write valid syntax. So the first to address would be:
  1. s#1,
  2. s#13,
  3. s#27,
  4. s#35,
  5. s#36
5: * testing number_chars/2
Because of #3 and #4, I cannot Now I use the current test table, so I resorted to like the old one. Please go through it. (Numbers are the same) Problems start with #9, #17, #21.
ulrich@gupu:/opt/gupu/flowlog$ ./flowlog 
Flowlog (pthreads)
Type 'help.' for help, 'halt.' to exit.
?- number_chars(1,[_,[]]).
error(instantiation_error,/(number_chars,2)), unexpected.
   type_error(character,[]). % expected, but not found
?- number_chars(N,['3',.]).
N = 3.0, unexpected.
   syntax_error(...). % expected, but not found
?- number_chars(N,[-,' ','1']).
flowlog: fatal error (240): flowlog: unexpected token while parsing term
4: * read/1 strangely buffered
Sometimes, read/1 succeeds immediately after entering a valid term (and return/newline), and sometimes it needs a C-d (control-d) to flush out the buffer, but then this C-d is interpreted as an end-of-file.
ulrich@gupu:/opt/gupu/flowlog$ ./flowlog 
Flowlog (pthreads)
Type 'help.' for help, 'halt.' to exit.
?- read(X),catch(X,Err,true),writeq(X+Err),nl,fail.
number_chars(N,[X]).
number_chars(_1,[_2])+error(instantiation_error,number_chars/2) % good
false
?- repeat,read(X),catch(X,Err,true),(X==end_of_file,!;writeq(X+Err),nl,fail).
number_chars(N,[X]).


   % unexpected. Only C-d causes a reaction, newlines alone do not work here
number_chars(_1,[_2])+error(instantiation_error,number_chars/2)
X = end_of_file, Err = error(existence_error(procedure,/(end_of_file,0)),/(end_of_file,0))
Also entering SPACE C-d instead does not work. This should flush the line and since it ends with ". ", the end-token is present already.

So how is it possible to write my own top level for the purpose of testing?

3: * top level ignores Prolog flag
The goal set_prolog_flag(double_quotes, chars) is ignored by the top level loop.
ulrich@gupu:/opt/gupu/flowlog$ ./flowlog 
Flowlog (pthreads)
Type 'help.' for help, 'halt.' to exit.
?- set_prolog_flag(double_quotes,chars).
true
?- read(X).
"abc".
X = [a,b,c] % good
?- writeq("abc").
[97,98,99]true % unexpected
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.
1: * Consider github
or at least redo the color scheme, the dark colors are very hard to read. Solved with git repository.
Installation:
wget https://web.liminal.cafe/~byakuren/flowlog/flowlog.tar.gz
git clone https://git.liminal.cafe/byakuren/flowlog.git
make