特定のカットに関して、(私にとって)非常に奇妙な動作に遭遇しました。私が理解したことから、実行がカットを通過すると、カットの上に戻ることはできません。しかし、それはまさにこのコードが行うことです。誰かがなぜこれを行うのか説明できますか?
コードは次のとおりです。
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].
3 番目の節のカットを通過すると、トレースを戻すことはできなくなります。
代わりに以下を返します。
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).
以下のみを生成します。
L = [2, 6].
節 2 ではカットが機能するのに、節 3 では機能しないのはなぜですか? これは私には意味がありません。