Prolog: Wann ist false auch eine Lösung?
Hallo,
manchmal gibt mir Prolog false und manchmal nicht. Ich hatte es so gelernt: ,,ist es nicht definiert dann ist es für Prolog false". Aber dann habe ich diesen Fall:
p(a,b).
p(a,c).
p(d,e).
p(d,f).
p(g,f).
q(h).
q(i).
q(j).
r(h, a).
r(i, d).
r(j, g).
s(X,Y,Z):- q(X), r(X, Y), p(Y, Z).
Das Query dazu ?- s(X,Y,f). Ersetzt man X mit h erhält man ?-r(h,Y),p(Y,f). Wenn ich jetzt Y ersetze mit a dann hätte ich erwartet, dass der mir false rausgibt da p(a,f) nicht definiert ist, aber er "failed" und sucht weiter. Die Lösungen sind X=i, Y=d und X=j, Y=g. Würde man als Query ?- p(a,f). eingeben erhält man false.
Ein anderes Beispiel wo false rauskommt:
append ( [] , L , L ) .
append ( [H|T1] , L2 , [H|T3]) :- append (T1,L2 ,T3)
Mit dem Query ?-append(X,X,[ ]). Lösungen sind X=[ ];false.
Bei beiden Beispielen hatte ich intuitiv die richtigen Lösungen raus. Nur würde ich jetzt gerne wissen wo der Unterschied besteht..
Schonmal vielen Dank:))
1 Antwort
Kann es sein, dass du false und fail immer als false ansiehst?
In Prolog gibt es einen Unterschied zwischen dem Prüfen auf "false" und dem "fail".
- "false" bedeutet, dass das Programm explizit festgestellt hat, dass die Anfrage nicht erfüllt werden kann. Dies kann beispielsweise der Fall sein, wenn eine Regel explizit definiert ist und die Anfrage nicht erfüllt werden kann.
- "fail" bedeutet, dass Prolog versucht hat, eine Lösung zu finden, aber keine weiteren passenden Ergebnisse gefunden hat. Dies bedeutet jedoch nicht unbedingt, dass die Anfrage grundsätzlich nicht erfüllbar ist.
Erstes Beispiel: Wenn Prolog keine passende Lösung findet, wird "fail" zurückgegeben.
Zweites Beispiel: Hier wird die Regel rekursiv aufgerufen, um die Liste zu durchlaufen. Da Prolog keine passende Liste finden kann, die sich an sich selbst anhängt und [] ergibt, wird "false" zurückgegeben.
Wenn er im ersten Bsp beide Lösungen gefunden hat sollte der doch auch noch ausgeben false? Da er wie in Bsp 2 keine weiteren Belegungen finden kann. Aber das tut der nicht. Wo besteht da der Unterschied?