【发布时间】:2018-08-02 02:58:53
【问题描述】:
我已经看到了一些关于这个主题的问题,但是没有一个能真正正确地回答我的问题。我会写一个小例子,这里有一些事实:
football(john).
football(sam).
tennis(john).
tennis(pete).
netball(sandy).
我想创建一条规则,说明 pete 喜欢任何踢足球或网球的人。
likes(pete, X) :- (football(X) ; tennis(X)), X \= pete.
但很明显,当我在 Prolog 中查询它时,john 会出现两次,因为john 既踢足球又踢网球。我希望它只出现一次john。我该如何修改我的代码来做到这一点?
提前致谢 - 丹
【问题讨论】:
-
唯一真正的方法是使用
setof/3。这是因为 Prolog 不会在解决方案之间保持状态,所以它实际上不知道它之前已经给了你一次 john ——除非你使用像setof/3这样的二阶谓词让它保持跟踪。
标签: prolog prolog-setof prolog-tabling