Frage zu Prolog und Listen
-
Hi,
folgende Frage.
In Prolog kann man ja Listen in den head und den body aufteilen.
foo( [ Head | Body ] ).
Jetzt ist die Liste aufgeteilt.
Wenn man jetzt testen möchte, ob das erste Element einer Liste gleich
X ist, testet man.ist_element( X, [ X | Body ] ).
Soweit verstehe ich alles.
Wenn man jetzt aber ein element zur Liste hinzufügen möchte macht man jaEin Element X als neuen Kopf der Liste L hinzufügen: fuege_hinzu( X, L, [ X |L ]).
Ist eg ganz logisch, dass X jetzt der neue Kopf und L der neue Body ist.
Aber in der Funktion wo man testet ob X Element von der Liste ist, wurde
X nur verglichen, in der hinzufügen Funktion hinzugefügt.
Woher weiß der Compiler wo er hinzufügen, also einen neuen Kopf bestimmen,
oder den alten Kopf abhacken soll?
-
Probier doch mal ist_element(a, L) aus, wobei L eine Variabel sein sollte. Du wirst dann sehen, dass auch dein ist_element sehr wohl zur Liste hinzufügt. Nur wenn L einen festen Wert hat, eine bestimmte Liste ist, wird das erste Element überprüft.
Bei der zweiten Regel, fuege_hinzu, erzeugst du aus X und L eine neue Liste [X|L]. Aber auch hier bekommst du das Verhalten von ist_element, wenn du die Ergebnisliste vorgibst:?- fuege_hinzu(a, _, [b]).
fail.?- fuege_hinzu(a, _, [a]).
true.Du siehst also, es kommt einzig und alleine darauf an, was du hineinsteckst. Denn Prolog merkt überhaupt nicht, was du für Sachen von ihm willst. Es unifiziert einfach und das war's.
-
Also zusammengefasst.
Folgendes
foo( Element, [ Element | Arg1 ] ).
rufe ich so auf.
foo( element, [ eins, zwei ] ).
Es wird false ausgegeben, weil das erste Element der gegeben Liste nicht element
heißt.foo( element, X ).
Jetzt wird X eine Liste mit dem Element element als Kopf, weil die Liste nicht gegeben war, sondern eine Variable war.