Arbeitsweise Grundlagen Unifikation Backtracking Resolution
Pfad: Startseite / Fächer / Informatik / Prolog / Arbeitsweise
Autor: mk
22.04.2007 17:03:14
1010

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.

Valid XHTML 1.0! lokal