0

入力リストが与えられたら、新しいリストを作成したいのですが、次のようにする必要があります。

  • 新しいリストの前に常に h を追加します
  • 入力リストの連続する 2 つの要素をすべて比較し、等しい場合は新しいリストに y を追加し、そうでない場合は x を追加します。

例:

?- control([a,a,b,b],R).
R = [h,y,x,y].

これまでの私のコードは次のとおりです。

control([H,H|T],K,[K,0|T2]):- control([H|T],[K,0],T2).
control([H,J|T],K,[K,1|T2]):- control([J|T],[K,1],T2).
control([H],G,G).

しかし、正しく動作していません。

?-  control([a,a,b,b],[h],L).
L = [[h], 0, [[h], 0], 1, [[[h], 0], 1], 0, [[[...]|...], 1], 0] ;
L = [[h], 0, [[h], 0], 1, [[[h], 0], 1], 1, [[[...]|...], 1], 1] ;
L = [[h], 1, [[h], 1], 1, [[[h], 1], 1], 0, [[[...]|...], 1], 0] ;
L = [[h], 1, [[h], 1], 1, [[[h], 1], 1], 1, [[[...]|...], 1], 1] ;
false.

どうすれば正しくできますか?

4

2 に答える 2

4

これはあなたが取ることができる別の方法です...に基づいて定義します: if_/3 (=)/3 list_hxys/2

list_hxys([E|Es], [h|Xs]) :-
   list_hxys_prev(Es, Xs, E).

list_hxys_prev([], [], _).
list_hxys_prev([E|Es], [X|Xs], E0) :-
   if_(E = E0, X = y, X = x),
   list_hxys_prev(Es, Xs, E).

SICStus Prolog 4.3.2 を使用したクエリの例:

| ?- list_hxys([a,a,b,b], Xs).         % (query given by the OP)
Xs = [h,y,x,y] ? ;                     % expected answer
no
| ?- list_hxys(As, [h,y,x,y]).         % works the "other" way around, too
As = [_A,_A,_B,_B],
prolog:dif(_B,_A) ? ;                  % answer with residual goal dif/2
no
于 2016-05-23T18:33:25.937 に答える