2016-05-22 6 views
0

の要素を比較しますPrologは、いくつかの入力リストを与えられたとき、私は新しいリストを構築したいとそれが必要リスト

  • を常に
  • 新しいリストの前に時間を追加するごとに二つの連続する要素を比較します と等しい場合は、新しいリストに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. 

どのように修正できますか?結果に「X」または「Y」を追加し、それぞれ両方の句で

% Two elements being read are the same -> add y 
control([H,H|T],[y|R]) :- control([H|T],R). 

% Two elements being read are not the same -> add x 
control([H1,H2|T],[x|R]) :- H1 \== H2, control([H2|T],R). 

は、我々が最初にチェック要素が、全てで再帰呼び出しを行うと:

+2

を例にどのようにあなたを教えてくださいこれが動作することを期待してください。 – false

+2

だからちょうどそれが動作し、それを使用する方法を示すふりをする。 – false

+0

私はいくつかの改善がありました。ここに私の新しいコードがあります。 karama([H、H | T]、[0 | L]): - karama([H | T]、L) カラマ([H、J | T]、[1 | L]): - カラマ([J | T]、L)。 カラマ([H]、[])。 init(A、Xs、[A | L]): - karama(Xs、L)。 これは私に ?init(1、[1,1,0,0]、M)を与えます。 M = [1,0,1,0]; M = [1,0,1,1]; M = [1,1,1,0]; M = [1,1,1,1]; false。 しかし、私は最初の1つが発生したい – mrnard

答えて

0

のは、それを打破してみましょう。

基本ケースを定義するのはあなた次第ですが、入力リストの要素が均等であるか不揃いであるかによって、1つの要素を持つリストの場合と1つの場合の2つの基本ケースが必要になります空のリスト

4

ここにあなたが取ることができる別の方法... はif_/3に基づきだと(=)/3list_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プロローグ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 
関連する問題