Why is this not working?
?- '.'(a,). ERROR: Unknown procedure: ('.')/2 ERROR: However, there are definitions for: ERROR: ('.')/3 false. ?- .(a,). ERROR: Unknown procedure: ('.')/2 ERROR: However, there are definitions for: ERROR: ('.')/3 false. ?- .(a,) == [a]. ERROR: Type error: `dict' expected, found `a' (an atom) ERROR: In: ERROR:  throw(error(type_error(dict,a),_13228)) ERROR:  '<meta-call>'(user:user: ...) <foreign> ERROR:  toplevel_call(user:user: ...) at /usr/lib/swi-prolog/boot/toplevel.pl:1158 ERROR: ERROR: Note: some frames are missing due to last-call optimization. ERROR: Re-run your program in debug mode (:- debug.) to get more detail.
Not sure how relevant this is practically but according to the literature this should be correct. Does SWI have a different predicate/procedure?
The internal representation is also revealed by means of
?- display([1,2,3]). '[|]'(1,'[|]'(2,'[|]'(3,)))
As linked in the comments, the SWI Prolog documentation says:
The ‘cons' operator for creating list cells has changed from the pretty atom
‘.’to the ugly atom
‘[|]’, so we can use the
‘.’for other purposes, notably functional notation on dicts. See section 5.4.1.
That means the equivalent to your traditional
.(a,.(b,)) in SWI 7+ is:
?- X = '[|]'(a, '[|]'(b, )). X = [a, b]