Prolog 序言-红色切割和绿色切割之间的差异
我开始学习prolog,想把整个过程弄清楚。 我读过“绿色切割不会改变程序的声明性含义,而红色切割会”。但是,这个程序的意义并不是纯粹的声明性的(只是因为prolog实际上对所有选项都进行了回溯) 以下是一个例子:Prolog 序言-红色切割和绿色切割之间的差异,prolog,prolog-cut,Prolog,Prolog Cut,我开始学习prolog,想把整个过程弄清楚。 我读过“绿色切割不会改变程序的声明性含义,而红色切割会”。但是,这个程序的意义并不是纯粹的声明性的(只是因为prolog实际上对所有选项都进行了回溯) 以下是一个例子: p(1). p(2) :- !. p(3). 据说这是绿色切割。但如果我运行这个: p(X), X =:= 3. 我会得到“真”而不是“切”,得到“假”而不是“切”。 那么,我错过了什么 提前感谢。切题非常直截了当,可以从操作上进行解释,如果您愿意,也可以从程序上进行解释。然而,
p(1).
p(2) :- !.
p(3).
据说这是绿色切割。但如果我运行这个:
p(X), X =:= 3.
我会得到“真”而不是“切”,得到“假”而不是“切”。
那么,我错过了什么
提前感谢。切题非常直截了当,可以从操作上进行解释,如果您愿意,也可以从程序上进行解释。然而,由于有关逻辑编程和Prolog主题的大多数文献都偏向于Prolog程序的声明性含义(有充分的理由),因此在解释cut时出现了困难。纠正这种情况的一种尝试是根据效果对切割进行“着色” 这是我试图让一切变得更加清晰的尝试 切割的操作意义
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”上进行谷歌搜索,您将看到类似的定义。已经有许多答案解释了红色和绿色切割,请参见标签。