Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Math 我想知道是否可以使用Prolog进行解析推理_Math_Prolog_Logic - Fatal编程技术网

Math 我想知道是否可以使用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

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

  • 知道∀x、 (绵羊(x)→食草(x))
  • 知道∀x、 (十)→-食草(x))
  • 证明∀x、 (十)→绵羊(x))
  • 我试图实现的是,编写如下代码:

    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:只是一个空格。。。