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不是一个过程,但是我可以用什么来检查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让我知道我错了)

最新更新