Math 我想知道是否可以使用Prolog进行解析推理
我对数理逻辑非常陌生,最近我正在尝试学习Prolog,我想知道我是否可以使用Prolog进行解析推理,例如,进行以下推理:Math 我想知道是否可以使用Prolog进行解析推理,math,prolog,logic,Math,Prolog,Logic,我对数理逻辑非常陌生,最近我正在尝试学习Prolog,我想知道我是否可以使用Prolog进行解析推理,例如,进行以下推理: 知道∀x、 (绵羊(x)→食草(x)) 知道∀x、 (十)→-食草(x)) 证明∀x、 (十)→绵羊(x)) 我试图实现的是,编写如下代码: eatgrass(X):-绵羊(X)。 错误:-死羊(X)、食草(X)。 绵羊(X)。 死羊(X)。 并在查询时获取查询答案“false” ?-羊(a),死羊(a)。 在序言中,我似乎无法实现第2行: false:-deadshe
eatgrass(X):-绵羊(X)。
错误:-死羊(X)、食草(X)。
绵羊(X)。
死羊(X)。
并在查询时获取查询答案“false”
?-羊(a),死羊(a)。
在序言中,我似乎无法实现第2行:
false:-deadsheep(X)、eatglass(X)。
因此,我想知道是否有一种方法可以像序言中提到的那样进行推理,谢谢 false:-deadsheep(X)、eatglass(X)。
是一个完整性约束
虽然可以在基于分辨率的定理证明程序中使用,但在Prolog中不能使用它,因为它不是一个子句(既不是一个确定子句,也不是一个Horn子句,即主体中没有否定,也不是一个一般子句,即主体中有“否定为失败”)
(例如,1981年的Markgraf-Karl解析定理证明者确实可以处理完整性约束)
完整性约束可以在应答集编程系统中找到,该系统以与Prolog完全不同的方式找到逻辑程序的解决方案:不是通过SLDNF证明搜索,而是通过找到作为程序模型的基本事实集(即,使程序的每一条语句都为真)
你用什么编程
sheep(X),deadsheep(X)。
没有意义(因为它说“一切都是羊”和“一切都是死羊”),但如果您将此更改为:
eatgrass(X):-绵羊(X)。
错误:-死羊(X)、食草(X)。
绵羊(flopsy)。
死羊(flopsy)。
然后这个程序是一种提问的方式:是否有一组基于eatgrass/1
,sheep/1
,deadsheep/1
的基本原子(在逻辑意义上)是程序的模型,即程序的每一条语句都是真的
没有,因为我们需要
sheep(flopsy)。
死羊(flopsy)。
要实现这一点,显然,eatglass(flopsy)
也需要实现,这违反了完整性约束
您可以做的是将完整性约束作为查询的一部分进行测试:
节目:
eatgrass(X):-绵羊(X)。
绵羊(flopsy)。
死羊(flopsy)。
问:是否有一只羊X既不吃草也不死亡
?-绵羊(X),\+(死羊(X),食草动物(X))。
在本例中,不。正如@David Tonhofer所建议的,完整性约束可以在答案集编程系统中找到,我发现这是解决我的问题的一个很好的工具,因此我将示例代码放在这里,以防有人需要类似的代码:
eatgrass(X) :- sheep(X).
:- deadsheep(X), eatgrass(X).
sheep(shawn).
deadsheep(shawn).
第二行是完整性约束,可以在clingo中支持,如果您使用运行此程序,clingo将告诉您这是不可满足的,这表明推理是正确的。@LiDanyuan为什么没有完整性约束?因为它们不符合Prolog的处理原则。Prolog的处理原则非常“目标导向”,并且强烈倾向于“编程”而不是“定理证明”。您将需要某种类型的总监督员,在证据搜索过程中,当新的事实被标记为“真”而不能同时为“真”时,该监督员就会被触发。这相当昂贵,使“编程”部分的吸引力大大降低。@李丹源我看到维基百科将
分类为FALSE,但是的,显然这属于“Horn子句”:缺少括号,我认为应该是sheep(X),\+((deadsheep(X),eatgrass(X))。
@lambda.xy.X:只是一个空格。。。