prolog一阶逻辑

时间:2012-09-28 13:10:56

标签: prolog logic theorem

我正试图找到一种方法将以下一阶逻辑表达式放入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-half来放入逻辑程序中),我可以获得:

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

不幸的是,这个结果理论只是声音(它不会导出错误信息),但不完整(例如:p(1)无法导出)。这是克拉克斯定理的结果。

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

4 个答案:

答案 0 :(得分:3)

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

这意味着你必须建立自己的小翻译,设计出代表你的目标和规则的方法,并在其中询问 你的问题,比如

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

答案 1 :(得分:2)

这很微妙,但你确实错了。你不应该期望p(0)。蕴涵要求p(0)在理论的所有模型中都是正确的。但是这个理论有两个模型{p(1)}和{p(0)}。

这在文献中进行了广泛的研究。正如你正确指出的那样,Clark的完成无法处理这些情况。更糟糕的是,SLDNF属于

的无限递归
p(0) :- not p(1). 
p(1) :- not p(0).

对于理论的明确条款,哪个是最恰当的翻译。

我将饶有关于不同语义定义的指示,但如果你想要一个快速实用的解决方案,我建议你切换到答案集编程。

这是我最喜欢的解算器的链接(该指南也很好并且自包含): http://www.cs.uni-potsdam.de/clasp/

享受!

答案 2 :(得分:1)

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

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

然后如果我们两个都

p(0).
p(1).

t / 0将失败。

答案 3 :(得分:1)

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

现在问题是克拉克完成还是别的东西可以添加更多默认值 信息,这样我们终于有了T | - A和T | - B.但是按逻辑我们 然后会有T | - A&amp; 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&amp; B,你的 (A v B)&amp;没有任何默认信息的〜(A&amp; B)已经是这样的 一个理论。

P.S.S。:有一些方法可以滥用Prolog系统 推理,虽然Prologs的基础是持怀疑态度的推理。该 诀窍是使用身份T | ~A =〜(T | - ~A)。

但是在将一个人应用到你的例子之前,必须要解决这个问题 在Prolog中代表分离的问题。一些分离可以 通过以下身份和hypothetical reasoning来实现:

(A v B -> C) == (A -> C) & (B -> C)
相关问题