不知道能不能用Prolog做解析推理

Li *_*uan 3 math logic prolog

我对数理逻辑很陌生,最近正在尝试学习 Prolog,我想知道是否可以使用 Prolog 进行解析推理,例如,进行以下推理:

  1. 知道 ?x.(sheep(x)?eatgrass(x))
  2. 知道 ?x.(deadsheep(x)?¬eatgrass(x))
  3. 证明 ?x.(deadsheep(x)?¬sheep(x))

我试图意识到的是编写如下代码:

eatgrass(X) :- sheep(X).
false       :- deadsheep(X), eatgrass(X).
sheep(X).
deadsheep(X).
Run Code Online (Sandbox Code Playgroud)

并在查询时获得查询答案“假”

?- sheep(a),deadsheep(a).
Run Code Online (Sandbox Code Playgroud)

似乎在 Prolog 中我无法意识到类似第 2 行的内容:

false :- deadsheep(X), eatgrass(X).
Run Code Online (Sandbox Code Playgroud)

所以我想知道是否有办法像 Prolog 中提到的那样进行推理,谢谢!

Dav*_*fer 5

false :- deadsheep(X), eatgrass(X).
Run Code Online (Sandbox Code Playgroud)

完整性约束

虽然在更基于解析的定理证明器中可利用,但您不能在 Prolog 中使用它,因为它不是一个子句(既不是一个确定的子句,又名。Horn 子句,即在正文中没有否定,也不是一般子句,即带有 'negation as失败'在体内)。

(例如,1981 年的 Markgraf Karl Resolution Theorem Prover 确实可以处理完整性约束)

完整性约束可以在答案集编程系统中找到,它以与 Prolog 完全不同的方式找到逻辑程序的解决方案:不是通过 SLDNF 证明搜索,而是通过查找作为程序模型的基本事实集(即,使每个陈述程序的真实)。

你编程

sheep(X), deadsheep(X). 没有意义(因为它说“一切都是羊”和“一切都是死羊”),但是如果您将其更改为:

eatgrass(X) :- sheep(X).
false       :- deadsheep(X), eatgrass(X).
sheep(flopsy).
deadsheep(flopsy).
Run Code Online (Sandbox Code Playgroud)

那么这个程序是询问的方式:有一组地面原子(在逻辑意义上)的基础上eatgrass/1sheep/1deadsheep/1这是程序,即用于该计划的每一个语句将变成真正的模型?

嗯,没有,因为我们需要

sheep(flopsy).
deadsheep(flopsy).
Run Code Online (Sandbox Code Playgroud)

是真的,所以显然也eatgrass(flopsy)需要是真的,这违反了完整性约束。

您可以做的是将完整性约束作为查询的一部分进行测试:

程序:

eatgrass(X) :- sheep(X).
sheep(flopsy).
deadsheep(flopsy).
Run Code Online (Sandbox Code Playgroud)

问题:是否有一只羊 X 使得 X 既不吃草又不死?

?- sheep(X),\+ (deadsheep(X),eatgrass(X)).
Run Code Online (Sandbox Code Playgroud)

在这种情况下,没有。

  • @LiDanyuan 为什么没有完整性约束?因为它们不符合Prolog的处理原则,Prolog非常“目标导向”,并且强烈偏向“编程”而不是“定理证明”。您需要某种总监督者,只要在证据搜索过程中新事实被标记为真(但不能同时为真),该监督器就会被触发。这是相当昂贵的,并且使得“编程”部分的吸引力大大降低。 (3认同)
  • @LiDanyuan 我看到维基百科将“FALSE <- BODY”子句也分类为 Horn。我宁愿不这样做。“FALSE <- BODY”是一种令人困惑的表达方式,表示您的查询(或目标)是“BODY”,或者换句话说,在经典逻辑的高度理想主义设置中,如果您将“FALSE <- BODY”添加到你的程序,你可以推导出一个逻辑矛盾(通过解析反驳),因此BODY一定是真的。但没有人这么认为... (3认同)
  • 但是,是的,显然这属于“Horn Clause”:[谓词逻辑作为编程语言的语义](http://www.doc.ic.ac.uk/~rak/papers/kowalski-van_emden.pdf) (2认同)