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:
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:
- Der NACHFAHR ist
kind
des VORFAHRen. - Eine PERSON ist
kind
des VORFAHRen
2.1. und der VORFAHR istvorfahr
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