Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Günter Kniesel Advanced Prolog. 2 Bisher: Grundlagen Klauseln –Regeln –Fakten Terme –Die einzige Datenstruktur in Prolog –Listen als Sonderfall mit eigener.

Ähnliche Präsentationen


Präsentation zum Thema: "Günter Kniesel Advanced Prolog. 2 Bisher: Grundlagen Klauseln –Regeln –Fakten Terme –Die einzige Datenstruktur in Prolog –Listen als Sonderfall mit eigener."—  Präsentation transkript:

1 Günter Kniesel Advanced Prolog

2 2 Bisher: Grundlagen Klauseln –Regeln –Fakten Terme –Die einzige Datenstruktur in Prolog –Listen als Sonderfall mit eigener Syntax Unifikation –Terme gleich machen Inferenz –Anfragen beantworten Rekursion Backtracking –Alle Ergebnisse finden

3 3 Prolog-Suchstrategie Klauseln –Top-down Literale im Klausel-Rumpf –Left to right Achtung bei Rekursion –Rekursive Klauseln immer hinter nach den Abbruchbedingungen –Rekursiver Aufruf möglichst am Ende einer Klausel (tail recursion) Terminierung Effizienz (Tail recursion optimization)

4 Disjunkte Fallunterscheidung –entweder der eine oder der andere Fall treffen zu –... aber nie beide A) mittels disjunkter Klauselköpfe: append([],List,List). append([Head|Tail],List,[Head|Rest]) :- append(Tail,List, Rest). –Guter Stil (deklarativ!) –Mehrfache Verwendungsmodi möglich listen konkatenieren: arg1+arg2=arg3 listen splitten: arg3 –arg1=arg2 oder arg3 –arg2 = arg1 Empfehlung –disjunkte Terme in erstem Argument unterbringen – First argument indexing der Prolog-Datenbasis ausnutzen – richtige Klausel wird direkt gefunden (kein backtracking)

5 5 Disjunkte Fallunterscheidung mit explizitem Test B) Am Anfang von Klauseln explizite Tests einfügen append([],List,List). append(L1,List,[Head|Rest]) :- L1=[Head|Tail], append(Tail,List, Rest). Empfehlung –wenn Test sich auf Unifizierbarkeit reduzieren lässt ist Variante A) besser –Wenn Test aufwendig ist (komplexe Konjunktion) eigenes Prädikat dafür schreiben –... und in der nächsten Klausel negiert aufrufen (wenn es mehr als 2 Klauseln gibt) Problem: Wiederholung der Tests –Lesbarkeit –Laufzeit

6 6 Beschränkung des Suchraums Was tun im folgenden Fall? p(...) :- a(X,Y), test(Y), sollNurEinMalAusgeführtWerden(Y), koennteEvtlFehlschlagen(Y). Antwort: Mit bedacht cut verwenden p(...) :- a(X,Y), test(Y), !, sollNurEinMalAusgeführtWerden(Y), koennteEvtlFehlschlagen(Y). Wirkung: –vergisst alle noch offenen Suchalternativen links vom cut also in a(X,Y), test(Y) –vergisst alle noch nachfolgenden Klauseln nach der die den cut enthält (!)

7 7 Beispiel: Cut validSuperClass (SuperClassId, AdaptedSuperClassId) :- classDefT(SuperClassId,_,'Object',_), AdaptedSuperClassId = 'Object', !. validSuperClass (SuperClassId, AdaptedSuperClassId) :- externT(SuperClassId), AdaptedSuperClassId = 'Extern', !. validSuperClass (SuperClassId, SuperId) :- SuperId = SuperClassId.

8 8 Gefahren des Cut Falsches Verhalten –Evtl. werden zu viele Alternativen weggeschnitten! Fehleranfälligkeit –Ergebnis abhängig von Reihenfolge der Literale und Klauseln –Achtung bei nachträglichen Änderungen Asymetrisches Input-/Output-Verhalten –nur gewisse Argumente als Input –... andere als Output Unbedingt Dokumentieren! –Asymetrisches Verhalten –Tatsache, dass nicht alle Ergebnisse genfunden werden

9 9 Weitere built-in Prädikate mit Seiteneffekten Ein-/Ausgabe –write,...... und eine Tonne mehr –Einfach ?- help im Interpreter eingeben – Grafische Hilfe-Umgebung

10 10 Schleifen in Prolog Alternativen –Rekursion –Backtracking Rekursion –schon bekannt (append) –Problem: rekursiv alle Zeilen einer Datei einlesen, was damit tun, ausgeben –Rekursive Lösung würde bei grossen Dateien zu Speicherüberlauf führen

11 11 Beispiel bearbeiteDatei :- wasLesen, // entsprchende built-ins es speichern // entsprchende built-ins fail. bearbeiteDatei :- gespeichertesBearbeiten, es ausgeben // entsprchende built-ins fail. bearbeiteDatei. remember_internal_packages :- packageT(Id,Name), not(extern_package(Id)), assert(package_db(Id,Name)), fail. remember_internal_packages.

12 12 Programme als Daten: Metaprogrammierung clause(Head,Body) –Body wird mit einem Term unifiziert, der den Klauselrumpf darstellt assert(Term) –Term wird als darstellung einer Klausel interpretiert –... hinten zur Definition des entsprechenden Prädikats angfügt retract(Term) –Klauseln deren Kopf mit Term unifizierbar sind werden gelöscht call(Term) –Term wird als Prädikat interpretiert –... und seine Ausführung wird angestossen

13 13 Metaprogrammierung: Denkaufgabe Maplist(BinaryPred,List1,List2) –E1 ist N-tes Element von List1 UND E2 ist N-tes Element von List2 binaryPred(E1,E2) –siehe auch Prolog help Verwendet call um maplist zu implementieren

14 14 Aufgaben Rekursion über Listen üben: nützliche Hilfsprädikate selbst implementieren –member(Elem,List) Aufgabe: Test ob Elem in List enthalten ist Erst nachdenken: Wie soll es sich Verhalten, wenn Elem eine Variable ist? –split(L,Elem,L1,L2) Aufgabe: L = L1 + [Elem] + L2

15 15 Woher kommt das Logo? Das Schloß ist das Markenzeichen der Universität Bonn Hohe Identifikation aller Universitätsangehörigen


Herunterladen ppt "Günter Kniesel Advanced Prolog. 2 Bisher: Grundlagen Klauseln –Regeln –Fakten Terme –Die einzige Datenstruktur in Prolog –Listen als Sonderfall mit eigener."

Ähnliche Präsentationen


Google-Anzeigen