NF II, WS 1997/98: Lösungsblatt 8


Aufgabe 1

Geschwister sollen zwei Personen sein, die denselben Vater oder dieselbe Mutter haben. Gleichzeitig soll verhindert werden, daß ich mein eigenes Geschwister bin.

geschw(X, Y) :- vater(X, Z), vater( Y, Z), not X = Y.
geschw(X, Y) :- mutter(X, Z), mutter( Y, Z), not X = Y.


Anm.: Wenn hier zwei Personen gleichen Vater und gleiche Mutter haben, werden zwei Lösungen produziert.

Ein Bruder ist ein männliches Geschwister von mir:

bruder( X, Y) :- vater(X, Z), vater( Y, Z), not X = Y, m(Y).
bruder(X, Y) :- mutter(X, Z), mutter( Y, Z), not X=Y, m(Y).

Ein Schwager von mir ist der Mann meiner Schwester.

schwager( X, Y) :- geschw( X, Z), verh( Z, Y), m(Y).
schwager( X, Y) :- geschw( X, Z), verh( Y, Z), m(Y).

Beachten Sie, daß wir im Schwager-Fall nur deswegen zwei Regeln brauchen, da die verh-Relation symmetrisch zu sehen ist.

Aufgabe 2

Meine Eltern sind Vorfahren von mir. Außerdem sind alle Vorfahren meiner Eltern auch Vorfahren von mir.

elternteil(X, Y) :- vater( X, Y).
elternteil(X, Y) :- mutter( X, Y).
vorfahr(X, Y) :- elternteil( X, Y).
vorfahr(X, Y) :- elternteil( X, Z), vorfahr(Z, Y).

Aufgabe 3

Aufgabe 4

Zunächst definieren wir Basisverwandtschaften: Mütter, Väter und Ehepartner gelten als Verwandte.

b-verw( X, Y) :- vater( X, Y).
b-verw( X, Y) :- mutter(X, Y).
b-verw( X, Y) :- verh( X, Y).

Das ist symmetrisch, auch Kinder sind Verwandte. Wir nennen diese Relation s-verw, um die Symmetrie anzudeuten.

s-verw( X, Y) :- b-verw( X, Y).
s-verw( X, Y) :- b-verw( Y, X).

Schließlich die gesamte Definition: Die symmetrische Form der Basisverwandtschaft gilt als verwandt. Verwandtschaft ist transitiv. hier fordern wir erneut, daß ich nicht mit mir selber verwandt bin.

verw(X, Y) :- s-verw(X, Y).
verw(X, Y) :- s-verw( X, Z), verw( Z, Y), not X = Y.

Achtung: Wenn Sie anhand der Beispieldatenbank ermitteln wollen, mit wem Stefan verwandt ist - verw(stefan,X) -, werden Sie in eine nicht terminierende Berechnung hineinlaufen. Warum?

Aufgabe 5

Eltern und Kinder sind Verwandte ersten Grades:

grad(X, Y, 1) :- s-verw(X, Y).

Geschwister sind auch Verwandte ersten Grades:

grad(X, Y, 1) :- geschw(X, Y).

Wenn ich einen Verwandten ersten Grades habe, und der ist mit einer Person mit dem Grad m verwandt, dann bin ich mit dieser Person mit dem Grad m+1 verwandt:

grad(X, Y, N) :- grad(X, Z, 1), 
    grad( Z, Y, M),
    N is M + 1.


Author: Jan W. Amtrup
Document:
Last modified: