Wir wollen eine Regel vorfahr/2 bestimmen, welche bestimmt, ob das 1. Argument Vorfahr des 2. Arguments ist. In unserer Wissensbasis haben wir den Fakt kind/2, welcher festlegt, dass das 1. Argument Kind des 2. Arguments ist.

Wir bestimmen also folgende Regel:

vorfahr(VORFAHR, NACHFAHR) :- kind(NACHFAHR, VORFAHR).
vorfahr(VORFAHR, NACHFAHR) :- kind(PERSON, VORFAHR), vorfahr(PERSON, NACHFAHR).

Aber wieso funktioniert das?
Wir können die Regel auch so schreiben:

Wenn ein VORFAHR vorfahr eines NACHFAHRen ist, dann gilt eine von diesen Bedingungen:

  1. Der NACHFAHR ist kind des VORFAHRen.
  2. Eine PERSON ist kind des VORFAHRen
    2.1. und der VORFAHR ist vorfahr dieser PERSON.

(Mindestens ein Kind eines beliebigen Nachfahrens (der PERSON) ist ein Vorfahr vom VORFAHR.
Alle Vorfahren der Vorfahren einer Person sind ja auch Vorfahren der Person selbst).

Ein Beispiel:

Wir wollen mit unserer oberen Logik überprüfen, ob “cronus” vorfahr von “percy” ist. Dazu geben wir den Befehl in den Prolog-Interpreter ein.
Mithilfe des trace-Befehls können wir einsehen, welche Anfragen der Prolog-Interpreter ausführt.

?- trace.
true.

