2010-12-08 22 views
0

Von einem alten Finale für meine Klasse:Prolog-Code Beispiel: Unification

Hier einiger Prolog-Code:

mystery(1, 1). 
mystery(N, F) :- 
    N1 is N-1, 
    mystery(N1,F1), 
    F is F1*N. 

Frage 1: Welcher Wert mit P in

vereinigt ist
mystery(3, P). 

Frage 2: Wenn ein Semikolon gedrückt wird, nachdem Prolog erzeugt und auf Mystery reagiert hat, meldet der Interpreter eventuell "ERROR: Out of local stack". Warum stirbt dies, und wie könnte man Mysterien verändern, um den Fehler zu vermeiden?


Frage 1: ich

P = 6 ? 

Frage 2: Wenn ich Semikolon drücken, um alle Antworten zu bekommen, habe ich eine aus lokalen Stack Fehler. Ich bin mir nicht sicher, was dieser Code zu erreichen versucht oder wie ich ihn beheben kann, damit ich den lokalen Stack nicht verliere. Irgendwelche Ideen?

+0

Haben Sie eine Frage zu "Frage 1"? Verstehst du, warum die Antwort 6 ist? – aschepler

+0

Ich verstehe, warum die Antwort 6 ist, aber ich weiß nicht jeden Schritt darüber, wie es dort angekommen ist. –

Antwort

2

Der aus Stapelfehler ist wahrscheinlich, weil, wenn Sie unten auf mystery(1, F1) erhalten, die für mehr Lösungen zu mystery(1, 1) und fragen löst, können Sie die nächste Klausel getroffen, die mystery(0, F1) nennt. An diesem Punkt versucht es, eine Lösung zu finden, aber die einzige Klausel, die Anrufe für mystery(-1, F1) entspricht, und das fordert mystery(-2, F1) und so weiter. Dies bedeutet, dass Übereinstimmungen erforderlich sind, bis entweder die erste Zahl auf 1 umgebrochen wird oder Sie einen Stapelüberlauf erhalten, da für jede ausstehende Übereinstimmung Stapelspeicherplatz benötigt wird.

0

@David Thornley hat bereits erklärt, warum die Suche nach mehr Antworten Ihren Stack in die Luft jagt. Man könnte das Problem beheben, indem ein Schnitt Operator:

mystery(1, F) :- !, F is 1. 
mystery(N, F) :- 
    N1 is N-1, 
    mystery(N1,F1), 
    F is F1*N. 

Der Schnitt hier macht so, dass, wenn das erste Argument 1 ist, die zweite Regel nicht angewendet werden kann.