/* Musterlösung Hausaufgabe 1 */ % gemeint soll hier sein: genoveva ist Elternteil von clothilde elternteil(genoveva,clothilde). elternteil(genoveva,xenia). elternteil(karl,clothilde). elternteil(karl,xenia). elternteil(chlodwig,ernestine). elternteil(clothilde,ernestine). elternteil(xenia,otto). elternteil(hjalmar,otto). elternteil(xenia,cythia). elternteil(hjalmar,cythia). ehepaar(xenia,hjalmar). ehepaar(genoveva,karl). ehepaar(ernestine,otto). maennlich(karl). maennlich(otto). maennlich(chlodwig). maennlich(hjalmar). weiblich(genoveva). weiblich(xenia). weiblich(clothilde). weiblich(ernestine). weiblich(cythia). % %Lösungen % /*Das Prädikat ehepaar hat immer an erster Stelle den Mann stehen. Um abzutesten, ob beliebige Personen verheiratet sind, sollten beide Reihenfolgen getestet werden*/ verheiratet(X,Y) :- ehepaar(X,Y). verheiratet(X,Y) :- ehepaar(Y,X). /*Mutter und Grossmutter: hier gab es kaum Probleme*/ mutter(Mutter,Y) :- elternteil(Mutter,Y), weiblich(Mutter). grossmutter(X,Y) :- elternteil(Z,Y), elternteil(X,Z), weiblich(X). /*Schwester: hier über die Geschwister-Relation definiert, die weiter unten noch gebraucht wird*/ schwester(Schwester,Y) :- geschwister(Schwester,Y), weiblich(Schwester). /* Hier keine Halbgeschwister*/ geschwister(X,Y) :- elternteil(Mutter,X), weiblich(Mutter), elternteil(Vater,X), maennlich(Vater), elternteil(Vater,Y), elternteil(Mutter,Y), X \== Y. /*Lösung für Halbgeschwister*/ halbgeschwister(X,Y) :- elternteil(E,X), %gemeinsames elternteil(E,Y), %Elternteil X \== Y, elternteil(E1,Y), %anderes Elternteil von X E1 \== E, not(elternteil(E1,X)). %%nicht Elternteil von Y schwaegerin(Schwaegerin,Y) :- weiblich(Schwaegerin), geschwister(Schwaegerin,Geschwister), %Schwaegerin = Schwester des Ehepartners verheiratet(Geschwister,Y). schwaegerin(Schwaegerin,Y) :- weiblich(Schwaegerin), verheiratet(Schwaegerin,Ehepartner), geschwister(Y,Ehepartner). %Schwaegerin = Ehefrau des Geschwisterchens %oder, alternativ: wir definieren zuerst verschwaegert, %dann die Schwaegerin verschwaegert(Schwager1,Schwager2):- verheiratet(Schwager1,X), geschwister(Schwager2,X). verschwaegert(Schwager1,Schwager2) :- verheiratet(Schwager2,X), geschwister(Schwager1,X). schwaegerin1(Schwaegerin,X) :- verschwaegert(Schwaegerin,X), weiblich(Schwaegerin). /* Hier die Ermittlung der weiblichen Vorfahren Ohne Rekursion geht es nicht */ vorfahr_weibliche_linie(Vorfahr,Nachfahr) :- mutter(Vorfahr,Nachfahr). vorfahr_weibliche_linie(Vorfahr,Nachfahr) :- mutter(Vorfahr,IrgendeinNachfahr), vorfahr_weibliche_linie(IrgendeinNachfahr,Nachfahr). /* und, nicht Teil der Hausaufgabe: Liste aller bekannten Vorfahren weiblicher Linie. Der Cut ist dann problematisch, wenn 'Nachfahr' eine Variable ist*/ %eine Mutter wurde gefunden: nimm sie in die Liste auf vorfahren_weibliche_linie(Nachfahr,[Vorfahr1|AndereVorfahren]) :- mutter(Vorfahr1,Nachfahr), !, %mater semper certa est?! vorfahren_weibliche_linie(Vorfahr1,AndereVorfahren). %keine Mutter mehr zu ermitteln: leere Liste vorfahren_weibliche_linie(_,[]).