2016-05-22 30 views
0

Wenn eine Eingabeliste gegeben, ich möchte eine neue Liste erstellen und es sollte:Prolog Vergleichen Elemente der Liste

  • Immer h vor der neuen Liste hinzufügen
  • Vergleichen Sie alle zwei aufeinanderfolgende Elemente der Eingabeliste, und, wenn sie gleich sind, an die neue Liste y angehängt, wenn nicht, anhängen x.

Beispiel:

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

Hier ist mein Code so weit:

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). 

Aber es ist nicht richtig funktioniert.

?- 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. 

Wie kann ich es richtig machen?

+2

Bitte Beispiele geben, wie Sie erwarte, dass das funktioniert. – false

+2

Also tun Sie einfach so, als ob es funktioniert und zeigen Sie, wie Sie es benutzen würden. – false

+0

Jetzt habe ich einige Verbesserungen, hier ist mein neuer Code. Karama ([H, H | T], [0 | L]): - Karama ([H | T], L). Karama ([H, J | T], [1 | L]): - Karama ([J | T], L). Karama ([H], []). Init (A, Xs, [A | L]): - Karama (Xs, L). Jetzt gibt es mir ? - 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]; falsch. Aber ich möchte nur zuerst auftreten – mrnard

Antwort

0

Lassen Sie sie es brechen:

% 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). 

In beide Klauseln wir einen rekursiven Aufruf mit allen, aber dem ersten aufgegebenen Elemente machen und jeweils ein ‚x‘ hinzuzufügen, oder ‚y‘ zum Ergebnis.

Nun liegt es an Ihnen, den Basisfall zu definieren. Beachten Sie jedoch, dass abhängig davon, ob die Eingabelisten eine gerade oder ungerade Anzahl von Elementen haben, zwei Basisfälle erforderlich sind: einer für eine Liste mit einem einzelnen Element und einer für eine leere Liste.

4

Hier ist eine andere Art und Weise Sie nehmen könnte ... Basierend auf if_/3 und (=)/3 definieren 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). 

einige Abfragen Probe mit 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