2011-10-24 118 views
2

SWI-Prolog的5.10.2去/ 0未定義程序保存/ 1

我已經輸入這個Prolog程序。但是,當我運行選項我碰到下面的錯誤。

go/0 Undefined Procedure save/1 

我確定save是一個正確的關鍵字謂詞,並且文件的路徑也存在。不知道我在哪裏錯了。

What does the /0 /1 mean in go and save? 

的源代碼

/* Shopping list */ 

go:-reconsult('~/projects/prolog/chap7/shopping.pl'), 
    write('a: See list'), nl, 
    write('b: Add to list'), nl, 
    write('c: Delete from list'), nl, 
    read(Choice), 
    choice(Choice), 
    save('~/projects/prolog/chap7/shopping.pl'). 

/* 
    facts for shopping 
*/ 
item(potatoes). 
item(bread). 
item(coffee). 

/* 
    Rules for shopping list 
*/ 
choice(a):-listing(item), nl. 
choice(b):-write('Enter an item: '), 
     read(Item), 
     assert(item(Item)). 
choice(c):-write('Item to delete: '), 
     read(Item), 
     retract(item(Item)). 
choice(_):-write('Incorrect entry.'), nl. 

提前許多感謝,

回答

6

錯誤消息指出您定義的謂詞go/0使用謂詞save/1,系統無法識別並標記爲未定義的過程。謂詞通常由謂詞指示符來標識,其形式爲name/arity,其中name是謂詞的名稱,用原子表示,arity是表示謂詞已定義接受多少個參數的數字:例如, go/0是謂詞go的標識符,沒有參數,在您的程序中定義;而save/1是謂詞save的標識符,它帶有一個參數,即您嘗試調用但系統無法找到的參數。當謂詞已經通過兩個或更多重載版本定義時,例如對於每個定義具有不同的參數,可以通過將每個參數括在括號之間來引用,用逗號分隔,例如括號。 p/[1,2]。謂詞有時被稱爲程序,這兩個術語大致相同。

可以在older SWI-Prolog manuals(該鏈接指的是版本2.9)中看到save/1確實用於在標準庫中定義並且通常在這些系統上可用。即使在那些舊系統中,也有人建議使用save_program/[1,2]來創建一個新程序,而不是save/1,據說這僅用於調試目的。但是,在現代的SWI-Prolog系統中,save/1都不可用save_program/[1,2]。雖然save/1似乎沒有相應的謂詞,save_program/[1,2]的作用已被qsave_program/[1,2]採用,您可以閱讀有關in the latest version of the manual的信息。請務必閱讀關於its limitations的信息,以防萬一您想要將您的程序擴展到您在此發佈的簡單代碼段之外。

從來沒有使用過這種程序,我必須假設你知道你在做什麼。但是,請注意在程序開始時調用reconsult/1調用後面會使用與save/1保存的文件相同的文件,但請您注意,文本文件中的一串Prolog謂詞之間存在差異,即reconsult/1可以讀取的格式並理解,並且至少有qsave_program(但我保留savesave_program)的半文本半二進制格式用於將程序寫入磁盤。因爲通過閱讀你的代碼,看起來你可能會對存儲購物清單的項目感興趣,另外我還想補充一點,你可以使用listing/1I/O procedures這樣的組合來保存純文本文件中的興趣謂詞如open/3,set_output/1,current_output/1等。

+0

我讀的prolog書是1994年出版的。所以也許過時了。感謝你的回答。 – ant2009

+0

只是好奇:哪本書? –

2

不知道爲什麼你得到的錯誤,因爲我不是很熟悉SWI Prolog的,但/ 1/0表示謂詞中的參數個數。在這種情況下,您使用1個參數調用保存,因此保存/ 1。

另外,你有沒有嘗試過使用謂詞save_program/1?據我所知,保存應該只用於調試(從http://euclid.barry.edu/~segami/Manual/sec-2.9.html)。

在我看到的例子中,save/save_program謂詞總是被調用而沒有引號或文件擴展名。我的印象是這門語言爲你處理這個部分。 喜歡:保存(文件名),而不是保存('filename.pl')。

3

你寫:「尋找來自可信和/或官方 來源的答案。如果你需要的第一手反饋,你應該張貼的SWI郵件列表中 問題:

SWI-Prolog 5.11.29, Mailing list

通常你在循環SWI序言的主要作者,也 許多貢獻者。

最好的問候