12.07.2015 Aufrufe

Prolog-Aufgaben

Prolog-Aufgaben

Prolog-Aufgaben

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

GLoLoP-Tutorium (06.02.2009) 1GLoLoP: <strong>Prolog</strong>-Tutorium1. Grundlagen: Rechnen mit <strong>Prolog</strong>, Rekursion1.1 Betrag ASchreiben Sie ein Prädikat abs(X,Y), das den Betrag Y der Zahl X bestimmt.?- abs(-2, R).R = 21.2 Fakultät ASchreiben Sie ein <strong>Prolog</strong>-Prädikat fak(X,Y), das die Fakultät Y einer übergebenen nichtnegativenganzen Zahl X berechnet!?- fak(4, R).R = 241.3 Größter gemeinsamer Teiler AÜbersetzen Sie die folgende Implementation des Euklidischen Algorithmus in <strong>Prolog</strong>!1 f u n c t i o n ggT ( a , b ) :2 i f ( b == 0 ) :3 r e t u r n a4 e l s e :5 r e t u r n ggT ( b , a mod b )1.4 Ganzzahlige Division ADie ganzzahlige Division zweier positiver ganzer Zahlen lässt sich folgendermaßen definieren:{1 + div(m − n, n) falls m ≥ ndiv(m, n) =0 sonstSchreiben Sie ein entsprechendes <strong>Prolog</strong>-Prädikat!1.5 Türme von Hanoi AAADas Spiel besteht aus drei Stäben A, B und C, auf die mehrere gelochte Scheiben gelegt werden,alle verschieden groß. Zu Beginn liegen alle Scheiben auf Stab A, der Größe nach geordnet, mit dergrößten Scheibe unten und der kleinsten oben. Ziel des Spiels ist es, den kompletten Scheiben-Stapelvon A nach C zu versetzen.


GLoLoP-Tutorium (06.02.2009) 2Bei jedem Zug darf die oberste Scheibe eines beliebigen Stabes auf einen der beiden anderen Stäbegelegt werden, vorausgesetzt, dort liegt nicht schon eine kleinere Scheibe. Folglich sind zu jedemZeitpunkt des Spieles die Scheiben auf jedem Feld der Größe nach geordnet.Schreiben Sie ein rekursives <strong>Prolog</strong>-Programm, das eine korrekte Zugreihenfolge ausgibt (mit writebzw. writeln, das Speichern in einer Liste o.ä. ist nicht notwendig)!Idee: zuerst die obersten N − 1 Scheiben auf einen Hilfsstapel verschieben und dann die untersteScheibe gefolgt vom Rest auf den Zielstapel legen.2. Grundlagen: Listen in <strong>Prolog</strong>2.1 Zugehörigkeit ASchreiben Sie ein <strong>Prolog</strong>-Prädikat enthaelt(L, E) das genau dann erfüllt ist, wenn die Liste L dasElement E enthält.2.2 Länge ASchreiben Sie ein Prädikat laenge(L, R), das die Länge R einer Liste L ermittelt.2.3 Anhängen AA• Element an Liste anhängenSchreiben Sie ein Prädikat anhaengen(L, E, R), das das Element E hinten an die Liste L anhängtund in R das Ergebnis liefert: anhaengen([1,2,3], 4, [1,2,3,4])• Listen aneinanderhängenSchreiben Sie ein Prädikat aneinanderhaengen(L1, L2, R), das die beiden Listen L1 und L2zur Liste R zusammenhängt: aneinanderhaengen([1,2], [3,4], [1,2,3,4])2.4 Umkehren AAASchreiben Sie ein Prädikat umkehren(L, R) das die Liste L umkehrt und das Ergebnis in R speichert.Hinweis: Verwenden Sie ein Hilfsprädikat mit einer Akkumulator-Variablen!2.5 Entfernen AA• Schreiben Sie ein Prädikat entfernen1(L, N, R), das das N-te Element (beginnend bei 0) ausder Liste L entfernt: entfernen1([1,2,3,4,5], 2, [1,2,4,5])• Modifizieren Sie das Prädikat unter dem Namen entfernen2 so, dass jedes N-te Element entferntwird: entfernen2([1,2,3,4,5,6,7], 3, [1,2,4,5,7])• Schreiben Sie ein Prädikat entfernen3(L,E,R), das alle Vorkommen eines bestimmten Elementesaus einer Liste entfernt: entfernen3([1,2,1,2,3,1], 1, [2,2,3])


GLoLoP-Tutorium (06.02.2009) 32.6 Minimum AAASchreiben Sie ein Prädikat minimum(L,M), das die kleinste Zahl M in einer Liste L findet!2.7 Summe AASchreiben Sie ein Prädikat summe(L,S), das die Summe S der Zahlen in einer Liste L berechnet.2.8 Verdoppeln AASchreiben Sie ein Prädikat verdoppeln(L,R) das jedes Element einer Liste verdoppelt:?- verdoppeln([1,2,3], R).R = [2,4,6]2.9 Erstellen einer Liste AASchreiben Sie ein Prädikat zahlen(A,B,L), das ein Liste L mit allen ganzen Zahlen im Intervall [A; B]erzeugt (A ≤ B).Weitere <strong>Aufgaben</strong>: http://wwwcip.cs.fau.de/ ∼ simagrop/glolop/listen.html3. Grundlagen: Graphen in <strong>Prolog</strong>In den folgenden <strong>Aufgaben</strong> geht es um diesen Graphen:abfcgdeedge(a,b). edge(b,c). edge(c,d). edge(d,e).edge(a,f). edge(f,g). edge(g,d). edge(g,e).3.1 Erreichbarkeit AASchreiben Sie ein Prädikat reachable(X,Y) das angibt, ob ein Knoten Y von einem Knoten X auserreichbar ist. Dabei soll die Pfeilrichtung beachtet werden.?- reachable(f,e).Yes.?- reachable(b,g).No.


GLoLoP-Tutorium (06.02.2009) 43.2 Wege AA• Schreiben Sie ein Prädikat path(X,Y,P), das einen Weg von X nach Y findet und ihn als Liste inP speichert.• Erweitern Sie das Prädikat zu path(X,Y,P,C), das zusätzlich die Länge des Weges in C speichert.3.3 Kürzeste Wege AAAVerwenden Sie findall/3 um alle Wege zwischen zwei Knoten zu finden und geben Sie inshortestpath(X,Y,P,C) den kürzesten davon zurück!3.4 Binärbaum AAabceftree([a, [b,nil,[c,[d,nil,nil],nil]], [e,nil,[f,nil,nil]]]).dSchreiben Sie ein Prädikat height(T,H), das die Höhe H eines wie oben codierten Binärbaumes Tbestimmt.


GLoLoP-Tutorium (06.02.2009) 54. Fortgeschritten: Listen in <strong>Prolog</strong>4.1 Reißverschluss AAASchreiben Sie ein Reißverschluss-Prädikat, das zwei Listen miteinander verschmilzt:?- zip([1,2,3],[a,b,c],R).R = [1,a,2,b,3,c]4.2 Primzahlen AAAAASchreiben Sie ein Prädikat primes(N, R), das mit dem Sieb des Eratosthenes“ (http://de.wikipedia.”org/wiki/Sieb des Eratosthenes) alle Primzahlen im Bereich [2; N] in der Liste R speichert.Verwenden Sie das vordefinierte Prädikat numlist/3 um eine Liste aller Zahlen bis N zu erzeugen undentfernen“ Sie (es ist wahrscheinlich am geschicktesten, die Einträge nicht wirklich aus der Liste zu”nehmen) Schritt für Schritt die abgearbeiteten Zahlen.4.3 Mergesort AAAAImplementieren Sie den Mergesort-Algorithmus (http://de.wikipedia.org/wiki/Mergesort) in <strong>Prolog</strong>!• Schreiben Sie ein Prädikat dividelist(L, X, Y), das eine übergebene Liste in zwei etwa gleichgroße Listen aufteilt (die Reihenfolge der Elemente ist dabei egal).• Schreiben Sie ein Prädikat mergelists(X, Y, R), das zwei übergebene sortierte Listen zu einergroßen sortierten Liste verschmilzt.• Schreiben Sie das Prädikat mergesort(L, R)!4.4 Haus vom Nikolaus AAAANachdem die Aufgabe als Zusatzaufgabe zum 6. Dezember keiner haben wollte,kommt sie jetzt halt nochmal. Pah.aWie viele Möglichkeiten gibt es, das Haus vom Nikolaus zu zeichnen ohneabzusetzen?Sie können die folgende Liste von Kanten verwenden:[[a,b],[a,c],[b,c],[b,d],[b,e],[c,d],[c,e],[d,e]].bdce


GLoLoP-Tutorium (06.02.2009) 65. Fortgeschritten: Graphen in <strong>Prolog</strong>5.1 Algorithmus von Kruskal AAAAADer Algorithmus von Kruskal (http://de.wikipedia.org/wiki/Algorithmus von Kruskal) dientzur Berechnung minimaler Spannbäume von ungerichteten Graphen.Für diese Aufgabe erweitern wir den Graphen aus Teil 3 um Gewichte/Kosten:graph([[a,b,8], [b,c,10], [c,d,15], [d,e,15], [a,f,25], [f,g,20], [g,d,18], [g,e,9]]).Außerdem soll der Graph im Gegensatz zu vorher ungerichtet sein.• Schreiben Sie ein Prädikat, das aus einer Liste von gewichteten Kanten [Von,Nach,Kosten] dieKante mit den geringsten Kosten auswählt (und entfernt).• Schreiben Sie ein Prädikat, das ermittelt, ob das Hinzufügen einer bestimmten Kante zu einerListe von Kanten zu einem Kreis führen würde.• Implementieren Sie den Algorithmus von Kruskal:Führe den folgenden Schritt so oft wie möglich aus: Wähle unter den noch nicht ausgewähltenKanten des Graphen die kürzeste Kante, die mit den schon gewählten Kanten keinen Kreis bildet.Ein alternativer Graph (Wikipedia):graph2([[a,b,7], [a,d,5], [b,c,8], [b,d,9], [b,e,7], [c,e,5], [d,e,15], [d,f,6], [e,f,8],[e,g,9], [f,g,11]]).

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!