是否可以以./2格式显示Prolog列表,例如
列表:
| ?- L=[a,b,c].
L = [a,b,c] ?
yes
Run Code Online (Sandbox Code Playgroud)
有没有办法显示:
L = .(a, .(b, .(c, []))).
Run Code Online (Sandbox Code Playgroud)
小智 4
通常,write_canonical(List)或者?- write_term(List, [quoted(true), ignore_ops(true)]),正如评论中指出的那样。由于 SWI-Prolog 决定以不同的方式做事,这还不够好:
?- write_canonical([a]).
[a]
true.
?- write_term([a], [quoted(true), ignore_ops(true)]).
[a]
true.
?- write_term([a], [dotlists(true)]).
.(a,[])
true.
Run Code Online (Sandbox Code Playgroud)
请参阅上的文档write_term/2,注意选项brace_terms(Bool)和dotlists(Bool)。但要注意:如果正常启动 SWI-Prolog 7,则./2不再是列表函子!
?- L = .(a, []).
ERROR: Type error: `dict' expected, found `a' (an atom) % WHAT?
?- L = '[|]'(a, []).
L = [a].
Run Code Online (Sandbox Code Playgroud)
如果你从 开始swipl --traditional,事情就会恢复正常,有点像:
$ 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].
Run Code Online (Sandbox Code Playgroud)
您仍然无法使用write_canonical(List)或write_term(List, [quoted(true), ignore_ops(true)])。
请阅读 SWI-Prolog 文档的链接部分以了解详细信息和基本原理。作为建议,如果您决定使用 SWI-Prolog,请坚持使用 SWI-Prolog 7 的默认设置,并且仅write_term(List, [dotlists(true)])在需要与另一个 Prolog 实现进行通信时才使用。在大多数常规情况下,通常的列表表示法[a, b, ...]应该足够好了。