Datenstrukturen in Prolog

Transcription

Datenstrukturen in Prolog
Datenstrukturen in
Prolog
STUPS
Michael Leuschel
Einfache Terme
• Atome: c, paul, ‘X’, ‘$$_F’, ...
• Ganze Zahlen: 1, 2, ...
• Gleitkommazahlen: 1.0
• Variablen X,Y, ..., _var, ...
Eingebaute Prädikate
• number(N): N integer oder float
• var(T), nonvar(T)
• atom(T)
• atomic(T): T ist atom oder number
• simple(T): atomic oder var
• compound(T): not simple
Unifikation
• =/2, definiert wie ‘=’(X,X).
• unify_with_occurs_check/2
• \=(X,Y): wahr wenn X,Y nicht unifizierbar
• ==, \==
• ?=/2, dif/2 wartet bis ?= wahr
Reine - Unreine
Prädikate
• Kommutativität gilt für reine Prädikate p:
• p(t ,...,t ), fail ≡ fail, p(t ,...,t )
• p(t ,...,t ), X=t,Y=u,... ≡ X=t,Y=u,..., p(t ,...,t )
• =/2, dif/2, ==, \=, \==, var, nonvar, print, nl, ...
1
n
1
n
1
n
(ohne Nebeneffekte)
1
n
Reine - Unreine
Prädikate
• Kommutativität gilt für reine Prädikate p:
• p(t ,...,t ), fail ≡ fail, p(t ,...,t )
• p(t ,...,t ), X=t,Y=u,... ≡ X=t,Y=u,..., p(t ,...,t )
• Rein: =/2, dif/2
• Unrein: ==, \=, \==, var, nonvar, print, nl, ...
1
n
1
n
1
n
1
n
Atome
“Strings”
• atom_codes/2, number_codes/2, name/2
• atom_chars/2, number_chars/2
Komplizierte Terme
• (compound terms)
• Beispiele:
• Records: date(T,M,J)
• Peano Arithmetik: s(s(0))
• Listen: [a,b,c]
• Bäume tree(L, Info, R) ...
Eingebaute Prädikate
• functor/3
• functor(f(a),F,N) ➙ F=f, N=1
• functor(X,f,1) ➙ X=f(_)
• arg/3
• arg(1,f(a),A) ➙ A=a
• =../2
• f(a) =..L ➙ L=[f,a]
Weitere Prädikate
• ground(T)
• copy_term/2
Listen (Wiederholung)
• Leere Liste: Atom ‘[]’
• Nicht leere Liste: .(Head,Tail)
• .(a,[]) = Liste der Länge 1 mit a
• .(a,.(b,.(c,[]))) = Liste der Länge 3
Notationen
• [H|T] steht für .(H,T)
• [H] steht für .(H,[])
• [X,Y] steht für .(X,.(Y,[]))
• [X,Y|T] steht für .(X,.(Y,T))
• usw..
Auf wieviele Arten kann man [a,b] schreiben ?
Prädikate über Listen
• Gleichheit
• Länge (length); gleiche Länge (same_length)
• Last
• Member
• Append
Length: 2 Versionen
mylength([],0).
mylength([_|T],L) :- mylength(T,LT), L is LT+1.
mit Akkumulator:
myla(L,Len) :- myla(L,0,Len).
myla([],X,X).
myla([_|T],Acc,Res) :- NewAcc is Acc+1,
myla(T,NewAcc,Res)
Length: 2 Versionen
[myla([a,b],_377)]
[mylength([a,b],_385)]
[myla([a,b],0,_377)]
[mylength([b],_1351),_385 is _1351+1]
[_2486 is 0+1,myla([b],_2486,_377)]
[mylength([],_2554),_1351 is _2554+1,_385 is _1351+1]
[myla([b],1,_377)]
[_1351 is 0+1,_385 is _1351+1]
[_4819 is 1+1,myla([],_4819,_377)]
[_385 is 1+1]
[myla([],2,_377)]
[]
[]
true
mylength([],0).
mylength([_|T],L) :- mylength(T,LT), L is LT+1.
myla(L,Len) :- myla(L,0,Len).
myla([],X,X).
true
myla([_|T],Acc,Res) :- NewAcc is Acc+1,
myla(T,NewAcc,Res).
Tail Recursion
Optimisation
• Wenn rekursiver Aufruf
• letzter Aufruf in der Klausel ist
• keinen weiteren Klauseln zutreffen
können
• dann wird kein neuer Stack Frame angelegt
Eingebaute Prädikate
• append/3
• length/2, same_length/2
• reverse/2 (library(lists))
• nth1, perm/2, remove_dups, delete, select,
sumlist, prefix, suffix, maplist, ...
Sortieren
• sort/2
• “standard” Term Order:
• @<, @>, @=<, @>=
Binärbäume
• Kein Standard
• Es gibt aber Bibliotheken, zB library(avl):
•
empty_avl, avl_to_list/2, avl_min/2, avl_max/2,
avl_size/2, avl_member/3, avl_fetch/3, avl_store/
4, avl_delete/4, ...
• Selber programmieren:
• Leerer Baum: leer
• Nicht leerer Baum: knoten(L,Info,R)
Prädikate für
Binärbäume
• Information finden finde(Baum,Info)
• Baum nach sortierte Liste konvertieren
• maximale Tiefe eines Baumes berechnen
• insert
Effizienz: Cut
• Cut (!)
• Schneidet weitere Klauseln weg
• Keine weiteren Lösungen links vom !
werden gesucht
• Green Cut: nur Effizienz Verbesserung
• Red Cut:Veränderung des Verhaltens
p(X) :- (X=1 ; X=2 ; X=3), !, print(kl1(X)),nl.
p(4).
Negation mit Cut
not(X) :- call(X),!,fail.
not(_).
• Ist ein “Red Cut”
Effizienz: If-Then-Else
• (Test -> Then ; Else)
• (Test1 -> Then1 ; Test2 -> Then2 ... ;
otherwise -> Else)
• Lokaler Cut: nur eine Lösung für Test (bzw
Test1, Test2,...) wird gefunden
• Etwas sauberer als !
• Manchmal schwer zu lesen
Nochmals member
• Member ohne multiple Lösungen
• member(X,[a,b,a,a,b,a])
• \=, !, (-> ;)
Higher-Order
• call(X)
• Map Square
• explizit
• mit call/2 und =../2
Findall, assert, retract
• findall(Term, Aufruf, ListenErgebnis)
• assert, asserta, assertz
• retract, retractall

Documents pareils