【发布时间】: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)是否可以从理论上证明。