prolog: rekursion mit liste

striker159

Lt. Junior Grade
Registriert
Dez. 2008
Beiträge
328
hi
es geht um folgendes.
ich habe eine funktion do(X,Y).
nun möchte ich eine funktion do2 definieren mit einer liste (größe >=2)als parameter, die das do(X,Y) mit dem ersten eintrag der liste, und jeweils allen anderen einträgen der liste aufruft.

also wenn die liste [a,b,c,d] ist , soll do2([a,b,c,d]) folgendes machen:
do(a,b) , do(a,c) , do(a,d).

mein problem in der rekursion ist hierbei, dass ich nicht weiß, wie ich zum nächsten element der liste komme, also zb von b nach c.

also mein ansatz wäre
do2(X,Y) :- do(X,Y).
und jetzt kommt halt das erwähnte problem, wenn die liste mehr als 2 elemente hat
do2([X,Y|R]) :- do2(X,Y) , do2(X,"erstes element von R","rest von R").

hat dafür jemand einen rat?
 
Du hast es doch schon, du hast es nur übersehen.

[Y|R] bedeutet: "Teile die Liste auf. Y beinhaltet das erste Element, R ist der Rest der Liste."
Beachte, dass R auch leer sein kann!

Code:
# Abbruchbedingung der Rekursion
# Wenn die Liste leer ist, ist der Ausdruck erfüllt (true) und damit hat es sich.
do2(X,[]).

# Rekursion
# Parameter: Ein Element und eine Liste.
# Die Liste wird aufgespaltet, Y enthält das erste Element. R enthält den Rest der Liste.
# Danach dann ganz gehabt: Erst die bekannte do-Methode mit den Parametern X und dem ersten Element der Liste (Y) aufrufen.
# Danach ruft er sich selber mit dem Parameter X und dem Rest der Liste auf.
do2(X,[Y|R]):-do(X,Y),do2(X,R).


Edit:
Bei Prolog empfiehlt es sich immer, zuerst zu überlegen, wie man eine Rekursion abbrechen kann. Die Abbruchbedingung stellt (fast) immer die erste Regel dar.

Edit 2:
War ein Fehler im Code, korrigiert.

Edit 3:
*seufz* Lesen müsste man können. Wenn du das erste Element erhalten willst, was ja X in deinem Fall darstellt, dann musst du das durch die ganze Rekursion durchreichen. Bei jedem Aufruf.
Also so was wie:
do2([]).
do2([X|R]):-do3(X,R).
do3(X,[]).
do3(X,[Y|R]):-do(X,Y),do3(X,R).
 
Zuletzt bearbeitet:
dankeschön

das der rest auch leer sein kann, habe ich nicht bedacht. jetzt funktioniert es so wie es soll :)
 
Zurück
Oben