Prolog-Abfrage: Wie wichtig ist das Hinzufügen für rekursive Abfragen?
Ich versuche, ein Prädikat zu schreiben, um das n-te Element einer Liste zu finden.
Anfangs habe ich so etwas geschrieben:
nth([X|_], 0, X).
nth([_|T],N,Z):- N > 0, nth(T, M, Z), N is M + 1.
Es funktioniert für Abfragen wie, nth([1, 2, 3, 4, 5], 0, X).
aber für Abfragen wie nth([1, 2, 3, 4, 5], N, 1).
, erhalte ich einen "Argument nicht ausreichend instanziierten Fehler", nachdem ich ";" nachdem ich die Antwort bekommen habe. Ich weiß, dass es in diesem Fall nur 1 Ans geben wird, aber der Vollständigkeit halber möchte ich wissen, warum.
Ich habe hier beim Stapelüberlauf gelesen , dass Folgendes eine bessere Lösung ist:
nth([X|_], 0, X) :- !.
nth([_|Y], N, Z) :- N > 0, M is N-1, nth(Y, M, Z).
Ich möchte verstehen, warum es in meiner Antwort M is N-1, nth(Y, M, Z).
einen Unterschied macht nth(T, M, Z), N is M + 1
.
PS: Ich denke, der Fragentitel kann verbessert werden, aber ich bin mir nicht sicher, wie. Wenn Sie Vorschläge haben, lassen Sie es mich bitte wissen!
Antworten
is/2
ist kein vollständiger Constraint-Solver. Also N is M + 1
und M is N - 1
sieh gleich aus, aber sie sind es nicht. Der erste ist nur erfolgreich, wenn M instanziiert ist, und der zweite, wenn N instanziiert ist. Haben Sie Ihre Lösung mit Indizes anderer Null ausprobiert? Sie werden nicht funktionieren. Sie können plus(1, M, N)
anstelle von beiden verwenden, um es zum Laufen zu bringen. Auch die Reihenfolge der Klauseln plus(1, M, N)
sollte vor dem rekursiven Aufruf von erfolgen nth
.
nth([X|_], 0, X).
nth([_|T],N,Z):- N > 0, plus(1, M, N), nth(T, M, Z).
Wenn N > 0, nth(T, M, Z), plus(1, M, N)
Ihre Klausel bestellt ist, versucht Ihr Programm nth(T, M, Z)
zuerst zu befriedigen und verursacht einen unbegründeten Fehler bei, N > 0
da M noch nicht instanziiert ist.
Auch funktioniert kein Programm im generativen Fall.