2014-09-11 138 views
2

键入 “序言” 时获得的终端正确的答案,但错误的答案得: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 

不应该在这里的答案是不?我究竟做错了什么。此外,如何将你在序言中这样做:

if (testInPrologTerminal(member(4, [1,2,3])) { do this; } 

也就是说,我想送查询序言中顶级水平,并得到一个答案

+0

您可能想要注意最新版本的GNU是1.4.4。 – false 2014-09-11 16:31:22

回答

3

当您键入查询member(2, [1,2,3]),GNU Prolog的提示您一个可能的附加解决方案(因此true ?提示)只有通过回溯(并查看列表中的最后一个元素,3)它可以检查它。当你按回车键时,你告诉顶级解释者你对当前的解决方案感到满意(列表中的元素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指令是更干净,标准,和便携式替代。

+1

为什么“试图重新定义(',')/ 2标准内置”?没有额外的括号,它似乎只是(未知)初始化/ 3调用 – user396672 2014-09-11 11:25:48

+1

当然!对不起,这个错误。现在更正。 – 2014-09-11 11:29:01