如何从Prolog中的知识库返回唯一结果?

时间:2012-02-29 17:10:13

标签: prolog unique predicate

在这里完成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

但这似乎不起作用。

感谢。

1 个答案:

答案 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.

使用术语排序@<来确保第一个术语“小于”第二个术语(这意味着它们不相等)。