2011-05-10 50 views
4

我剛開始使用Prolog,並且已經遇到了一個看似簡單的例子。這裏是我的特等文件:SWI-Prolog中的未定義過程不起作用

hacker(P) :- mountaindew(P), doesntsleep(P). 
hacker(P) :- writesgoodcode(P). 
writesgoodcode(jeff). 

然後,在我的程序加載到swipl,我這條線測試它在提示符下

writesgoodcode(jeff). 

我認爲它會顯示正確的,但我得到這個錯誤:

?- hacker(jeff). 
ERROR: hacker/1: Undefined procedure: mountaindew/1 
    Exception: (7) hacker(jeff) ? 

這個程序能正常工作,但是這並沒有解決我的問題:

hacker(P) :- writesgoodcode(P). 
writesgoodcode(jeff). 

$ swipl -s dumb.pl 
% dumb.pl compiled 0.00 sec, 1,112 bytes 

?- hacker(jeff). 
true. 

任何人都可以解釋爲什麼我的原始程序不起作用?根據我的理解,Prolog應該「跳過」第一條語句,因爲它沒有足夠的信息,並檢查下一行。它確實有足夠的信息,第二行,因此它應該評估真實。任何幫助或正確方向的一點都會很棒。謝謝。

回答

2

如錯誤消息所示,您有一個未定義的過程mountaindew/1。爲了使你的代碼返回true,你的選擇是:

  1. 定義這個謂詞
  2. 聲明,此謂詞是動態的:dynamic(mountaindew/1)
  3. 宣告所有未知的謂詞應該失敗(不推薦):set_prolog_flag(unknown, fail)
0

你也可以改變謂詞的順序(不能總是完成c) 但主要是Kaarel說的。

到底

確實沒有書面的東西,總是會失敗的一個點,即使你還在開發的代碼

0

這工作,但因爲我是一個初學者,我不能說爲什麼。 「無實證」一詞可能適用。儘管不知道爲什麼它的作品,我認爲這有助於展示一種可行的方法。

hacker(P) :- mountaindew(P), doesntsleep(P). 
hacker(P) :- writesgoodcode(P). 
mountaindew(john). 
doesntsleep(john). 
writesgoodcode(jeff). 
相關問題