Prolog-Übung 3 25. 11. 2009 Aufgabe 1 Schreiben Sie ein Programm, das eine Liste de-dupliziert (d.h. mehrfach enthaltene Elemente löscht): [a, b, a, c] wird zu [a, b, c] oder [b, a, c]. Aufgabe 2 Schreiben Sie ein Programm, das jedes Element einer Liste verdoppelt, also [a, b, c] wird zu [a, a, b, b, c, c]. Aufgabe 3 Implementieren Sie eine (stark vereinfachte) Ontologie des Herzens, welche folgende Strukturen kennt: • • • • • • • • tricuspidalklappe, pulmonalklappe, rechtesVorhofseptum, rechteVorhofhoehle, aortenklappe, mitralklappe, linkesVorhofseptum, linkeVorhofhoehle Sie können die Beziehungen der einzelnen Strukturen untereinander (welche Struktur ist Teil einer anderen Struktur) hier nachlesen: http://fme.biostr.washington.edu:8089/FME/index.html Es soll mit Hilfe eines Prädikats teile_von/2 abgefragt werden können, aus welchen Substrukturen eine bestimmte Struktur des Herzens (bzw. auch das ganze Herz) zusammengesetz ist (natürlich wiederum stark vereinfacht!). Diese Substrukturen sollen in Form einer Liste ausgegeben werden. Z.B: ?- teile_von(herz,Y). Y = [tricuspidalklappe, pulmonalklappe, rechtesVorhofseptum, rechteVorhofhoehle, aortenklappe, mitralklappe, linkesVorhofseptum, linkeVorhofhoehle] ?- teile_von(linkesAtrium,Y). Y = [linkesVorhofseptum, linkeVorhofhoehle]. Aufgabe 4 a) Beschäftigen Sie sich mit einigen vordefinierten Prädikaten in Prolog. Was machen die Prädikate compound, atom, functor und arg?? Was ergeben die folgenden Ausdrücke und warum? ?- compound(a). ?- atom(a). ?- compound(X). ?- atom(X). ?- compound(a(b)). ?- atom(a(b)). ?- compound([]). ?- atom([]). ?- compound([[]]). ?- atom([[]]). ?- functor(a, F, A). ?- functor(vater(michael, berger), F, A). ?- arg(1, vater(michael, berger), X). ?- arg(2, vater(michael, X), berger). ?- functor([], F, A). ?- functor([a], F, A). ?- arg(1, [a], X). ?- arg(2, [a], X). ?- arg(3, [a], X). ?- arg(1, [], X). b) Schreiben Sie unter Zuhilfenahme dieser Prädikate ein Programm subterm(T1, T2), das wahr ergibt, wenn T1 ein Unter-Term von T2 ist, also z.B. ?- subterm(a, x(a)). true ?- subterm(a, x(b)). false Sie dürfen dabei annehmen, dass keiner der Terme Variablen enthält. Senden Sie die Ergebnisse für diese Übungsbeispiele sowie für die beiden vorangegangenen Übungszettel bitte bis 10. 12. 2009 an [email protected].