Prolog 序言-红色切割和绿色切割之间的差异

Prolog 序言-红色切割和绿色切割之间的差异,prolog,prolog-cut,Prolog,Prolog Cut,我开始学习prolog,想把整个过程弄清楚。 我读过“绿色切割不会改变程序的声明性含义,而红色切割会”。但是,这个程序的意义并不是纯粹的声明性的(只是因为prolog实际上对所有选项都进行了回溯) 以下是一个例子: p(1). p(2) :- !. p(3). 据说这是绿色切割。但如果我运行这个: p(X), X =:= 3. 我会得到“真”而不是“切”,得到“假”而不是“切”。 那么,我错过了什么 提前感谢。切题非常直截了当,可以从操作上进行解释,如果您愿意,也可以从程序上进行解释。然而,

我开始学习prolog,想把整个过程弄清楚。 我读过“绿色切割不会改变程序的声明性含义,而红色切割会”。但是,这个程序的意义并不是纯粹的声明性的(只是因为prolog实际上对所有选项都进行了回溯)

以下是一个例子:

p(1).
p(2) :- !.
p(3).
据说这是绿色切割。但如果我运行这个:

p(X), X =:= 3.
我会得到“真”而不是“切”,得到“假”而不是“切”。 那么,我错过了什么


提前感谢。

切题非常直截了当,可以从操作上进行解释,如果您愿意,也可以从程序上进行解释。然而,由于有关逻辑编程和Prolog主题的大多数文献都偏向于Prolog程序的声明性含义(有充分的理由),因此在解释cut时出现了困难。纠正这种情况的一种尝试是根据效果对切割进行“着色”

这是我试图让一切变得更加清晰的尝试

切割的操作意义

  • From:“放弃自输入出现剪切的谓词以来创建的所有选择点。换句话说,提交到出现剪切的子句,并放弃当前子句中剪切左侧目标创建的选择点。”

  • From:“目标成功,并将序言提交给所有选择,因为父目标与[强调而非我的]中出现的子句的开头统一。尽管此定义完整而精确,但其后果和含义并不总是直观地清晰或明显。”

  • From:“[The cut]将选择点的堆栈修剪回调用在词汇上包含该cut的谓词时的位置。另一种说法是,该cut成功并将Prolog提交到自调用父目标以来所做的所有选择[再次强调,不是我的]”

  • 我建议你至少从上面引用的两本书中阅读有关切割及其用途的章节。这肯定会帮助你了解到底发生了什么

    一个常见的讨论是寻找解决方案与答案与证明之间的区别。我们(用户、程序员)通常需要答案。计算Prolog谓词的结果是解决方案。然而,Prolog实际上寻找的是证明

    以你为例。您拥有数据库
    p(1)。p(2)。第(3)页。
    。现在您想问Prolog,“是否有一个
    p(X)
    使得
    X=:=3

    ?- p(X), X =:= 3.
    X = 3.
    
    你得到了一个单一的解决方案,
    X=3
    。你也得到了问题的答案:是的,有这样一个
    p(X)
    ,X是3,显然没有更多的答案

    (尝试查询
    ?-p(X),X=:=2。
    。它的行为是否与原始查询相同?)

    通过跟踪查询,可以(以某种方式)查看您的证明树:

    ?- trace(p/1), trace(=:=).
    %         p/1: [call,redo,exit,fail]
    %         (=:=)/2: [call,redo,exit,fail]
    true.
    
    [debug]  ?- p(X), X =:= 3.
     T Call: (7) p(_G1004)
     T Exit: (7) p(1)
     T Call: (7) 1=:=3
     T Fail: (7) 1=:=3
     T Redo: (7) p(_G1004)
     T Exit: (7) p(2)
     T Call: (7) 2=:=3
     T Fail: (7) 2=:=3
     T Redo: (7) p(_G1004)
     T Exit: (7) p(3)
     T Call: (7) 3=:=3
     T Exit: (7) 3=:=3
    X = 3.
    
    基本上,
    p/1
    的每一个子句都是依次尝试的。前两个子句不会产生证明,因为连接的第二个子目标失败。每次从最后一个选择点(p/1的下一个子句)开始,都会继续搜索证明。最后一个子句可以被证明,并且您可以得到查询的解决方案和答案

    现在你在
    p/1
    的第二个从句的主体上做了一个切口:
    p(1).p(2):-!.p(3)。
    你告诉Prolog(从上面的定义3来看),“当对证明的搜索到达
    p/1
    的第二个从句时,将其论点与2统一起来的从句,将选择点的堆栈修剪到调用
    p/1
    时的位置。“调用
    p/1
    时,没有选择点。因此,当
    X=:=3
    失败时,对证明的搜索完成,连接不能被证明,没有解决方案,也没有答案

    (尝试查询
    ?-p(X),X=:=2。
    。它是否与您没有切割时的相同查询相同?)

    现在来看看颜色……在连词
    p(X),X=:=3的上下文中,
    ,这个切分去掉了一个解决方案和一个证明。你没有得到你期望的答案。这个切分是红色

    如果我们能告诉Prolog,我们的意思是切割是绿色或红色(或绿色或绿色或绿色或红色或蓝色),那就太好了,但是Prolog不允许我们这样做。颜色是程序的预期含义(程序员的意图)和切割的操作(程序)效果的结果


    但是,真的,试着找一本书,读一读关于切割的部分。甚至两本书。

    这不是绿色切割。你在哪里读到它是绿色切割?你在哪里读到绿色和红色切割的定义?都是从课堂论文中读到的:-\。你确定这不是绿色切割?如果不是定义,那是什么?谢谢。这本书,《序言的艺术》,第二版,[pp.194-5]说,“从程序中添加和删除绿色切割不会影响程序的含义。绿色切割只修剪不会导致新解决方案的计算路径。不是绿色的切割是红色的。“红色切割会修剪掉可能存在的解决方案。您的示例充当红色切割。如果您在“Prolog red green cut”上进行谷歌搜索,您将看到类似的定义。已经有许多答案解释了红色和绿色切割,请参见标签。