关于特定剪辑,我遇到了非常奇怪的行为(对我来说)。据我了解,一旦执行通过切割,它就不能回溯到它上面。但这正是这段代码所做的。有人可以解释为什么会这样吗?
这是代码:
example([],[]).
example([X,Y,Z|Tail],[Z|NewTail]) :-
X < Y,
example(Tail,NewTail).
example([X,Y,Z|Tail],[X|NewTail]) :-
Y < Z,
example(Tail,NewTail).
example([X,Y,Z|Tail],[Y|NewTail]) :-
X < Z,
example(Tail,NewTail).
现在没有削减,这个特定输入的输出如下:
example([1,3,2,4,5,6],L).
L = [2, 6] ;
L = [2, 4] ;
L = [2, 5] ;
L = [3, 6] ;
L = [3, 4] ;
L = [3, 5].
现在,如果我添加以下剪辑:
example([],[]).
example([X,Y,Z|Tail],[Z|NewTail]) :-
X < Y,
example(Tail,NewTail).
example([X,Y,Z|Tail],[X|NewTail]) :-
Y < Z,
!, <---- cut here
example(Tail,NewTail).
example([X,Y,Z|Tail],[Y|NewTail]) :-
X < Z,
example(Tail,NewTail).
我希望它会回来
L = [2,6] ;
L - [2,4].
一旦它通过了第三条的删减,它就不能再回溯了。
相反,它返回:
L = [2, 6] ;
L = [2, 4] ;
L = [3, 6] ;
L = [3, 4]
为什么会这样?它从字面上跳回剪辑并开始执行第 4 条,为什么?
为什么它执行第 4 条,如果我将切割移至第 2 条:
example([],[]).
example([X,Y,Z|Tail],[Z|NewTail]) :-
X < Y,
!, <---- cut here
example(Tail,NewTail).
example([X,Y,Z|Tail],[X|NewTail]) :-
Y < Z,
example(Tail,NewTail).
example([X,Y,Z|Tail],[Y|NewTail]) :-
X < Z,
example(Tail,NewTail).
它只产生:
L = [2, 6].
为什么削减在第 2 条中有效,但在第 3 条中无效?这对我来说毫无意义。