2014-09-25 48 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