prolog一阶逻辑

prolog一阶逻辑,prolog,logic,theorem,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)) <=&

我试图找到一种方法,将以下一阶逻辑表达式放入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) 
不幸的是,由此产生的理论只是合理的(它不会得出错误的信息),但并不完整(例如:p(1)无法得出)。这是克拉克定理的结果


有人知道有没有更好的解决办法吗?谢谢

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

t :- p(0), p(1), !, fail.
t :- p(0).
t :- p(1).
那么如果我们两个都有

p(0).
p(1).
t/0将失败。

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

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

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

逻辑上,在命题逻辑中,它不遵循(A v B)|-A 这两种情况都没有改变 如果你加上(A&B)

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

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

再见

注意:例如,非正常设置将使用轻信的 结果关系,而不是怀疑的结果关系。 怀疑结果关系为:

T |- A iff forall M (if M |- T then M |- A)
T |~ A iff exists M (M |- T and M |- A)
轻信后果关系为:

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

附言:有一些方法可以滥用Prolog系统来欺骗轻信的人 推理,虽然序言基础是怀疑推理。这个 诀窍是使用标识T |~A=~(T |-~A)

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


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

这在文献中得到了广泛的研究。正如你正确指出的,克拉克的结案未能处理这些案件。更糟糕的是,SLDNF陷入了无限递归

p(0) :- not p(1). 
p(1) :- not p(0).
哪一种翻译最适合你理论中的定冠词

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

以下是指向我最喜欢的解算器的链接(该指南也很好,而且是独立的):


享受吧

你的语言的语义是什么?是否“没有矛盾”?“是可证明的”?当你说
p(0)
时,你是向系统询问,还是告诉系统?是否所有未指定的内容都假定为false(如Prolog的封闭世界中),或者它可以具有任何值?我使用的语义是。查询的逻辑意义是:“是可证明的”,因此
?-p(0)
相当于询问
p(0)
是否可以从理论上得到证明。我能理解的唯一意义是,如果我们将OP给出的回答解释为“不矛盾”或“一致”。因此,声称
A
(A v B)^~(A^B)
的知识
K
是一致的,声称
B
也是一致的,但不同时声称
A^B
。但Prolog的语义是“是蕴涵的”或“是可证明的”,而不是“一致的”。蕴涵和一致性是相关的。T |-A相当于T,~A不一致。但你是对的,在非正常设置中,我们可以有T |-a和T |-B,但不能有T |-a&B。请参阅新编辑。谢谢!但我不认为我错了,你认为我到底错了什么?事实上,我已经决定切换到ASP一周前,这是伟大的!我指的是期望p(1)和p(0)是你理论的结果。这只有在“勇敢”语义下才是正确的,而不是Prolog的“怀疑”自然语义。谢谢,我想我现在明白了。p(0)和p(1)不是我理论的结果,因为它们在所有模型中都不成立(怀疑论)。相反,它们只在某些模型中是正确的(勇敢)。我理解你的意思,但为什么它成立?我的意思是作为一个查询,在一个假设的计算器/谓词中
是正确的
,它将实现你的语义。它将回答,例如
。我认为其他人在这里更具体地回答了你的问题;也可以试着问他们(在答案下面放一条评论,这样答案的作者就会收到。)