の定義はdrotate
単純化できます。
dapp( A-B, B-C, A-C).
drotate( [H|T]-T1, R-S) :- % (* dapp( T-T1, [H|L]-L, R-S).
%% dapp( A-B , B -C, A-C).
%% use the definition of dapp: *)
T = R, T1 = [H|L], L = S.
言い換えれば、単純に、
drotate( [H|R]-[H|L], R-L).
現在、差分リストは通常、ペアとして書き出されA-B
ます。したがって、への呼び出しは、変数の出力を確認するdrotate
ことを目的としている可能性があります。しかし、この呼び出しを最後の定義と一致させると、次のようになります。つまり、呼び出しの前にインスタンス化されていない可能性のあるlogvarがインスタンス化され、実際にはオープンエンドリストの最後に追加されてになります。リストと照合することにより、新しく拡大されたリストの2番目の要素を指すだけです。drotate( [1,2,3|Z]-Z, R-L)
R-L
Z = [1|L]
Z
1
[1,2,3|Z]-Z
[1,2,3,1|L]-L
R
[H|R]
?- drotate( [1,2,3|Z]-Z, R-L).
Z = [1|_G345]
R = [2, 3, 1|_G345]
L = _G345
Yes
しかし、それは真に循環的なデータで呼び出すこともできますA-A = [1,2,3|Z]-Z, drotate( A-Z, R-L)
:
?- A-A = [1,2,3|Z]-Z, drotate( A-Z, R-L).
A = [1, 2, 3, 1, 2, 3, 1, 2, 3|...]
Z = [1, 2, 3, 1, 2, 3, 1, 2, 3|...]
R = [2, 3, 1, 2, 3, 1, 2, 3, 1|...]
L = [2, 3, 1, 2, 3, 1, 2, 3, 1|...]
Yes