5

我试图找到一种方法将以下一阶逻辑表达式放入 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) 无法推导出)。这是克拉克定理的结果。

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

4

4 回答 4

3

在 Prolog 中,如果两者都p(0)成功p(1),则p(0),p(1)不能失败。

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

?- is_true( (p(0),p(1)) ).
于 2012-09-28T20:46:50.723 回答
3

这很微妙,但实际上你错了。你不应该期望 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/

享受!

于 2012-10-01T15:54:16.697 回答
2

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

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

那么如果我们两者都有

p(0).
p(1).

t/0 将失败。

于 2012-09-28T14:14:26.360 回答
2

从逻辑上讲,已经在命题逻辑中,它不遵循 (A v B) |- A,也不遵循 (A v B) |- B。如果添加 ~(A & B),情况也不会改变。

现在的问题是 clark 补全或其他东西是否可以添加更多默认信息,以便我们最终拥有 T |- A 和 T |- B。但按逻辑我们将拥有 T |- A&B。

所以我想在正常情况下不可能做你想做的事情。

再见

PS:非正常设置例如使用轻信后果关系而不是怀疑后果关系。怀疑后果关系是:

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) 没有任何默认信息已经是这样的理论。

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

但在将其应用于您的示例之前,必须解决在 Prolog 中表示析取的问题。一些析取可以通过以下恒等式和假设推理来实现:

(A v B -> C) == (A -> C) & (B -> C)
于 2012-09-29T18:20:13.880 回答