Vorlesungsfolien_12

Werbung
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.
Herunterladen