Prolog,在终端得到正确的答案,但在运行程序时错误的答案

时间:2014-09-11 07:59:33

标签: prolog iso-prolog prolog-toplevel

在终端输入“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顶层发送查询,并获得答案

1 个答案:

答案 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指令是更干净,标准和便携的替代方案。