カットには2種類あります。グリーンカットとレッドカット。グリーン カットは、効率を向上させるためだけに挿入され、プログラムのセマンティクスを変更しません。一方、レッドカットはそうです。定義上、グリーン カットは問題を引き起こしません。
では、カットがなければ動作が変わる方法はありますか?
どれどれ; 最初の句が一致するためには、L1 は [] で単一化可能、L2 は L で単一化可能、L3 は L で単一化可能、つまり L2 は L3 で単一化可能である必要があります。
L1 が [] の場合、2 番目の句は一致しません。だからカットは何の効果もありません
L1 がインスタンス化されていない場合: この時点で L2 と L3 の長さがわかっている場合、それらは等しくなければなりません。そうでない場合、最初の節は一致しません。したがって、各ステップで L3 の長さが 1 ずつ減少し、終了する唯一の方法は L2=L3 を必要とするため、2 番目の句は一致しません。
L3 または L2 の長さが不明な場合: 2 番目の節が解を生成する可能性があるため、問題が発生します。
それはそう:
3 ?- append2(L1,L2,[1,2,3]).
L1 = [],
L2 = [1, 2, 3].
4 ?- append2(L1,[1,2,3],L3).
L1 = [],
L3 = [1, 2, 3].
5 ?- append2(L1,L2,L3).
L1 = [],
L2 = L3.
6 ?- append2(L1,[E1,E2],L3).
L1 = [],
L2 = [E1, E2].
7 ?- append2(L1,L2,[E1,E2]).
L1 = [],
L2 = [E1, E2].
私たちが期待している間:
8 ?- append(L1,L2,[1,2,3]).
L1 = [],
L2 = [1, 2, 3] ;
L1 = [1],
L2 = [2, 3] ;
L1 = [1, 2],
L2 = [3] ;
L1 = [1, 2, 3],
L2 = [] ;
false.
9 ?- append(L1,[1,2,3],L3).
L1 = [],
L3 = [1, 2, 3] ;
L1 = [_G24],
L3 = [_G24, 1, 2, 3] ;
L1 = [_G24, _G30],
L3 = [_G24, _G30, 1, 2, 3] ;
L1 = [_G24, _G30, _G36],
L3 = [_G24, _G30, _G36, 1, 2, 3] ;
L1 = [_G24, _G30, _G36, _G42],
L3 = [_G24, _G30, _G36, _G42, 1, 2, 3] ;
...
10 ?- append(L1,L2,L3).
L1 = [],
L2 = L3 ;
L1 = [_G22],
L3 = [_G22|L2] ;
L1 = [_G22, _G28],
L3 = [_G22, _G28|L2] ;
....
11 ?- append(L1,[E1,E2],L3).
L1 = [],
L3 = [E1, E2] ;
L1 = [_G78],
L3 = [_G78, E1, E2] ;
L1 = [_G78, _G84],
L3 = [_G78, _G84, E1, E2] ;
L1 = [_G78, _G84, _G90],
L3 = [_G78, _G84, _G90, E1, E2] ;
...
12 ?- append(L1,L2,[E1,E2]).
L1 = [],
L2 = [E1, E2] ;
L1 = [E1],
L2 = [E2] ;
L1 = [E1, E2],
L2 = [] ;
false.