2

特定のカットに関して、(私にとって)非常に奇妙な動作に遭遇しました。私が理解したことから、実行がカットを通過すると、カットの上に戻ることはできません。しかし、それはまさにこのコードが行うことです。誰かがなぜこれを行うのか説明できますか?

コードは次のとおりです。

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 では機能しないのはなぜですか? これは私には意味がありません。

4

1 に答える 1

2

最後のコード スニペットのカットは 2 回機能するため、予想される代替が妨げられます。

?- 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].
于 2013-04-23T07:16:51.017 に答える