在这里完成prolog初学者。
假设我有一个包含食物及其价格的序言知识库,例如:
food(banana,99).
等
我正在尝试编写一个谓词,如果知识库中有两个或更多项具有相同的价格,则该谓词将返回true。我遇到的问题是我写的查询:
multiple(X) :- food( _ ,X), food( _ ,X).
如果数据库中只有一个项目的价格为X,那么将返回true。我理解问题是什么(它找到相同的项目两次并返回true),但我不明白如何编写一个查询会从食物中找到两个或多个唯一项目。
我尝试过编写一个“独特”规则,如下所示:
multiple(X) :- food(Y,X), food(Z,X), unique(Y,Z).
unique(Y,Z) :- Y /= Z
但这似乎不起作用。
感谢。
答案 0 :(得分:6)
“不等于”在标准Prolog中写为\=
,而不是/=
。您的解决方案应该有效:
?- [user].
|: food(milk, 10).
|: food(banana, 99).
|: food(strawberry, 40).
|: food(bread, 40).
|: % user://2 compiled 0.00 sec, 664 bytes
true.
?- food(X, Price), food(Y, Price), X \= Y.
X = strawberry,
Price = 40,
Y = bread ;
X = bread,
Price = 40,
Y = strawberry ;
false.
除了它可能会返回重复项。要摆脱这些,请使用诸如
之类的查询food(X, Price), food(Y, Price), X @< Y.
使用术语排序@<
来确保第一个术语“小于”第二个术语(这意味着它们不相等)。