Rekursion und Schleifen
Folgendes Programm zeigt, wie man mit Hilfe der Rekursion Schleifen konstruieren kann und was
- wie bei
r2 - dabei schiefgehen kann.
r1(0).
r1(N):-write(N),write(' Scio nescio'),nl,N1 is N-1,r1(N1).
r2(N):-write(N),write(' Scio nescio'),nl,N1 is N-1,r2(N1).
r2(0).
r3(0).
r3(N):-N1 is N-1,r3(N1),write(N),write(' Scio nescio'),nl.
Bitte r1(5), r2(5) und r3(5) anfragen.
Interessant ist es, die Rekursion mit
trace. zu verfolgen.
[trace] ?- r1(1).
Call: (7) r1(1) ? creep
Call: (8) write(1) ? creep
1
Exit: (8) write(1) ? creep
Call: (8) write(' Scio nescio') ? creep
Scio nescio
Exit: (8) write(' Scio nescio') ? creep
Call: (8) nl ? creep
Exit: (8) nl ? creep
^ Call: (8) _G329 is 1-1 ? creep
^ Exit: (8) 0 is 1-1 ? creep
Call: (8) r1(0) ? creep
Exit: (8) r1(0) ? creep
Exit: (7) r1(1) ? creep
Yes
In der vorletzten Zeile geht Prolog - zu Recht - erfolgreich aus
r1(0) heraus ohne dann
den Versuch zu machen, die nächste Zeile
r1(N):-write(N),write(' Scio nescio'),nl,N1 is N-1,r1(N1).
wahr zu machen. Dies wäre zweifellos möglich, wie
r2 zeigt, wird aber nicht gemacht.
Übrigens, 'creep' heißt 'schleiche,krieche' und steht für das schrittweise, langsame Schleichen durch das
Programm.