7

私は違いのリストがどれほど大きいかについて読んでいて、本からいくつかの例をテストしたいと思っていました。ただし、たとえば、append([1,2,3]、[4,5]、X)と同じ方法でリストを入力として渡すことはできないようです。ここで、X = [1,2,3、 4,5]。不思議なことに、私が調べた本でこれについて言及しているものはありません。

私はswiplでコードを実行していて、違いの追加述語をテストすることに興味があります。

dapp(A-B,B-C,A-C).

および「リストの最初の要素をローテーションする」述語:

drotate([H|T]-T1,R-S) :- dapp(T-T1,[H|L]-L,R-S).

任意のアイデア、swiplでこれらの述語をテストするにはどうすればよいですか?

4

2 に答える 2

7

試す:

dapp([1,2,3|X] - X,[4,5,6] - [],Y - []).
drotate([1,2,3|X] - X,Y - []).

Yは両方の述語の答えです。

于 2011-07-09T14:54:15.663 に答える
2

の定義は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-LZ = [1|L]Z1[1,2,3|Z]-Z[1,2,3,1|L]-LR[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
于 2012-01-31T20:52:31.770 に答える