在终端输入“prolog”获取:
GNU Prolog 1.3.0
By Daniel Diaz
Copyright (C) 1999-2007 Daniel Diaz
| ?-
打字:
| ?- member(2, [1,2,3]).
获取:
true ?
然后按Enter键:
yes
打字:
| ?- member(4, [1,2,3]).
得到:
no
当我写文件时; test.pl由此组成:
:- member(4, [1,2,3]), nl, halt.
然后写在终端:
| ?- [test2].
我明白了:
compiling /path/test.pl for byte code...
/path/test.pl:1: warning: unknown directive (',')/2 - maybe use initialization/1 - directive ignored
/path/test.pl compiled, 1 lines read - 139 bytes written, 11 ms
yes
这里答案不是吗?我究竟做错了什么。另外,你会如何在prolog中做到这一点:
if (testInPrologTerminal(member(4, [1,2,3])) { do this; }
即,我想向prolog顶层发送查询,并获得答案
答案 0 :(得分:3)
当您键入查询member(2, [1,2,3])
时,GNU Prolog会提示您提供可能的其他解决方案(因此true ?
提示),因为只需通过回溯(并查看列表中的最后一个元素,3)它可以检查它。当您按Enter键时,您告诉顶级解释器您对当前解决方案感到满意(列表第二个位置中的元素2)。第二个查询member(4, [1,2,3])
没有解决方案,因此您获得了no
。
要在加载文件时执行查询,标准和可移植的方法是使用标准initialization/1
指令。在这种情况下,你会写:
:- initialization((member(4, [1,2,3]), nl, halt)).
请注意()围绕查询,否则您可能会收到有关未知initialization/3
标准内置控件构造的警告。如果在加载文件时要执行更复杂的查询,则定义一个谓词,使查询从initialization/1
指令调用此谓词。例如:
main :-
( member(4, [1,2,3]) ->
write('Query succeeded!'), nl
; write('Query failed!'), nl
).
:- initialization(main).
将任意查询作为指令写入源文件是传统做法,因此被几个Prolog实现所接受,但使用initialization/1
指令是更干净,标准和便携的替代方案。