2014-09-25 83 views
2

我想基於信息的集合,以獲得三個項目的列表及其相關的信息:Prolog的未定義的程序

product(I):- 
    I = [_,_,_,_], %Type,Brand,Category,Value 
    cheaper(item(apple,_,_),item(_,kay,_,_),I), 
    cheaper(item(bar,_,_,_),item(_,_,fruit,_),I), 
    member(item(_,kay,_,2),I), 
    member(item(apple,granny,_,_),I), 
    member(item(bar,_,chocolate,_),I), 
    /* Below not given */ 
    member(item(cracker,_,_,_),I), 
    member(item(_,_,biscuit,_),I), 
    member(item(_,_,_,4),I), 
    member(item(_,_,_,5),I). 

cheaper(X,Y,H) :- %Used to determine the item values 
    item(X,_,_,A), 
    item(Y,_,_,B), 
    A<B. 

當我嘗試運行它,我遇到了一個錯誤:

?- product(I). 
ERROR: cheaper/3: Undefined procedure: item/4 
Exception: (8) item(item(apple, _G3604, _G3605), _G3651, _G3652, _G3653) ? 

據我所知,item不是一個過程,但是我可以用什麼來檢查蘋果的值與bar的值?

+2

你已經用兩個參數定義它,而不是三個。這是錯誤信息告訴你的。 – 2014-09-25 08:08:33

+0

謝謝,我現在看到它。 – Alpine 2014-09-25 08:10:38

回答

1

首先,顯而易見的音符,你叫錯了一次便宜:

cheaper(item(apple,_,_),item(_,kay,_,_),I), 
     ↑ 
     Only three values, not four. 

如果item不是一個過程,你不能調用它,而是用解構。 另外,你想要更便宜地檢查這些物品成爲清單的一部分,對嗎?如果是這樣,你必須檢查。你可以使用統一來提取你需要的值:

cheaper(X,Y,I) :- 
    member(X,I), 
    member(Y,I), 
    [item(_,_,_,A),item(_,_,_,B)] = [X,Y], 
    A<B. 

現在你會得到一些關於未實例化參數的錯誤。那是因爲你正在檢查沒有(還)設置的變量,如果它們大於彼此。爲了避免這種情況,移動電話cheaper/3你的身體節的結尾:

product(I):- 
    I = [_,_,_,_], %Type,Brand,Category,Value 
    member(item(_,kay,_,2),I), 
    member(item(_,_,_,4),I), 
    member(item(_,_,_,5),I), 
    member(item(apple,granny,_,_),I), 
    member(item(bar,_,chocolate,_),I), 
    /* Below not given */ 
    member(item(cracker,_,_,_),I), 
    member(item(_,_,biscuit,_),I), 
    cheaper(item(apple,_,_,_),item(_,kay,_,_),I), % note the 4th argument 
    cheaper(item(bar,_,_,_),item(_,_,fruit,_),I). 

有了這個,你會得到一個解決方案,然後將其失敗並顯示錯誤。這是因爲您只給出價格槽的三個值,並且您有四個項目,並且prolog將檢查A > 2

對不起,在我的其他答案我沒有看海報試圖實現什麼,我認爲這比完整的reedit更好。 (光榮SO MOD讓我知道如果我錯了)

+1

非常感謝你提供非常豐富的迴應,它的確有竅門! – Alpine 2014-09-25 11:37:18