Aufgabe 2 / Lösungsvorschläge
'Älterer Bruder' ab(X,Y):- maennlich(X), vater(Z,X), vater(Z,Y), aelter(X,Z), 'Boaboa-Onkel' boaboa(X,Y):- maennlich(X), vater(Z,Y), ab(Z,X), |
'Jüngerer Bruder' jb(X,Y):- maennlich(X), vater(Z,X), vater(Z,Y), aelter(Y,X), 'Shushu-Onkel' shushu(X,Y):- maennlich(X), vater(Z,Y), ab(Z,X), |
Was im Stammbaum fehlt, ist die Information darüber, wer älter bzw. jünger ist. Wir brauchen also ein Prädikat aelter/2. Dafür gibt z.B. die folgenden Möglichkeiten: | |
Möglichkeit 1 (nicht so gut) alle älter-als Relationen als Fakten eingeben (mit Bezug auf den engl. Stammbaum: aelter(charles,andrew), aelter(charles,anne), aelter(charles,edward), aelter(andrew,anne), aelter(andrew,edward) usw. | |
Möglichkeit 2 (auch nicht so gut): wir geben nur die direkten älter-als Fakten in Form von alt/2 Fakten ein und leiten aelter/2 daraus rekursiv ab: | |
alt(charles,anne). alt(anne,andrew). alt(andrew,edward). |
aelter(X,Y):- alt(X,Y). aelter(X,Y):- alt(Z,Y), aelter(X,Z). |
Möglichkeit 3 (besser): wir erweitern die elternteil/2-Fakten um ein drittes Argument (schaffen also ein neues Prädikat elternteil/3), in welchem das Geburtsdatum des Kindes aufgeführt ist. Wir hätten natürlich auch für jedes Individuum das Geburtsjahr als Fakt eingeben können. Mithilfe des Operators > (größer als) kann aelter/2 dann aus diesen Fakten abgeleitet werden. Wenn wir das elternteil/2-Prädikat erweitern, verwenden wir für die Definition von aelter/2 zwei (unterschiedliche) anonyme Variable um die älter-als-Relation für alle möglichen Mitglieder des Stammbaumes ermitteln zu können. |
|
elternteil(philip,charles,1948). elternteil(philip,anne,1950). elternteil(philip,andrew,1960). elternteil(philip,edward,1964). |
aelter(X,Y):- elternteil(_A,X,N), elternteil(_B,Y,N1), N > N1 |