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.
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).
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?
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: |