我正在做Prolog(swi-prolog)中的第一步,无法解决以下问题:如何将存在量化的规则包含到我的事实中;具体而言,如何将“每个人都是某人的朋友”这句话作为一个事实包含在\forall x \exists y friend(x,y)
中?到目前为止,我发现的每个问题都只是关于疑问而非事实。谢谢!Prolog事实中的存在量化
3
A
回答
5
在你给出的例子中,你实际上是量化变量而不是规则。考虑到这一点,考虑下面的例子:
friend_of(a,b).
friend(X) :-
friend_of(X,Y).
规则中的变量普遍定量,这样你就可以编写规则的逻辑公式,像这样:
∀ X
∀ Y
(friend(X)
← friend_of(X,Y))
由于变量Y
没有出现在规则的头部,所以它的通用量词可以移动到规则体中作为存在q uantifier:
∀ X
(friend(X)
← ∃ Y
friend_of(X,Y))
现在,这个公式读为:如果存在一个Y
使得friend_of(X,Y)
为真FORALLX
friend(X)
是真实的。这似乎与你想要的非常接近。
如果您考虑事实另一方面,他们习惯于说明情况。在上面的例子中friend_of/2时,这只是写
friend_of(a,b) :- true.
不过的一小段路,没有变量在这里,所以没有什么可量化了。
编辑:关于您的意见中的情况,我会注意到谓词构成关系。关系并不是必须对称的,这就是为什么我将关系命名为friend_of/2的原因。也就是说,friend_of(a,b)
并不意味着friend_of(b,a)
。关系也不一定是自反的。关系朋友是否反身性是值得商榷的。但是,这当然是一个可能的阅读。考虑到这一点,并在您的评论给出的例子,让我们假设你有一些事实,描述a
,b
和c
的人,像这样:
person(a).
person(b).
person(c).
然后你可以描述一个自反关系的朋友/ 2样所以:
friends(a,b) :- false. % example from your comment
friends(a,c) :- false. % example from your comment
friends(X,X) :- % the relation is reflexive
person(X). % among people
表达反身性的规则基本上规定,至少每个人都是朋友。从这个规则你的要求每个人都是一个人的朋友直接关注。如果你查询这个关系,你得到期望的结果:
?- friends(a,X).
X = a
最一般的查询也得到了每个人的结果,尽管两个不同的人之间没有实际的友谊都是说:
?- friends(X,Y).
X = Y = a ? ;
X = Y = b ? ;
X = Y = c
注意,事实人/ 1有必要限制对实际人员的答案。如果您查询的朋友/ 2与一些非人:
?- friends(cos(0),X).
no
如果你尝试定义自反没有这样的目标:
friend(X,X).
您的定义将是太笼统:
?- friends(a,X). % desired result
X = a
?- friends(cos(0),X). % undesired result
X = cos(0)
而最一般的查询不会产生任何实际的人:
?- friends(X,Y).
X = Y
相关问题
- 1. 事实的Prolog
- 2. Prolog的 - 事实
- 3. 在Prolog中强加事实
- 4. 在Prolog中自写的事实?
- 5. 无法在Jekejeke Prolog中创建事实
- 6. 在Prolog中使用非基础事实?
- 7. 我的事实错误? (Prolog)
- 8. 如何检查变量是否在Prolog中实例化?
- 9. Prolog实例化错误?
- 10. 变量在Prolog中
- 11. 如何检查我的prolog数据库中是否存在特定的事实
- 12. 如何在prolog中指定一个独特的事实?
- 13. 在Prolog中实现堆栈
- 14. 如何对Prolog事实施加约束?
- 15. 如何在Prolog中存储和访问变量中的列表?
- 16. Prolog:在实现目标时的变量实例
- 17. 如何在Prolog中编写查询包含事实
- 18. 在SWI-Prolog中定义一系列事实
- 19. 如何在prolog中打印所有数据库事实
- 20. Prolog - 参数没有充分实例化
- 21. prolog实例化错误= =运算符
- 22. Prolog给出实例化错误
- 23. Prolog中的变量绑定
- 24. 阅读文件,并建立在SWI-Prolog的事实
- 25. 无法作出事实动态在SWI-Prolog的
- 26. Prolog简化
- 27. 在Prolog中if/else的变量范围
- 28. Prolog的变量名
- 29. 如何在Prolog中自动化分号
- 30. 如何将结果存储到prolog中的变量中?
你是对的我有点混淆术语。我猜这个练习的目标是根据一些事实来推断友谊。例如。如果我知道只有a,b和c以及〜朋友(a,b)和〜朋友(a,c),我可以根据上述规则推断出朋友(a,a)。我还不完全知道你的建议解决方案如何工作。 – huxley
@huxley:“〜朋友(a,b)”是什么意思?你的意思是说你给了一个“朋友(a,b)”的事实吗?或者你明确表示'a'和'b'不是朋友,例如:'friend(a,b): - false.'? – tas
第二种情况就是我的意思。因此,考虑到a和b以及a和c不是朋友的知识,我怎么能推断出a和a必须是朋友(朋友(a,a)),因为你的解决方案中给出了“每个人都是某人的朋友”? – huxley