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 ja

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


Anmelden zum Antworten