Verschachtelte Listen, Differenzlisten, Graphen Prolog Grundkurs WS 99/00 Christof Rumpf rumpf@uni-duesseldorf.de

  • View
    103

  • Download
    0

Embed Size (px)

Text of Verschachtelte Listen, Differenzlisten, Graphen Prolog Grundkurs WS 99/00 Christof Rumpf...

  • Folie 1
  • Verschachtelte Listen, Differenzlisten, Graphen Prolog Grundkurs WS 99/00 Christof Rumpf rumpf@uni-duesseldorf.de
  • Folie 2
  • 29.11.99GK Prolog - Verschachtelte Listen, Differenzlisten, Graphen 2 Listenverarbeitung bisher member/2 append/3 delete/3 reverse/2 reverse/3 permute/2 sort/2 qs/2 partition/4 Listenelemente finden Listen konkatenieren Listenelemente lschen/einfgen Liste umkehren (naiv) Liste umkehren (mit Akkumulator) Liste permutieren (n!) Liste permutationssortieren (n!) Liste mit Quicksort sortieren (n log n) Liste in Teillisten partitionieren
  • Folie 3
  • 29.11.99GK Prolog - Verschachtelte Listen, Differenzlisten, Graphen 3 deleteall/3 % deleteall(Term,Liste1,Liste2) deleteall(_,[],[]). deleteall(X,[X|T1],L):- deleteall(X,T1,L). deleteall(X,[H|T1],[H|T2]):- X \= H, deleteall(X,T1,T2). Termination Lsche X aus Kopf Lsche X aus Rest T1 Behalte Kopf H, falls H X Lsche X aus Rest T1 deleteall/3 lscht alle Vorkommen eines Terms aus einer Liste, whrend delete/3 genau ein Vorkommen eines Terms lscht und scheitert, wenn der Term nicht vorkommt.
  • Folie 4
  • 29.11.99GK Prolog - Verschachtelte Listen, Differenzlisten, Graphen 4 makeset/3 % makeset(Liste1,Liste2) makeset([],[]). makeset([H|T1],[H|T2]):- deleteall(H,T1,L), makeset(L,T2). Termination. Behalte Kopf H. Lschen aller H aus T1 liefert L. Entferne alle Duplikate aus L. makeset/2 entfernt mit Hilfe von deleteall/3 alle Duplikate aus Liste1 und liefert Liste2 als Ergebnis.
  • Folie 5
  • 29.11.99GK Prolog - Verschachtelte Listen, Differenzlisten, Graphen 5 Verschachtelte Listen Als Listenelemente knnen beliebige Terme auftreten, also auch Listen. [1,2,3,[a,b,[x,y],c],4,5,[],6] Die Verarbeitung von Listen von Listen erfordert hufig doppelte Rekursion, soda bei einer Zerlegung nicht nur der Rest, sondern auch der Kopf rekursiv weiterverarbeitet wird.
  • Folie 6
  • 29.11.99GK Prolog - Verschachtelte Listen, Differenzlisten, Graphen 6 Verflachen von Listen Das Prdikat flatten/2 wandelt eine verschachtelte Liste in flache Liste um. ?- flatten([1,2,3,[a,b,[x,y],c],4,5,[],6],L). L = [1,2,3,a,b,x,y,c,4,5,6] yes
  • Folie 7
  • 29.11.99GK Prolog - Verschachtelte Listen, Differenzlisten, Graphen 7 flatten/2 %flatten(VerschachtelteListe, FlacheListe) flatten([],[]). flatten([H|T],FL):- flatten(H,FH), flatten(T,FT), append(FH,FT,FL). flatten(X,[X]):- X \= [], X \= [_|_]. Leere Liste ist schon flach. Zerlege verschachtelte Liste. Verflache Kopf. Verflache Rest. Konkateniere verflachten Kopf und Rest zu Ergebnis. Term in flache Liste packen, falls Term keine Liste ist.
  • Folie 8
  • 29.11.99GK Prolog - Verschachtelte Listen, Differenzlisten, Graphen 8 Effizienz von flatten/2 flatten/2 hat nach dem zweiten rekursiven Aufruf einen Aufruf von append/3. Dies drckt die Performance hnlich nach unten, wie wir es schon beim naiven reverse/2 gesehen haben. Verbesserung: flatten/3 mit Akkumulator!
  • Folie 9
  • 29.11.99GK Prolog - Verschachtelte Listen, Differenzlisten, Graphen 9 flatten/3 flatten(VL,FL):- flatten(VL,[],FL). flatten([],[],[]). flatten([],[H|Acc],FL):- flatten(H,Acc,FL). flatten([H|T],Acc,FL):- is_list(H), flatten(H,[T|Acc],FL). flatten([H|T1],Acc,[H|T2]):- not is_list(H), flatten(T1,Acc,T2). flatten/2 ruft flatten/3 auf. Initialisierung des Akkumulators. Termination. Falls verschachtelte Liste leer, verflache Kopf des Akkumulators. Falls Kopf von VL nichtleere Liste, nimm Rest von VL in Akkumulator und verflache H. Falls Kopf von VL keine Liste ist, bernimm den Kopf in flache Liste und verflache Rest von VL.
  • Folie 10
  • 29.11.99GK Prolog - Verschachtelte Listen, Differenzlisten, Graphen 10 is_list/1 Das Prdikat is_list/1 ist beweisbar, wenn das Argument eine leere oder nichtleere Liste ist. is_list([]). is_list([_|_]). Aus Effizienzgrnden verzichten wir auf Korrektheit fr is_list/1, indem wir auf den rekursiven is_list/1 -Beweis fr Restlisten nichtleerer Listen verzichten.
  • Folie 11
  • 29.11.99GK Prolog - Verschachtelte Listen, Differenzlisten, Graphen 11 (2) CALL: flatten([1,2,3,[a,b,[x,y,z],c],4,[],5,6], [], _0098) ? > (5) CALL: flatten( [2,3,[a,b,[x,y,z],c],4,[],5,6], [], _0AB8) ? > (8) CALL: flatten( [3,[a,b,[x,y,z],c],4,[],5,6], [], _0C14) ? > (11) CALL: flatten( [[a,b,[x,y,z],c],4,[],5,6], [], _0D70) ? > (13) CALL: flatten( [a,b,[x,y,z],c], [[4,[],5,6]], _0D70) ? > (16) CALL: flatten( [b,[x,y,z],c], [[4,[],5,6]], _11E4) ? > (19) CALL: flatten( [[x,y,z],c], [[4,[],5,6]], _1340) ? > (21) CALL: flatten( [x,y,z], [[c],[4,[],5,6]], _1340) ? > (24) CALL: flatten( [y,z], [[c],[4,[],5,6]], _17B4) ? > (27) CALL: flatten( [z], [[c],[4,[],5,6]], _1910) ? > (30) CALL: flatten( [], [[c],[4,[],5,6]], _1A6C) ? > (34) CALL: flatten( [], [[4,[],5,6]], _1D00) ? > (35) CALL: flatten( [4,[],5,6], [], _1D00) ? > (38) CALL: flatten( [[],5,6], [], _1F94) ? > (40) CALL: flatten( [], [[5,6]], _1F94) ? > (41) CALL: flatten( [5,6], [], _1F94) ? > (44) CALL: flatten( [6], [], _2540) ? > (47) CALL: flatten( [], [], _269C) ? > (47) EXIT(N): flatten( [], [], []) (44) EXIT(N): flatten( [6], [], [6]) (41) EXIT(N): flatten( [5,6], [], [5,6]) (40) EXIT(N): flatten( [], [[5,6]], [5,6]) (38) EXIT(N): flatten( [[],5,6], [], [5,6]) (35) EXIT(N): flatten( [4,[],5,6], [], [4,5,6]) (34) EXIT(N): flatten( [], [[4,[],5,6]], [4,5,6]) (31) EXIT(N): flatten( [c], [[4,[],5,6]], [c,4,5,6]) (30) EXIT(N): flatten( [], [[c],[4,[],5,6]], [c,4,5,6]) (27) EXIT(N): flatten( [z], [[c],[4,[],5,6]], [z,c,4,5,6]) (24) EXIT(N): flatten( [y,z], [[c],[4,[],5,6]], [y,z,c,4,5,6]) (21) EXIT(N): flatten( [x,y,z], [[c],[4,[],5,6]], [x,y,z,c,4,5,6]) (19) EXIT(N): flatten( [[x,y,z],c], [[4,[],5,6]], [x,y,z,c,4,5,6]) (16) EXIT(N): flatten( [b,[x,y,z],c], [[4,[],5,6]], [b,x,y,z,c,4,5,6]) (13) EXIT(N): flatten( [a,b,[x,y,z],c], [[4,[],5,6]], [a,b,x,y,z,c,4,5,6]) (11) EXIT(N): flatten( [[a,b,[x,y,z],c],4,[],5,6], [], [a,b,x,y,z,c,4,5,6]) (8) EXIT(N): flatten( [3,[a,b,[x,y,z],c],4,[],5,6], [], [3,a,b,x,y,z,c,4,5,6]) (5) EXIT(N): flatten( [2,3,[a,b,[x,y,z],c],4,[],5,6], [], [2,3,a,b,x,y,z,c,4,5,6]) (2) EXIT(N): flatten([1,2,3,[a,b,[x,y,z],c],4,[],5,6], [],[1,2,3,a,b,x,y,z,c,4,5,6])
  • Folie 12
  • 29.11.99GK Prolog - Verschachtelte Listen, Differenzlisten, Graphen 12 Graphen Viele Probleme lassen sich graphentheoretisch modellieren. Ein Graph ist ein mathematisches Objekt mit klar definierten Eigenschaften und Methoden. Bume sind Graphen mit speziellen Eigenschaften. Wir nhern uns jetzt Bumen an, indem wir von gerichteten Graphen ber DAGs zu geordneten Bumen kommen.
  • Folie 13
  • 29.11.99GK Prolog - Verschachtelte Listen, Differenzlisten, Graphen 13 Gerichteter Graph Ein gerichteter Graph G ist ein Tupel, wobei N(odes) eine Menge von Knoten und E(dges) eine Menge E N N von Kanten ist. G 1 =,,,,, }> a b c d e
  • Folie 14
  • 29.11.99GK Prolog - Verschachtelte Listen, Differenzlisten, Graphen 14 Prolog-Reprsentation: Graph als Fakten: node(a).... node(e). edge(a,b).... edge(d,a). als Struktur: ([a,b,c,d,e], [(a,b),(a,c), (b,d),(d,c), (d,e),(d,a)])
  • Folie 15
  • 29.11.99GK Prolog - Verschachtelte Listen, Differenzlisten, Graphen 15 Transitive Hlle Die transitive Hlle eines Graphen G= ist die Menge H(G) N N, soda gilt: 1. E H(G) 2. H(G) H(G) H(G) Die transitive Hlle liefert uns alle Verbindungen, die zwischen Knoten bestehen.
  • Folie 16
  • 29.11.99GK Prolog - Verschachtelte Listen, Differenzlisten, Graphen 16 Berechnung in Prolog Transitive Hlle fr Faktenreprsentation: closure(X,Y):- edge(X,Y). closure(X,Y):- edge(X,Z), closure(Z,Y) Transitive Hlle fr Listenreprsentation: closure(X,Y,E):- member((X,Y),E). closure(X,Y,E):- member((X,Z),E), closure(Z,Y,E). % E = [(N 1,N 2 ),...,(N i,N k )]
  • Folie 17
  • 29.11.99GK Prolog - Verschachtelte Listen, Differenzlisten, Graphen 17 DAG Ein gerichteter azyklischer Graph (D irected A cyclic G raph ) G = ist ein Graph, fr den gilt: H(G): x y Kein Knoten ist in H(G) mit sich selbst verbunden.
  • Folie 18
  • 29.11.99GK Prolog - Verschachtelte Listen, Differenzlisten, Graphen 18 Bume Ein DAG G = ist ein Baum, wenn gilt: x,y,z N: E E x = y Jeder Knoten in einem Baum hat maximal einen Vorgnger.
  • Folie 19
  • 29.11.99GK Prolog - Verschachtelte Listen, Differenzlisten, Graphen 19 Geordnete Bume Ein geordneter Baum G = ist ein Baum mit einer totalen Ordnungsrelation O N N, soda gilt: x,y,z N: E E y z O O Die unmittelbaren Nachfolger eines Knotens stehen in einer linearen Ordnung.
  • Folie 20
  • 29.11.99GK Prolog - Verschachtelte Listen, Differenzlisten, Graphen 20 Beispiel Syntaxbaum S NP VP Det N V NP Jeder Mann liebt Det N eine Frau Zwei Relationen: unmittelbare Dominanz zwischen Mutter- und Tochterknoten lineare Przedenz zwischen Tocherknoten
  • Folie 21
  • 29.11.99GK Prolog - Verschachtelte Listen, Differenzlisten, Graphen 21 Lineare Reprsentation in Prolog als Struktur: s(np(det(jeder),n(mann)), vp(v(liebt),np(det(eine),n(frau)))) als Liste: [s, [np, [det, [jeder]], [n, [mann]]], [vp, [v, [liebt]], [np, [det, [eine]], [n, [frau]]]]]
  • Folie 22
  • 29.11.99GK Prolog - Verschachtelte Listen, Differenzlisten, Graphen 22 Univ Strukturen und Listen knnen ineinander berfhrt werden. Prolog stellt dazu das eingebaute Prdikat =.. (Univ) zur Verfgung. ?- det(ein) =.. L.?- np(det(ein),n(mann)) =.. L. L = [det,ein], yesL = [np,det(ein),n(mann)] ?- S =.. [det,ein]. S = det(ein), yes Allgemein: p(A 1,...A n