prolog 一阶逻辑

Posted

技术标签:

【中文标题】prolog 一阶逻辑【英文标题】:prolog first order logic 【发布时间】:2012-09-20 09:05:57 【问题描述】:

我正在尝试找到一种方法将以下一阶逻辑表达式放入 Prolog:

(p(0) or p(1)) and not (p(0) and p(1)) 

这意味着它应该以下列方式响应查询:

?- p(0)
Yes.
?- p(1)
Yes.
?- p(0),p(1).
No. 

我试图翻译逻辑表达式:

(p(0) or p(1)) and not (p(0) and p(1)) <=>
(not p(0) -> p(1)) and (p(0) -> not p(1)) <=>
p(0) <-> not p(1) 

使用 Clarks 补全(这表明每个定义理论都可以通过给出 if-halves 放入一个逻辑程序中),我可以获得:

p(0) :- not p(1). 

不幸的是,这个由此产生的理论只是合理的(它不会推导出错误的信息),而不是完整的(例如:p(1) 无法推导出)。这是克拉克定理的结果。

有人知道是否有更好的解决方案吗?谢谢!

【问题讨论】:

您的语言的语义是什么?是“不矛盾”吗? “可证明”?当你说p(0)时,你是问系统,还是告诉系统?是否所有未指定的东西都被假定为假(就像在 Prolog 的封闭世界中一样)或者它可以具有任何价值? 我使用的语义是Clark´s Completion。查询的逻辑含义是:“是可证明的”,所以?- p(0)相当于问p(0)是否可以从理论上证明。 【参考方案1】:

这很微妙,但实际上你错了。你不应该期望 p(0) 是必然的。蕴含要求 p(0) 在该理论的所有模型中都为真。但是这个理论有两个模型p(1)和p(0)。

这在文学作品中得到了广泛的研究。正如您正确指出的那样,克拉克的完成无法处理这些情况。更糟糕的是,SLDNF 陷入无限递归

p(0) :- not p(1). 
p(1) :- not p(0).

对于你的理论的确定从句,哪个是最合适的翻译。

我会为您提供有关不同语义定义的指导,但如果您想要一个快速实用的解决方案,我建议您切换到答案集编程。

这是我最喜欢的求解器的链接(该指南也很好,而且是独立的): http://www.cs.uni-potsdam.de/clasp/

享受吧!

【讨论】:

谢谢!但我不认为我错了,你认为我到底错在哪里?其实一周前我就决定改用 ASP 了,太好了! 我指的是期望 p(1) 和 p(0) 是您的理论的结果。这仅在“勇敢”语义下才是正确的,而不是在 Prolog 的“怀疑”自然语义下。 谢谢,我想我现在明白了。 p(0) 和 p(1) 不是我的理论的结果,因为它们并非在所有模型中都是正确的(持怀疑态度)。相反,它们仅在某些模型中是正确的(勇敢)。【参考方案2】:

在Prolog中,如果p(0)p(1)都成功,那么p(0),p(1)不能失败。

这意味着您必须构建自己的小型解释器,设计方法来表示您的目标和规则,并在其中提出您的问题,例如

?- is_true( (p(0),p(1)) ).

【讨论】:

我明白你在说什么,但为什么它成立? 我的意思是它是一个查询,在一个假设的评估器/谓词is_true 中,它将实现您的语义。它会回复,例如YesNo。我认为其他人在这里更具体地回答了您的问题;也尝试询问他们(在答案下方添加评论,以便答案的作者收到)。 :)【参考方案3】:

逻辑上,已经在命题逻辑中,它不遵循 (A v B) |- A 并且两者都没有(A v B)|- B。情况也没有改变 如果您添加〜(A&B)。

现在的问题是 clark 补全或其他东西是否可以添加更多默认值 信息,所以我们最终得到 T |- A 和 T |- B。但是按照逻辑我们 然后会有 T |- A&B。

所以我猜在正常情况下这是不可能的, 你想做什么。

再见

P.S.:不正常的设置是例如使用轻信 结果关系而不是怀疑的结果关系。 怀疑的后果关系是:

T |- A iff forall M (if M |- T then M |- A)

轻信的后果关系是:

T |~ A iff exists M (M |- T and M |- A)

可以有 T |~ A 和 T |~ B,但不能有 T |~ A&B,你的 (A v B) & ~(A & B) 没有任何默认信息已经是这样 一个理论。

P.S.S.:有一些方法可以滥用 Prolog 系统来轻信 推理,尽管 Prologs 的基础是怀疑推理。这 诀窍是使用恒等式 T |~ A = ~(T |- ~A)。

但在将其应用于您的示例之前,必须先解决 Prolog 中表示析取的问题。一些析取可以 通过以下身份和hypothetical reasoning实现:

(A v B -> C) == (A -> C) & (B -> C)

【讨论】:

我能理解的唯一意义是,如果我们将 OP 给出的响应解释为“不矛盾”或“一致”。因此,声称A 与知识K(A v B) ^ ~(A ^ B) 一致,声称B 也是如此,但不是同时声称A ^ B 。但 Prolog 的语义是“蕴含”或者“可证明”,而不是“一致”。 内涵和一致性是相关的。 T |- A 等价于 T,~A 不一致。但你是对的,在非正常设置中,我们可以有 T |- A 和 T |- B 但不是 T |- A&B。查看新的编辑。【参考方案4】:

如果您的“目标”逻辑中允许引入命名术语,您可以实现一个虚拟 t/0:

t :- p(0), p(1), !, fail.
t :- p(0).
t :- p(1).

如果我们两者都有

p(0).
p(1).

t/0 会失败。

【讨论】:

以上是关于prolog 一阶逻辑的主要内容,如果未能解决你的问题,请参考以下文章

Prolog 中如何表示谓词逻辑?

Prolog中的“逻辑纯度”是啥意思?

如何区别ban 逻辑 prolog逻辑

Prolog 逻辑拼图不起作用?

Prolog 否定和逻辑否定

一阶逻辑基本概念