Datenstrukturen DCG Grammatiken Tutorial II Leiss Skript Grammatiken S.65 - S.77 Operationen auf Datenstrukturen Bäume Nachtrag Sehr kurz Operationen auf Datenstrukturen III Graphen Bäume Einfügung in einen Baum: add Relation in den leeren Baum: add(Baum,X,NeuerBaum) addleaf(nil,X,t(nil,X,nil)). %in den leeren baum addleaf(t(Left,X,Right),X,t(Left,X,Right)) %schon drin addleaf(t(Left,Root,Right),X,t(Left1,Root,Right)) :gt(Root,X), addleaf(Left,X,Left1). %in den linken Baum addleaf(t(Left,Root,Right),X,t(Left,Root,Right1)):gt(X,Root),addleaf(Right,X,Right1). %in den rechten Baum da X grösser Root Bäume Löschen eines Knotens, nicht so einfach, da beim Löschen eines internen Knotens ein darunterliegender Teilbaum möglicherweise ind er Luft hängt. Graphen Graphstrukturen werden in vielen Applikationen benutzt: zur Repräsentation von Relationen, Situationen und allgemeiner Problemen. Ein Graph ist durch eine Menge von Kanten und eine Menge von Knoten definiert. Sind Kanten durch geordnete Paare definiert: gerichteter Graph. Den Kanten beigeordnet können: Kosten, Namen oder alle Arten von Labels werden. Abhängig von der Applikation. Graphen Beispiele für Graphen: t 3 s 5 u b 1 v 2 2 a d c Es ergeben sich mehrere Möglichkeiten Graphen zu repräsentieren. Graphen (1) Methode: jede Kante als eine Klausel arc(s,t,3). arc(t,v,1). .... t 3 s 5 u 1 v 2 2 Graphen (2) Methode: repräsentiere den gesamten Graphen als ein Datenobjekt. G1= graph([a,b,c,d],[e(a,b),e(b,d),e(b,c),e(c,d)]). Falls jeder Knoten zumindest mit einem anderen verbunden ist, können wir die Liste der Knoten vermeiden: implizite Information. b a d c Graphen (3) Methode: Knoten + Liste von verbundenen Knoten G1= [a->[b]], b->[a,c,d], c->[b,d], d->[b,c]] -> ist ein Infix Operator. Graphen Einfache Beispiel-Operation auf Graphen: Finde einen Pfad zwischen zwei gegebenen Knoten. Sei G ein Graph, A und Z zwei Knoten in G und P ein azyklischer Pfad zwischen A und Z in G: P wird als Liste von Knoten auf dem Pfad zwischen A und Z repräsentiert. path(a,d,g,[a,b,d]). path(a,d,g,[a,b,c,d]). Azyklische Pfade dürfen jeden Knoten nur einmal enthalten! Graphen Finde einen Pfad von A nach Z in G: Wenn A = Z: p=[A] sonst: Finde einen Pfad P1 von Y nach Z und dann von A nach Y ohne Knoten aus P1 zu verwenden: Brauchen eine Hilfsprozedur: finde einen Pfad unter der Restriktion eine Teilmenge von Knoten zu vermeiden! siehe Bratko: Hilfsprozedur ist dann von der Graphimplementation abhängig. ELIZA, Partial Parsing Nach Piere Nugues, An Introduction to Language Processing with Perl and Prolog: Viele industrielle Applikationen verlassen sich nicht auf einen Parsebaum wie er im Kurs eingeführt worden ist. Der Grund ist, dass es schwierig ist eine Syntax mit grosser grammatischer Abdeckung zu programmieren. Einige Applikationen müssen lediglich wenige entscheidende Keywords haben um zu funktionieren: z. B. Dialogsysteme, wie die Bahnauskunft. Systeme mit shallow oder partial Parsing operieren oft auf Chunks ELIZA Eliza simmuliert den Dialog zwischen einem Psychotherapeuten und seinem/ihrem Patienten (Weizenbaum 1966). Tatsächlich "versteht" Eliza gar nichts. Trotzdem scheint der Dialog sinnvoll zu sein (in jeder Emacs Implementation kann Eliza als "doctor" aufgerufen werden. Eliza verfolgt Pattern wie: yes, no, why, I'm afraid of X, I like X etc wobei X ein Name oder irgendeine Gruppe von Worten ist. Wenn ein template mit einer Benutzeräußerung matcht, kann ELIZA auf ein Menge von fertigen Antwort Strukturen zurückgreifen, deren Slots mit den relevanten Teilen der Benutzeräußerung gefüllt werden. Eliza Falls kein Template matcht: ELIZA versucht zu raten, ob eine Äußerung ein Statement, eine Negation oder eine Frage ist. ELIZA verwendet dann Erwiederungen wie: in what way, can you think of a specific example, go on, etc. Beispielkonversation: User ...I like X... Why do you like X? ...I am Y... How long have you been X? ...father... Tell me more about your father Die Worte mother und father haben eine spezielle Rolle im Dialog, dies gemäß der naiven Rezeption der psychoanalytischen Theorie durch die Informatik. Eliza Word Spotting in Prolog: Ein Word-Spotting Programm kann mithilfe von DCG Regeln sehr leicht in Prolog geschrieben werden. Äusserungen werden als Phrasenstrukturregeln modelliert: sie bestehen aus einem Anfang, dem gesuchten Wort oder Pattern und einem Ende: utterance(U) --> beginning(B), [the_word], end(E). Jedes Prädikat hat eine Variable, die mit dem Teil der Äusserung unifiziert, die sie repräsentiert. U wird benutzt, um die Systemantwort zusammenzubauen. Eliza Wir wissen schon: Prolog übersetzt intern die DCG Regeln in Klauseln. Jedem Prädikat werden zwei Argumente hinzugefügt: utterance(U,In,Out) :- beginning(B,In,L2),c(L2,L3),end(E,L3,Out). ??? woher kommt c, bei Leiss Skript nachschauen! Wir hatten schon gesehen, dass eine Regel eine Wortsequenz abdeckt, die der Differenz zwischen Eingabe- und Ausgabeliste entspricht. Etwa In-L2 enspricht "beginning". Um nun B und E auszugeben müssen beginning/3 und end/3 als appendähnliche Prädikate definiert werden. Eliza beginning(X,Y,Z) :- append(X,Z,Y). end(X,Y,Z) :- append(X,Z,Y). ELIZA ist dann eine Schleife, die User Input liest und versucht Äußerungen mit Templates zu matchen. Matcht ein Template wird die entsprechende Antwort gegeben. Siehe Programm.