Übungen

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),

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