Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.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
Prolog cut行为不';我不明白_Prolog_Backtracking_Backtrace_Prolog Cut - Fatal编程技术网

Prolog cut行为不';我不明白

Prolog cut行为不';我不明白,prolog,backtracking,backtrace,prolog-cut,Prolog,Backtracking,Backtrace,Prolog Cut,我(对我来说)在某个特定的伤口上遇到了非常奇怪的行为。从我的理解来看,一旦执行通过一个切口,它就不能回溯到切口上方。但这正是这段代码所做的。有人能解释一下为什么会这样吗 代码如下: example([],[]). example([X,Y,Z|Tail],[Z|NewTail]) :- X < Y, example(Tail,NewTail). example([X,Y,Z|Tail],[X|NewTail]) :- Y < Z, example(

我(对我来说)在某个特定的伤口上遇到了非常奇怪的行为。从我的理解来看,一旦执行通过一个切口,它就不能回溯到切口上方。但这正是这段代码所做的。有人能解释一下为什么会这样吗

代码如下:

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([],[]).
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 = [3, 6] ;
L = [3, 4]
为什么会这样?它从字面上跳回到削减,开始执行第4条,为什么

如果我将切割部分移至第2条,为什么要执行第4条:

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).

为甚么第2条的削减是有效的,而第3条却没有?这对我来说毫无意义。

最后一个代码段的切入点可以工作两次,从而阻止了预期的替代方案:

?- leash(-all).
true.

?- trace.
true.

[trace]  ?- example([1,3,2,4,5,6],L).
   Call: (6) example([1, 3, 2, 4, 5, 6], _G6183)
   Call: (7) 1<3
   Exit: (7) 1<3
   Call: (7) example([4, 5, 6], _G6267)
   Call: (8) 4<5
   Exit: (8) 4<5
   Call: (8) example([], _G6270)
   Exit: (8) example([], [])
   Exit: (7) example([4, 5, 6], [6])
   Exit: (6) example([1, 3, 2, 4, 5, 6], [2, 6])
L = [2, 6].
?-皮带(-all)。
对。
-跟踪。
对。
[trace]?-示例([1,3,2,4,5,6],L)。
调用:(6)示例([1,3,2,4,5,6],_G6183)
电话:(7)1
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].
?- leash(-all).
true.

?- trace.
true.

[trace]  ?- example([1,3,2,4,5,6],L).
   Call: (6) example([1, 3, 2, 4, 5, 6], _G6183)
   Call: (7) 1<3
   Exit: (7) 1<3
   Call: (7) example([4, 5, 6], _G6267)
   Call: (8) 4<5
   Exit: (8) 4<5
   Call: (8) example([], _G6270)
   Exit: (8) example([], [])
   Exit: (7) example([4, 5, 6], [6])
   Exit: (6) example([1, 3, 2, 4, 5, 6], [2, 6])
L = [2, 6].