HSG

Aktuelle Seite: HSG/Fächer/Informatik/Material/Prolog

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.