我正试图根据一组信息获得三个项目的列表及其相关信息:
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
不是一个过程,但是我可以用什么来检查apple的值和bar的值?
首先,显而易见的是,你曾经错误地称便宜:
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 mods让我知道我错了)