Frage Zeigen Sie eine Liste im 'raw' ./2 Format an


Ist es möglich, eine Prolog-Liste im Format ./2 anzuzeigen, z.

für die Liste:

| ?- L=[a,b,c].
L = [a,b,c] ? 
yes

Gibt es ein Mittel zum Anzeigen:

L = .(a, .(b, .(c, []))).

5
2017-08-11 10:45


Ursprung


Antworten:


Normalerweise, write_canonical(List) oder ?- write_term(List, [quoted(true), ignore_ops(true)]), wie in den Kommentaren hervorgehoben. Seit SWI-Prolog beschlossen hat Dinge anders machendas ist nicht gut genug:

?- write_canonical([a]).
[a]
true.

?- write_term([a], [quoted(true), ignore_ops(true)]).
[a]
true.

?- write_term([a], [dotlists(true)]).
.(a,[])
true.

Siehe die Dokumentation auf write_term/2, achte auf die Optionen brace_terms(Bool) und dotlists(Bool). Aber Vorsicht: Wenn Sie SWI-Prolog 7 normal starten, ist die ./2 ist nicht mehr der Listen-Funktor!

?- L = .(a, []).
ERROR: Type error: `dict' expected, found `a' (an atom) % WHAT?

?- L = '[|]'(a, []).
L = [a].

Wenn Sie es mit starten swipl --traditionalDinge sind wieder normal, eine Art:

$ swipl --traditional
Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 7.3.4-32-g9311e51)
Copyright (c) 1990-2015 University of Amsterdam, VU Amsterdam
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to redistribute it under certain conditions.
Please visit http://www.swi-prolog.org for details.

For help, use ?- help(Topic). or ?- apropos(Word).

?- L = .(a, []).
L = [a].

Sie können immer noch nicht verwenden write_canonical(List) oder write_term(List, [quoted(true), ignore_ops(true)]).

Lesen Sie den verlinkten Abschnitt der SWI-Prolog-Dokumentation für Details und Gründe. Als Hinweis, wenn Sie sich dazu entscheiden, SWI-Prolog Stick zu SWI-Prolog 7 mit den Standardeinstellungen zu verwenden und nur zu verwenden write_term(List, [dotlists(true)]) wenn Sie mit einer anderen Prolog-Implementierung kommunizieren müssen. Die übliche Listennotation, [a, b, ...] sollte in den meisten herkömmlichen Situationen gut genug sein.


4
2017-08-11 15:05