[trace]  ?- vorfahr(cronus, percy).
   Call: (12) vorfahr(cronus, percy) ? creep
   Call: (13) kind(percy, cronus) ? creep
   Fail: (13) kind(percy, cronus) ? creep
   Redo: (12) vorfahr(cronus, percy) ? creep
   Call: (13) kind(_15078, cronus) ? creep
   Exit: (13) kind(hera, cronus) ? creep
   Call: (13) vorfahr(hera, percy) ? creep
   Call: (14) kind(percy, hera) ? creep
   Fail: (14) kind(percy, hera) ? creep
   Redo: (13) vorfahr(hera, percy) ? creep
   Call: (14) kind(_19940, hera) ? creep
   Exit: (14) kind(athena, hera) ? creep
   Call: (14) vorfahr(athena, percy) ? creep
   Call: (15) kind(percy, athena) ? creep
   Fail: (15) kind(percy, athena) ? creep
   Redo: (14) vorfahr(athena, percy) ? creep
   Call: (15) kind(_24802, athena) ? creep
   Exit: (15) kind(annabeth, athena) ? creep
   Call: (15) vorfahr(annabeth, percy) ? creep
   Call: (16) kind(percy, annabeth) ? creep
   Fail: (16) kind(percy, annabeth) ? creep
   Redo: (15) vorfahr(annabeth, percy) ? creep
   Call: (16) kind(_29664, annabeth) ? creep
   Fail: (16) kind(_29664, annabeth) ? creep
   Fail: (15) vorfahr(annabeth, percy) ? creep
   Redo: (15) kind(_24802, athena) ? creep
   Exit: (15) kind(malcolm, athena) ? creep
   Call: (15) vorfahr(malcolm, percy) ? creep
   Call: (16) kind(percy, malcolm) ? creep
   Fail: (16) kind(percy, malcolm) ? creep
   Redo: (15) vorfahr(malcolm, percy) ? creep
   Call: (16) kind(_1558, malcolm) ? creep
   Fail: (16) kind(_1558, malcolm) ? creep
   Fail: (15) vorfahr(malcolm, percy) ? creep
   Fail: (14) vorfahr(athena, percy) ? creep
   Redo: (14) kind(_104, hera) ? creep
   Exit: (14) kind(ares, hera) ? creep
   Call: (14) vorfahr(ares, percy) ? creep
   Call: (15) kind(percy, ares) ? creep
   Fail: (15) kind(percy, ares) ? creep
   Redo: (14) vorfahr(ares, percy) ? creep
   Call: (15) kind(_9660, ares) ? creep
   Exit: (15) kind(clarissa, ares) ? creep
   Call: (15) vorfahr(clarissa, percy) ? creep
   Call: (16) kind(percy, clarissa) ? creep
   Fail: (16) kind(percy, clarissa) ? creep
   Redo: (15) vorfahr(clarissa, percy) ? creep
   Call: (16) kind(_14522, clarissa) ? creep
   Fail: (16) kind(_14522, clarissa) ? creep
   Fail: (15) vorfahr(clarissa, percy) ? creep
   Redo: (15) kind(_9660, ares) ? creep
   Exit: (15) kind(frank, ares) ? creep
   Call: (15) vorfahr(frank, percy) ? creep
   Call: (16) kind(percy, frank) ? creep
   Fail: (16) kind(percy, frank) ? creep
   Redo: (15) vorfahr(frank, percy) ? creep
   Call: (16) kind(_21814, frank) ? creep
   Fail: (16) kind(_21814, frank) ? creep
   Fail: (15) vorfahr(frank, percy) ? creep
   Fail: (14) vorfahr(ares, percy) ? creep
   Redo: (14) kind(_104, hera) ? creep
   Exit: (14) kind(hephaistos, hera) ? creep
   Call: (14) vorfahr(hephaistos, percy) ? creep
   Call: (15) kind(percy, hephaistos) ? creep
   Fail: (15) kind(percy, hephaistos) ? creep
   Redo: (14) vorfahr(hephaistos, percy) ? creep
   Call: (15) kind(_29916, hephaistos) ? creep
   Exit: (15) kind(jake, hephaistos) ? creep
   Call: (15) vorfahr(jake, percy) ? creep
   Call: (16) kind(percy, jake) ? creep
   Fail: (16) kind(percy, jake) ? creep
   Redo: (15) vorfahr(jake, percy) ? creep
   Call: (16) kind(_34778, jake) ? creep
   Fail: (16) kind(_108, jake) ? creep
   Fail: (15) vorfahr(jake, percy) ? creep
   Redo: (15) kind(_106, hephaistos) ? creep
   Exit: (15) kind(leo, hephaistos) ? creep
   Call: (15) vorfahr(leo, percy) ? creep
   Call: (16) kind(percy, leo) ? creep
   Fail: (16) kind(percy, leo) ? creep
   Redo: (15) vorfahr(leo, percy) ? creep
   Call: (16) kind(_6586, leo) ? creep
   Fail: (16) kind(_6586, leo) ? creep
   Fail: (15) vorfahr(leo, percy) ? creep
   Redo: (15) kind(_106, hephaistos) ? creep
   Exit: (15) kind(charles, hephaistos) ? creep
   Call: (15) vorfahr(charles, percy) ? creep
   Call: (16) kind(percy, charles) ? creep
   Fail: (16) kind(percy, charles) ? creep
   Redo: (15) vorfahr(charles, percy) ? creep
   Call: (16) kind(_13878, charles) ? creep
   Fail: (16) kind(_13878, charles) ? creep
   Fail: (15) vorfahr(charles, percy) ? creep
   Redo: (15) kind(_106, hephaistos) ? creep
   Exit: (15) kind(harley, hephaistos) ? creep
   Call: (15) vorfahr(harley, percy) ? creep
   Call: (16) kind(percy, harley) ? creep
   Fail: (16) kind(percy, harley) ? creep
   Redo: (15) vorfahr(harley, percy) ? creep
   Call: (16) kind(_21170, harley) ? creep
   Fail: (16) kind(_21170, harley) ? creep
   Fail: (15) vorfahr(harley, percy) ? creep
   Redo: (15) kind(_106, hephaistos) ? creep
   Exit: (15) kind(chris, hephaistos) ? creep
   Call: (15) vorfahr(chris, percy) ? creep
   Call: (16) kind(percy, chris) ? creep
   Fail: (16) kind(percy, chris) ? creep
   Redo: (15) vorfahr(chris, percy) ? creep
   Call: (16) kind(_28462, chris) ? creep
   Fail: (16) kind(_28462, chris) ? creep
   Fail: (15) vorfahr(chris, percy) ? creep
   Fail: (14) vorfahr(hephaistos, percy) ? creep
   Fail: (13) vorfahr(hera, percy) ? creep
   Redo: (13) kind(_102, cronus) ? creep
   Exit: (13) kind(zeus, cronus) ? creep
   Call: (13) vorfahr(zeus, percy) ? creep
   Call: (14) kind(percy, zeus) ? creep
   Fail: (14) kind(percy, zeus) ? creep
   Redo: (13) vorfahr(zeus, percy) ? creep
   Call: (14) kind(_1726, zeus) ? creep
   Exit: (14) kind(athena, zeus) ? creep
   Call: (14) vorfahr(athena, percy) ? creep
   Call: (15) kind(percy, athena) ? creep
   Fail: (15) kind(percy, athena) ? creep
   Redo: (14) vorfahr(athena, percy) ? creep
   Call: (15) kind(_6588, athena) ? creep
   Exit: (15) kind(annabeth, athena) ? creep
   Call: (15) vorfahr(annabeth, percy) ? creep
   Call: (16) kind(percy, annabeth) ? creep
   Fail: (16) kind(percy, annabeth) ? creep
   Redo: (15) vorfahr(annabeth, percy) ? creep
   Call: (16) kind(_11450, annabeth) ? creep
   Fail: (16) kind(_11450, annabeth) ? creep
   Fail: (15) vorfahr(annabeth, percy) ? creep
   Redo: (15) kind(_6588, athena) ? creep
   Exit: (15) kind(malcolm, athena) ? creep
   Call: (15) vorfahr(malcolm, percy) ? creep
   Call: (16) kind(percy, malcolm) ? creep
   Fail: (16) kind(percy, malcolm) ? creep
   Redo: (15) vorfahr(malcolm, percy) ? creep
   Call: (16) kind(_18742, malcolm) ? creep
   Fail: (16) kind(_18742, malcolm) ? creep
   Fail: (15) vorfahr(malcolm, percy) ? creep
   Fail: (14) vorfahr(athena, percy) ? creep
   Redo: (14) kind(_1726, zeus) ? creep
   Exit: (14) kind(ares, zeus) ? creep
   Call: (14) vorfahr(ares, percy) ? creep
   Call: (15) kind(percy, ares) ? creep
   Fail: (15) kind(percy, ares) ? creep
   Redo: (14) vorfahr(ares, percy) ? creep
   Call: (15) kind(_26844, ares) ? creep
   Exit: (15) kind(clarissa, ares) ? creep
   Call: (15) vorfahr(clarissa, percy) ? creep
   Call: (16) kind(percy, clarissa) ? creep
   Fail: (16) kind(percy, clarissa) ? creep
   Redo: (15) vorfahr(clarissa, percy) ? creep
   Call: (16) kind(_31706, clarissa) ? creep
   Fail: (16) kind(_31706, clarissa) ? creep
   Fail: (15) vorfahr(clarissa, percy) ? creep
   Redo: (15) kind(_26844, ares) ? creep
   Exit: (15) kind(frank, ares) ? creep
   Call: (15) vorfahr(frank, percy) ? creep
   Call: (16) kind(percy, frank) ? creep
   Fail: (16) kind(percy, frank) ? creep
   Redo: (15) vorfahr(frank, percy) ? creep
   Call: (16) kind(_3350, frank) ? creep
   Fail: (16) kind(_3350, frank) ? creep
   Fail: (15) vorfahr(frank, percy) ? creep
   Fail: (14) vorfahr(ares, percy) ? creep
   Redo: (14) kind(_104, zeus) ? creep
   Exit: (14) kind(hephaistos, zeus) ? creep
   Call: (14) vorfahr(hephaistos, percy) ? creep
   Call: (15) kind(percy, hephaistos) ? creep
   Fail: (15) kind(percy, hephaistos) ? creep
   Redo: (14) vorfahr(hephaistos, percy) ? creep
   Call: (15) kind(_11452, hephaistos) ? creep
   Exit: (15) kind(jake, hephaistos) ? creep
   Call: (15) vorfahr(jake, percy) ? creep
   Call: (16) kind(percy, jake) ? creep
   Fail: (16) kind(percy, jake) ? creep
   Redo: (15) vorfahr(jake, percy) ? creep
   Call: (16) kind(_16314, jake) ? creep
   Fail: (16) kind(_16314, jake) ? creep
   Fail: (15) vorfahr(jake, percy) ? creep
   Redo: (15) kind(_11452, hephaistos) ? creep
   Exit: (15) kind(leo, hephaistos) ? creep
   Call: (15) vorfahr(leo, percy) ? creep
   Call: (16) kind(percy, leo) ? creep
   Fail: (16) kind(percy, leo) ? creep
   Redo: (15) vorfahr(leo, percy) ? creep
   Call: (16) kind(_23606, leo) ? creep
   Fail: (16) kind(_23606, leo) ? creep
   Fail: (15) vorfahr(leo, percy) ? creep
   Redo: (15) kind(_11452, hephaistos) ? creep
   Exit: (15) kind(charles, hephaistos) ? creep
   Call: (15) vorfahr(charles, percy) ? creep
   Call: (16) kind(percy, charles) ? creep
   Fail: (16) kind(percy, charles) ? creep
   Redo: (15) vorfahr(charles, percy) ? creep
   Call: (16) kind(_30898, charles) ? creep
   Fail: (16) kind(_30898, charles) ? creep
   Fail: (15) vorfahr(charles, percy) ? creep
   Redo: (15) kind(_11452, hephaistos) ? creep
   Exit: (15) kind(harley, hephaistos) ? creep
   Call: (15) vorfahr(harley, percy) ? creep
   Call: (16) kind(percy, harley) ? creep
   Fail: (16) kind(percy, harley) ? creep
   Redo: (15) vorfahr(harley, percy) ? creep
   Call: (16) kind(_2540, harley) ? creep
   Fail: (16) kind(_2540, harley) ? creep
   Fail: (15) vorfahr(harley, percy) ? creep
   Redo: (15) kind(_106, hephaistos) ? creep
   Exit: (15) kind(chris, hephaistos) ? creep
   Call: (15) vorfahr(chris, percy) ? creep
   Call: (16) kind(percy, chris) ? creep
   Fail: (16) kind(percy, chris) ? creep
   Redo: (15) vorfahr(chris, percy) ? creep
   Call: (16) kind(_9832, chris) ? creep
   Fail: (16) kind(_9832, chris) ? creep
   Fail: (15) vorfahr(chris, percy) ? creep
   Fail: (14) vorfahr(hephaistos, percy) ? creep
   Redo: (14) kind(_104, zeus) ? creep
   Exit: (14) kind(thalia, zeus) ? creep
   Call: (14) vorfahr(thalia, percy) ? creep
   Call: (15) kind(percy, thalia) ? creep
   Fail: (15) kind(percy, thalia) ? creep
   Redo: (14) vorfahr(thalia, percy) ? creep
   Call: (15) kind(_17934, thalia) ? creep
   Fail: (15) kind(_17934, thalia) ? creep
   Fail: (14) vorfahr(thalia, percy) ? creep
   Fail: (13) vorfahr(zeus, percy) ? creep
   Redo: (13) kind(_102, cronus) ? creep
   Exit: (13) kind(poseidon, cronus) ? creep
   Call: (13) vorfahr(poseidon, percy) ? creep
   Call: (14) kind(percy, poseidon) ? creep
   Exit: (14) kind(percy, poseidon) ? creep
   Exit: (13) vorfahr(poseidon, percy) ? creep
   Exit: (12) vorfahr(cronus, percy) ? creep