2014-09-11 161 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