Ich lese Programming in Prolog: Using the ISO Standard, aber ich habe Probleme zu verstehen, die rekursive Definition von append
durch das Buch vorgestellt:Verständnis Prolog "anhängen" rekursive Definition
append([], List, List).
append([X|List1], List2, [X|Result]) :- append(List1, List2, Result).
Zum Beispiel:
?- append([a, b, c], [3, 2, 1], Result).
Result = [a, b, c, 3, 2, 1]
Soweit ich weiß, besagt die Definition, dass die resultierende Liste den Kopf der ersten Liste als Kopf enthalten sollte, so dass die resultierende Liste anfänglich [ a ]
ist. Dann führen wir rekursiv append()
am Ende des ersten und dritten Arguments und lassen das zweite Argument so, wie es ist. Das dritte Argument (also [ a ]
) sollte den Kopf des neuen ersten Arguments als Kopf enthalten, also das Ergebnis Liste ist [ b, a ]
(was rückwärts ist, so klar, ich folge nicht richtig). Irgendwann ist die erste Liste []
und die resultierende Anordnung ist [ c, b, a ]
, so treffen wir den Basisfall:
append([], List, List).
So append([], [3, 2, 1], [ c, b, a ]).
, die keinen Sinn macht. Ich befolge auch nicht, wie der Inhalt der zweiten Liste berücksichtigt wird, wenn in der gesamten Definition keine Manipulation daran vorgenommen wird.
Die Definition besagt, dass die resultierende Liste den Kopf der ersten Liste als Kopf enthalten soll, also * anfänglich * ist die resultierende Liste "[a | Ergebnis] 'wobei' Ergebnis' noch nicht instanziiert ist. Dann wird "Result" als "[b | Ergebnis2] ', so dass die ganze Liste noch mehr bekannt wird, als' [a, b | Ergebnis2] '. [etc.] (https://stackoverflow.com/questions/11539203/how-do-i-append-lists-in-prolog/11551001#11551001) –
Die Tatsache, dass die Definition von 'append/3' rekursiv ist, ist wirklich neben dem Punkt. Du hättest deine Abfrage verfolgen können und du hättest genau gesehen, was auf jeder Rekursionsebene passiert, und vielleicht hättest du nichts mehr zu fragen gehabt. Was hier wichtig ist, ist das Prädikat definiert, was für jedes der drei Argumente gelten muss, damit das Prädikat selbst erfolgreich ist, wenn es bewertet wird. Die Antwort von @mat erklärt dies im Detail, ich fühlte einfach, dass Wiederholung nicht schaden kann. –