Aufgaben Logische Programmierung
Aufgaben Logische Programmierung
Aufgaben Logische Programmierung
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
Unter einer Teilliste einer Liste L wollen wir eine Liste T verstehen, die sich dadurch ergibt,<br />
dass man aus L null oder mehr Elemente auswählt und daraus eine Liste bildet, in der die<br />
Reihenfolge der ausgewählten Elemente gleich wie in L ist. So ist z.B. [s,b,g] eine Teilliste der<br />
Liste [s,a,l,z,b,u,r,g]. Definieren Sie ein Prädikat teilliste/2, sodass Prolog z.B. auf die<br />
Anfrage<br />
?- teilliste(T,[s,a,l,z,b,u,r,g]).<br />
bei wiederholter Eingabe des Strichpunkts für T alle 256 Teillisten der Liste [s,a,l,z,b,u,r,g]<br />
liefert! Eine der Antworten lautet dann T=[s,b,g].<br />
Lassen Sie sich mit dem in Prolog eingebauten Prädikat findall/3 durch die Anfrage<br />
?- findall(T, teilliste(T,[a,b]), Teillisten).<br />
die Liste aller Teillisten T der Liste [a,b] ausgeben! Was Prolog dabei macht, ist, dass es für jede<br />
Lösung des Ziels teilliste(T,[a,b]) den entsprechenden Wert von T in eine Liste aufnimmt<br />
und die Variable Teillisten dann mit der resultierenden Liste unifiziert. Lassen Sie sich nun<br />
die Anzahl der Teillisten der Liste [s,a,l,z,b,u,r,g] mit der Anfrage<br />
?- findall(T, teilliste(T,[s,a,l,z,b,u,r,g]), Teillisten),<br />
length(Teillisten, Anzahl_der_Teillisten).<br />
ausgeben! Das Prädikat length/2 zur Berechnung der Länge einer Liste ist in vielen Prologs<br />
eingebaut. Man kann es wie in der Datei listenlaenge.pl gezeigt aber auch leicht selbst definieren.<br />
Die Teillisten der Liste [s,a,l,z,b,u,r,g] entsprechen genau den Teilmengen der<br />
Menge {s, a, l, z, b, u, r, g}. Davon gibt es 2 8 = 256.<br />
Aufgabe 20 Cliquen-Problem 2<br />
Dateiname: a20_clique2.pl<br />
Lesen Sie sich nochmals die Angabe von Aufgabe 5 (Cliquen-Problem) durch! Man kann die<br />
Situation durch einen ungerichteten Graphen darstellen (Datei clique.ps). Eine Clique ist dann<br />
eine Menge von Knoten des Graphen, von denen jeder mit jedem anderen verbunden ist. In<br />
unserem Beispiel ist {franz, berta, dora} eine Clique, da jeder darin genannte Knoten mit jedem<br />
anderen verbunden ist. Eine solche Menge kann man in Prolog als Liste darstellen, etwa als Liste<br />
[franz,berta,dora]. Definieren Sie nun ein Prädikat clique/1, das von einer solchen Liste<br />
testen kann, ob sie eine Clique darstellt. Z.B. sollte die Anfrage<br />
?- clique([franz,berta,dora]).<br />
die Antwort yes oder true liefern. Die Anfrage<br />
?- clique([berta,dora,franz]).<br />
sollte die gleiche Antwort liefern. Alle Cliquen aus mehr als einer Person haben also mehrere<br />
Darstellungen als Liste. Verwenden Sie nun das Prädikat der vorigen Aufgabe und stellen Sie die<br />
Anfrage<br />
?- teilliste(Clique, [anton,berta,christa,dora,ernst,franz]),<br />
clique(Clique).<br />
12