Standardparadigmen: Deklarative Sprachen

Werbung
Teil 3
Standardparadigmen:
Deklarative Sprachen
● funktionales Programmieren: Lisp 1.5
● logisches Programmieren: Prolog
● relationales Programmieren: Datalog
Prof. Dr. Gerhard Goos, Dr. Sabine Glesner
Höhere Programmiersprachen WS 2004/05 (3. Foliensatz: Deklaraktive Sprachen)
1
Inhaltsübersicht HPS WS 2004/05
- Grundlagen (1,2)
- Konzepte imperativer Programmiersprachen (3,4)
- Deklarative Programmiersprachen (4)
- Objektorientierte Programmiersprachen (5,6)
- Programmierung von Smart Cards: Java Card (7)
- Wissenschaftliches Rechnen: Fortran (8)
- Wirtschaftsanwendungen: Cobol (8, 9)
- Skriptsprachen (9)
- Formale Semantik
- Operationale Semantik mit ASMs (10)
- Operationale Semantik mit natürlicher Semantik und SOS (11)
- Denotationelle Semantik (12, 13)
- Axiomatische Semantik (14)
Lisp 1.5
Urform von Lisp (und aller funktionaler Sprachen)
● Datenstruktur: Listen (eigentlich Bäume), Atome
● keine Operationen auf Atomen außer Vergleich, Test
● Programme sind symbolische Ausdrücke S (S-Ausdrücke), repräsentiert als Listen
● Programme zur Laufzeit modifizierbar
·
Atom: Zeichenreihe z ∈ S, spezielle Zeichenreihe nil ∈ S,
Baum: x,y ∈ S: cons [x,y] = (x . y) ∈ S
x
·
x
Liste: [x1,x2,x3,...,xn] = (x1 x2 x3 ... xn ) = (x1 . (x2 . (x3 . (...(xn . nil)...) )))
·
y
1
leere Liste : [ ] = nil
x
·
Funktionen zur Manipulation von Listen und Atomen:
2
atom, eq, car, cdr, cons
x
···
Grundoperationen:
3
·
●
[[lambda ,x], y] = ((lambda x) y) entspricht λx .y
Currying als abkürzende Schreibweise: λx .(λy.z)=λxy.z
xn
●
(quote x) = 'x entspricht Zeichenreihe x (nicht der Term x!)
●
(label n x) entspricht n = x
■
( cond (x1,y1), (x2,y2),..., (xn,yn)) entspricht if x1≠nil then y1 else (cond (x2,y2),...,(xn,yn))
●
Interpretierer eval berechnet symbolische Ausdrücke durch α-, β-, η−Konversion
Literatur:
● John McCarthy: Comm. of the ACM 3(1960), Nr. 4, 184-195
● McCarthy et al.: Lisp 1.5 Programmer's Manual. MIT Press 1965
Prof. Dr. Gerhard Goos, Dr. Sabine Glesner
Höhere Programmiersprachen WS 2004/05 (3. Foliensatz: Deklaraktive Sprachen)
3
nil
Grundfunktionen
t bezeichnet beliebigen Wert ≠ nil (nil= falsch, t= wahr)
atom: S → BOOL
atom [(x . y)]= nil
● atom [X] = t
eq: Atom × Atom → BOOL
eq [X,Y] = nil
● eq [X,X] = t
car: S → S
● car [(x . y)] = x
cdr: S → S
● cdr [(x . y)] = y
cons: S × S → S
● cons[x,y] = (x . y)
Alle nicht angegebenen Fälle liefern nil, insbesondere eq angewandt auf Listen
Lisp 1 war die erste verbreitete Sprache mit automatischer Speicherbereinigung!
Prof. Dr. Gerhard Goos, Dr. Sabine Glesner
Höhere Programmiersprachen WS 2004/05 (3. Foliensatz: Deklaraktive Sprachen)
4
heutige LISP Dialekte
●
Common LISP: mächtige Sprache für größere Anwendungen
G. L. Steele (ed.): Common Lisp: The Language. Second Edition.
Digital Press, 1990, verfügbar unter http://www-2.cs.cmu.edu/afs/
cs.cmu.edu/project/ai-repository/ai/html/cltl/cltl2.html
●
Online-Dokumentation:
http://www.lispworks.com/reference/HyperSpec/Front/index.htm
●
Scheme: Standard-Programmiersprache an vielen amerikanischen Universitäten
H. Abelson, G. J. Sussman, J. Sussman: Struktur und Interpretation
von Computerprogrammen. Springer-Verlag, 3. Aufl. 1998
●
Emacs-LISP: Sprache zur Programmierung des Emacs-Systems
●
Liste mit freien Lisp-Implementierungen:
http://www-2.cs.cmu.edu/afs/cs/project/ai-repository/ai/lang/lisp/impl/0.html
Prof. Dr. Gerhard Goos, Dr. Sabine Glesner
Höhere Programmiersprachen WS 2004/05 (3. Foliensatz: Deklaraktive Sprachen)
5
Emacs Lisp
LaTeX-Filter
(find-file (getenv "INFILE"))
(replace-string "
" "|NeueZeile|" nil)
(beginning-of-buffer)
(replace-string "|NeueZeile| |NeueZeile|" "|Absatz|" nil)
(beginning-of-buffer)
(replace-regexp "\\\\cite{[^#]*}" "" nil) (beginning-of-buffer)
...
Prof. Dr. Gerhard Goos, Dr. Sabine Glesner
Höhere Programmiersprachen WS 2004/05 (3. Foliensatz: Deklaraktive Sprachen)
6
Emacs Lisp
Türme von Hanoi
(defun hanoi (n von nach zwischen)
(cond
( (= n 1) (move von nach) )
( (> n 1)
(hanoi (n-1) von zwischen nach)
(move von nach)
(hanoi (n-1) zwischen nach von)
)
)
(defun show-move (von nach) ... )
Prof. Dr. Gerhard Goos, Dr. Sabine Glesner
Höhere Programmiersprachen WS 2004/05 (3. Foliensatz: Deklaraktive Sprachen)
7
Der Sündenfall: Zuweisungen in Lisp
Alle heutigen Versionen von Lisp (Emacs Lisp, Scheme, Common Lisp, ...)
erlauben Zuweisungen:
Variablenvereinbarung (in Emacs Lisp):
(defvar variable)
oder
(defvar variable anfangswert)
oder
(defvar variable anfangswert ''Dokumentation'')
Zuweisung:
(setq variable wert)
Bedeutung: variable zeigt auf wert (keine Kopie!)
Prof. Dr. Gerhard Goos, Dr. Sabine Glesner
Höhere Programmiersprachen WS 2004/05 (3. Foliensatz: Deklaraktive Sprachen)
8
Grundprinzipien funktionaler
Sprachen
●
●
●
●
●
●
●
●
●
●
Berechnungsmodell: Reduktion von Ausdrücken wie in Lisp
Programm ist Folge von Funktionsdefinitionen und ein Ausdruck
Schreibweise angelehnt an übliche mathematische Schreibweisen
Programm und Daten getrennt
Grundtypen: Listen, Terme, übliche Grundtypen (Bool, Int, ...);
darauf aufbauend reichhaltiger Typverband
starke Typisierung, Verwendung von Typinferenz
mehrere Definitionen des gleichen Funktionsbezeichners möglich,
Auswahl der Funktionsdefinition bei Anwendung durch
Typinferenz und Durchmustern der Parameterlisten, um die erste
auf die Argumente zutreffende Definition zu finden: Durchmustern
in der Reihenfolge des Aufschreibens
zentraler Unterschied zwischen Sprachen: strikte (ML) und
faule (Haskell, Gofer) Auswertung von Argumenten
unterschiedlich gestaltete Modulkonzepte
parametrische Polymorphie
Prof. Dr. Gerhard Goos, Dr. Sabine Glesner
Höhere Programmiersprachen WS 2004/05 (3. Foliensatz: Deklaraktive Sprachen)
9
ML, Haskell und Gofer
Die meisten funktionalen Sprachen (außer Lisp) haben im Kern identische Syntax
Türme von
Hanoi
move 1 i j k = i ++
move n i j k =
(move (n-1) i
i ++ "-->" ++
(move (n-1) j
"-->" ++ k ++ "\n"
k j) ++
k ++ "\n"
i k)
++
hanoi 0 = "Ja Ja!"
hanoi n = move n "A" "B" "C"
Prof. Dr. Gerhard Goos, Dr. Sabine Glesner
Höhere Programmiersprachen WS 2004/05 (3. Foliensatz: Deklaraktive Sprachen)
10
Addition von Binärzahlen mit Listen
Integer
addr xs [] [] = xs
addr [] ys [] = ys
addr xs [] "1" = addr xs "1" []
addr [] ys "1" = addr ys "1" []
addr ('0':xs) ('0':ys) []=
concat ["0", (addr xs ys [])]
addr ('0':xs) ('1':ys) []=
concat ["1", (addr xs ys [])]
...
addr ('1':xs) ('1':ys) "1" =
concat ["1", (addr xs ys "1")]
add x y =
reverse (addr(reverse x)(reverse y)[])
Prof. Dr. Gerhard Goos, Dr. Sabine Glesner
Höhere Programmiersprachen WS 2004/05 (3. Foliensatz: Deklaraktive Sprachen)
11
Boolesche Funktionen
Boolean
wahr t f = t
falsch t f = f
if-then-else b t f = b t f
und a b = if-then-else a
(if-then-else b wahr falsch)
falsch
oder a b = if-then-else a
wahr
(if-then-else b wahr falsch)
nicht a = if-then-else a falsch wahr
xoder a b = if-then-else a
(if-then-else b falsch wahr)
(if-then-else b wahr falsch)
Prof. Dr. Gerhard Goos, Dr. Sabine Glesner
Höhere Programmiersprachen WS 2004/05 (3. Foliensatz: Deklaraktive Sprachen)
12
Addition von Binärzahlen mit
Funktionen höherer Ordnung
Integer
bit '0' = falsch bit '1' = wahr
tib a = if-then-else a '1' '0'
plus x y z = xoder (xoder x y) z
ueber x y z = oder(und x z)(oder(und x y)(und y z))
addr xs [] '0' = xs
...
addr [] ys '1' = addr ys "1" '0'
addr (x:xs) (y:ys) z = concat [
[(tib(plus (bit x)(bit y)(bit z)))],
(addr xs ys (tib(ueber(bit x)(bit y)(bit z))))]
add x y=reverse(addr(reverse x)(reverse y)'0')
Prof. Dr. Gerhard Goos, Dr. Sabine Glesner
Höhere Programmiersprachen WS 2004/05 (3. Foliensatz: Deklaraktive Sprachen)
13
Anwendung Funktionen höherer
Ordnung
Faltung
Linksfaltung ( f , x , ( y1 , y2 , ... , yn-1 , yn,) ) =
f ( f ( ... f ( f ( x , y1 ) , y2 ) ... ) , yn-1) , yn)
foldl f x [] = x
foldl f x (y:ys) = foldl f (f x y) ys
sum = foldl (+) 0
product = foldl ( ) 1
Prof. Dr. Gerhard Goos, Dr. Sabine Glesner
Höhere Programmiersprachen WS 2004/05 (3. Foliensatz: Deklaraktive Sprachen)
14
Abstrakte Datentypen
Konstruktoren:
● data X = Konstr_1 | ... | Konstr_n
Operationen:
● op_1:: X-> Typ_1_1->...-> Typ_1_k
...
op_m:: X-> Typ_m_1->...-> Typ_m_l
Axiome:
● op_1 = ... op_m = ...
Prof. Dr. Gerhard Goos, Dr. Sabine Glesner
Höhere Programmiersprachen WS 2004/05 (3. Foliensatz: Deklaraktive Sprachen)
15
ADT Keller
data IntKeller =
EmptyStack |
Push (Int, IntKeller)
isEmpty :: IntKeller -> Bool
top :: IntKeller -> Int
pop :: IntKeller -> IntKeller
isEmpty EmptyStack = True
isEmpty Push (Int, s) = False
top Push (i s) = i
pop Push (i s) = s
Prof. Dr. Gerhard Goos, Dr. Sabine Glesner
Höhere Programmiersprachen WS 2004/05 (3. Foliensatz: Deklaraktive Sprachen)
16
Polymorphie
Parametrische Polymorphie
data Stack t = EmptyStack
Push (t, Stack t)
istLeer :: Stack t -> Bool
top :: Stack t -> t
pop :: Stack t -> Stack t
isEmpty EmptyStack = True
isEmpty Push (i, s) = False
top Push (i s) = i
pop Push (i s) = s
Prof. Dr. Gerhard Goos, Dr. Sabine Glesner
Höhere Programmiersprachen WS 2004/05 (3. Foliensatz: Deklaraktive Sprachen)
17
Typisierung
Einsetzen eines Typs in die Typvariable ergibt neuen Typ
Muß konsistent sein
Achtung: Konstruktorterme können nicht weiter ausgewertet werden!
Also sind sie keine Ausdrücke aus imperativen Sprachen, sondern Terme.
Typ Stack Int:
Push ( 1 Push ( 2 Push ( 3 Empty )))
Typ - Fehler:
Push ( 1 Push ( True Push ( 3 Empty )))
Prof. Dr. Gerhard Goos, Dr. Sabine Glesner
Höhere Programmiersprachen WS 2004/05 (3. Foliensatz: Deklaraktive Sprachen)
18
Prolog
Prolog
entworfen von Alain Colmerauer (Marseille) ~1970
Grundlage: Horn-Logik und Resolutionskalkül (J. Alan Robinson, Robert Kowalski)
W. F. Clocksin, C. S. Mellish: Programming in Prolog. Springer Verlag
Prof. Dr. Gerhard Goos, Dr. Sabine Glesner
Höhere Programmiersprachen WS 2004/05 (3. Foliensatz: Deklaraktive Sprachen)
19
Entscheidbarkeit
Unentscheidbar:
● Gültigkeit prädikatenlogischer Formeln
● Erfüllbarkeit prädikatenlogischer Formeln
Semi-entscheidbar (berechenbar):
● Unerfüllbarkeit prädikatenlogischer Formeln
● Algorithmus terminiert, wenn Formel nicht erfüllbar
● Resolution, Substitution und Unifikation
Prof. Dr. Gerhard Goos, Dr. Sabine Glesner
Höhere Programmiersprachen WS 2004/05 (3. Foliensatz: Deklaraktive Sprachen)
20
Grundbegriffe
Klausel: K = ∀x1, ... , xn K*
K* = P1 ∨ P2 ∨ ... ∨ Pm, Pi ist Literal ,
d.h. elementares Prädikat (Atom) Pi = Li(x1,..., xn) oder negiertes Atom
Schreibweise: Allquantor ∀x1, ... , xn weglassen, wird stillschweigend angenommen
Eine Klausel heißt eine Horn-Klausel,
wenn alle Atome negiert sind bis auf höchstens eines:
¬ L1 ∨ ¬ L2 ∨ ... ∨ ¬ Lm ∨ Q, Q kann fehlen, also
L1 ∧ L2 ∧ ... ∧ Lm → Q (Implikation)
Prolog-Schreibweise:
Implikation: Q(...) :- L1(...), L2(...), ... , Ln(...).
Faktum: Q(...).
Anfrage: ?- A(...).
Prof. Dr. Gerhard Goos, Dr. Sabine Glesner
Höhere Programmiersprachen WS 2004/05 (3. Foliensatz: Deklaraktive Sprachen)
21
Grundidee logischen Programmierens
Idee: Wenn ¬ A(x1,..., xn) nicht erfüllbar ist, gibt es ein Gegenbeispiel,
d.h. eine Belegung der Variablen xi mit Termen ti so,
daß A(t1,..., tn) = ¬ ¬ A(t1,..., tn) wahr ist
Ein Gegenbeispiel wird in endlich vielen Schritten gefunden,
wenn ¬ A(x1,..., xn) nicht erfüllbar. (Grund: Nichterfüllbarkeit ist berechenbar)
Aber: Im umgekehrten Fall (Nicht-Terminierung, ¬ A(x1,..., xn) erfüllbar) kann man
das Fehlschlagen des Beweisversuchs nicht von der Negation unterscheiden!
(negation by failure)
Prof. Dr. Gerhard Goos, Dr. Sabine Glesner
Höhere Programmiersprachen WS 2004/05 (3. Foliensatz: Deklaraktive Sprachen)
22
Beispiel: symbolisches
Differenzieren
|:
|:
|:
|:
|:
diff(X,1,X).
diff(Y,0,_) :- atom(Y).
diff(Y+Z,Dy+Dz,X) :- diff(Y,Dy,X), diff(Z,Dz,X).
diff(Y*Z,Dy*Z+Y*Dz,X) :- diff(Y,Dy,X), diff(Z,Dz,X).
% user compiled 0.02 sec, 888 bytes
Yes
?- diff(a*X+b, D, x).
X = x
D = 0*x+a*1+0
Yes
?- diff(X*X, D, x).
X = x
D = 1*x+x*1
Yes
?- diff(a*X-b, D, x).
No
?Prof. Dr. Gerhard Goos, Dr. Sabine Glesner
Höhere Programmiersprachen WS 2004/05 (3. Foliensatz: Deklaraktive Sprachen)
23
Grundresolution
Klauseln K: disjunktiv verknüpfte Literale
F = ∀x1, ... , xn F*
F* = K1 ∧ K2 ∧ ... ∧ Kn
Ki = P1 ∨ P2 ∨ ... ∨ Pm
F ist unerfüllbar gdw. K1 , K2 , ... , Kt mit
■
Kt ist leere Klausel
Ki< t Grundinstanz
K ∈ F*, Ki = K[x1/t1][x2/t2] ...[xn/tn] | t1, ... ,tn ∈ D(F)
●
Ki<t aussagenlogische Resolvente von Ka<i , Kb<i
●
Prof. Dr. Gerhard Goos, Dr. Sabine Glesner
Höhere Programmiersprachen WS 2004/05 (3. Foliensatz: Deklaraktive Sprachen)
24
Problem
Grundsubstitution nicht vorausschauend
Gierig und daher ineffizient
Minimale Substitution für Resolutionsschritt
● Allgemeiner Unifikator
● Prädikatenlogische Resolution
Prof. Dr. Gerhard Goos, Dr. Sabine Glesner
Höhere Programmiersprachen WS 2004/05 (3. Foliensatz: Deklaraktive Sprachen)
25
Allgemeinster Unifikator
Substitution s ist Unifikator einer Menge L von Literalen { L1, L2, ... ,Lk } wenn
L1s = L2s = ... = Lks
Allgemeinster Unifikator s falls sub = s sub´
s
sub'
sub
Prof. Dr. Gerhard Goos, Dr. Sabine Glesner
Höhere Programmiersprachen WS 2004/05 (3. Foliensatz: Deklaraktive Sprachen)
26
Unifikation
Eingabe L
s:=[]
while |Ls| > 1 do
Finde in Ls Literale L1, L2 die unterschiedlich in Zeichen x, y
if keine Variablen x, y then Ausgabe „Nicht unifizierbar“
else Sei x Variable und y beliebiger Term
if x kommt vor in y then Ausgabe „Nicht unifizierbar“
else s:=s[x/y]
od
Ausgabe s
Prof. Dr. Gerhard Goos, Dr. Sabine Glesner
Höhere Programmiersprachen WS 2004/05 (3. Foliensatz: Deklaraktive Sprachen)
27
Prolog
Hornklauselprogramme
● Tatsachen: T(...).
● Prozedur: P(...) :- Q1 (...), Q2 (...), ... , Qn(...).
● Ziel: ?- Q1 (...), Q2 (...), ... , Qn(...).
Ergebnis eindeutig?
Prof. Dr. Gerhard Goos, Dr. Sabine Glesner
Höhere Programmiersprachen WS 2004/05 (3. Foliensatz: Deklaraktive Sprachen)
28
Beispiel
(1)
(2)
(3)
Frage
Q(X,Z):-Q(Y,Z),R(X,Y).
Q(X,X).
R(b,c).
?-Q(X,c)
Prof. Dr. Gerhard Goos, Dr. Sabine Glesner
Höhere Programmiersprachen WS 2004/05 (3. Foliensatz: Deklaraktive Sprachen)
29
Mögliche SLD Resolutionen
?-Q(X,c)
(2)
(1)
?-Q(Y,c),R(X,c)
Q(c,c)
(2)
(1)
?-Q(V,c),R(Y,V),R(X,c)
?-R(X,c)
●
(1)
(2)
(3)
?-R(Y,c),R(X,c)
Q(b,c)
(3)
?-R(X,c)
Prof. Dr. Gerhard Goos, Dr. Sabine Glesner
Höhere Programmiersprachen WS 2004/05 (3. Foliensatz: Deklaraktive Sprachen)
30
Auswertestrategie
Deterministisch
Tiefensuche
● Nicht vollständig
● Endlosschleifen möglich
● Breitensuche vollständig
„occur check“ ?
Prozedurale Auswertung
Ausgabe weiterer Lösungen
Prof. Dr. Gerhard Goos, Dr. Sabine Glesner
Höhere Programmiersprachen WS 2004/05 (3. Foliensatz: Deklaraktive Sprachen)
31
Cut
Beispiel Hilfs-not Operator
not(X) :- X, !, fail.
not(_).
Prof. Dr. Gerhard Goos, Dr. Sabine Glesner
Höhere Programmiersprachen WS 2004/05 (3. Foliensatz: Deklaraktive Sprachen)
32
Türme von Hanoi
:- use_module(library(lineio)).
hanoi(N):- N >=0, move(N,"A","B","C").
move(0,_,_,_) :- !.
move(1,A,B,_) :put_chars(A),put_chars(" -> "),
put_chars(B), nl, !.
move(N,A,B,C) :- NN is N-1,
move(NN,A,C,B),
move(1,A,B,C),
move(NN,C,B,A).
Prof. Dr. Gerhard Goos, Dr. Sabine Glesner
Höhere Programmiersprachen WS 2004/05 (3. Foliensatz: Deklaraktive Sprachen)
33
Arithmetik Operatoren
pow(1,_,1).
pow(_,0,1).
pow(B,E,X):-is(EE,E-1),
pow(B,EE,Y),mul(B,Y,X).
mul(_,0,0):- !.
mul(0,_,0).
mul(A,B,X):- A < 0,is(AA,-A),
mul(AA,B,Y), is(X,-Y).
mul(A,B,X):- A > 0,is(AA,A-1),
mul(AA,B,Y), is(X,B+Y).
Prof. Dr. Gerhard Goos, Dr. Sabine Glesner
Höhere Programmiersprachen WS 2004/05 (3. Foliensatz: Deklaraktive Sprachen)
34
Flieger
:- assert(fz(Fliege)).
flugzeug(F):- fz(F).
flugzeug(F):put_chars("Ist ein(e)"),write(F),put_chars("ein Flugzeug?"),
get_line(L), L=="j",assert(fz(F)).
flugzeuge(FS):- findall(F,fz(F),FS).
flugzeuge:-flugzeuge(FL),zeige_fz(FL).
zeige_fz([]):- put_line("gibt keine!"), !.
zeige_fz([F]):- put_chars("Ein(e) "),
write(F), put_line("ist ein Flugzeug"),!.
zeige_fz([F FS]):-zeige_fz([F]),zeige_fz(FS).
● ?- flugzeuge.
Ein(e) fliege ist ein Flugzeug
yes
● ?- flugzeug(Maus).
Ist ein(e) Maus ein Flugzeug? j
yes
● ?- flugzeuge.
Ein(e) Fliege ist ein Flugzeug!
Ein(e) Maus ist ein Flugzeug!
yes
● ?- flugzeuge(L).
LGerhard
= [Fliege,Maus
] Höhere Programmiersprachen WS 2004/05 (3. Foliensatz: Deklaraktive Sprachen)
Prof. Dr.
Goos, Dr. Sabine Glesner
35
Datalog
Datalog: Brücke
logisches Programmieren - relationale Algebra
J. D. Ullman: Principles of Database and Knowledge-Base Systems.
Bd. I, Kap. 3 und Bd. II. Computer Science Press 1988
S. Ceri, G. Gotlob, L. Tanca: Logic Programming and Databases, Springer-Verlag, 1990
Prof. Dr. Gerhard Goos, Dr. Sabine Glesner
Höhere Programmiersprachen WS 2004/05 (3. Foliensatz: Deklaraktive Sprachen)
36
Datalog
Einsicht:
● Fakten p(t1,...,tn) definieren Relation p (im Sinne relationaler Algebra)
●
Voraussetzung: für ti nur Konstante oder Variable erlaubt, also nicht f(t'1,...,t'n)
Klauseln q(...) :- q1(...),...,qm(...) definieren Implikation zwischen Relationen
●
●
●
Fakten definieren extentionale Datenbasis (EDB)
Implikationen definieren Sichten (intentionale Datenbasis, IDB)
Datalog: die Sprache deduktiver Datenbanken: wie Prolog, aber mit Einschränkungen:
● EDB und IDB definieren disjunkte Relationen EDB ∩ IDB = ∅
● Keine Funktionssymbole, nur Variable und Konstante als Argumente in Prädikaten
● Hornklausel ist logische Beziehung, keine implizite Ablaufsteuerung wie in Prolog
● alle Klauseln sind sicher:
Sichere Klausel: All-Quantifizierung der Variablen begrenzt auf Konstante in Fakten:
● Variable X heißt begrenzt, wenn sie vorkommt in:
●
benutzerdefiniertem Faktum oder in Form X=a, a konstant,
●
Form X=Y und Y ist begrenzt.
Datalog kann wesentlich effizienter verarbeitet werden als Prolog
Prof. Dr. Gerhard Goos, Dr. Sabine Glesner
Höhere Programmiersprachen WS 2004/05 (3. Foliensatz: Deklaraktive Sprachen)
37
Beispiele unbegrenzter Variabler
größer als(X,Y) :- X>Y.
vater(A,B) :- mann(A) .
X,Y unbegrenzt, da ,,X>Y`` eingebaut, nicht benutzerdefiniert.
A begrenzt, B unbegrenzt.
Intuitive Idee: Aussagen können nur aus Fakten abgeleitet werden und
sich nur auf Terme (Variable/Konstante) beziehen,
die dort vorkommen; daher Beschränkung auf sichere Fakten.
● sichere Fakten ohne Funktionssymbole: relationale Algebra
● zusätzliche Implikationsklauseln: deduktive Datenbanken
Prof. Dr. Gerhard Goos, Dr. Sabine Glesner
Höhere Programmiersprachen WS 2004/05 (3. Foliensatz: Deklaraktive Sprachen)
38
Wiederholung relationale Algebra
gegeben: Relationen
R(A,B,C) = { (a,b,c), (d,a,f), (c,b,d) }
S(A,B,D) = { (d,a,g), (d,a,c), (c,b,g) }
● Projektion:
π A,B (R) = { (a,b), (d,a), (c,b) }
● Selektion:
σ B=b (R) = { (a,b,c), (c,b,d) }
● natürlicher Verbund (join):
>< (R , S) = R >< S = { (d,a,f,g), (d,a,f,c), (c,b,d,g) }
Prof. Dr. Gerhard Goos, Dr. Sabine Glesner
Höhere Programmiersprachen WS 2004/05 (3. Foliensatz: Deklaraktive Sprachen)
39
Reduktion Datalog → relationale Algebra
Nichtrekursive Klauseln
nicht-rekursiv: Implikation q(...) :- q1(...),...,qm(...) hängt weder direkt noch
indirekt von q(...) ab
●
Implikationen qj(...) :- ..., qi(...), ... können so angeordnet werden, daß i < j
●
Konjunktion des Rumpfs ..., qi(...), ... bildet eine Relation r(...),
nämlich den natürlichen Verbund q1(...) >< ... >< qm(...) des Rumpfs
●
Argumente: die im Rumpf vorkommenden Variablen
Wegen Anordnung ist r ohne Rückgriff auf Kopf qj(...) berechenbar
●
Wegen Begrenztheit kommen alle Variablen X in qj(...,X,...) auch in r vor
●
also: Kopf qj(...) ist Relation seiner Variablen und ergibt sich durch Projektion
●
des Rumpfs r auf diese Variablen
bei mehreren Rümpfen zum gleichen Kopf:
Vereinigung, d.h. Disjunktion der Rümpfe bilden
●
Einsicht: nicht-rekursive Implikation ist zusammengesetzte
Operation der Relationenalgebra
Prof. Dr. Gerhard Goos, Dr. Sabine Glesner
Höhere Programmiersprachen WS 2004/05 (3. Foliensatz: Deklaraktive Sprachen)
40
Elimination
Umbenennen von Variablen
zusätzliche Literale
● X=Y für gleiche Variablen oder
● X=c für Konstanten.
Prof. Dr. Gerhard Goos, Dr. Sabine Glesner
Höhere Programmiersprachen WS 2004/05 (3. Foliensatz: Deklaraktive Sprachen)
41
2 Relation der Rümpfe
●
gegeben: Klauseln q1, ... , qm
●
natürlichen Verbund der qi
●
Selektion besonderer Prädikate
●
Vergleichsoperationen für Selektion definiert
Prof. Dr. Gerhard Goos, Dr. Sabine Glesner
Höhere Programmiersprachen WS 2004/05 (3. Foliensatz: Deklaraktive Sprachen)
42
3 Relation der Köpfe
●
●
Projektion entsprechend der Variablen im Kopf
Vereinigung der Relationen der Rümpfe: Berechne die Relation für jeden Kopf
wie bei nichtrekursiven Klauseln
Prof. Dr. Gerhard Goos, Dr. Sabine Glesner
Höhere Programmiersprachen WS 2004/05 (3. Foliensatz: Deklaraktive Sprachen)
43
Beispiel
geschwister(X,Y):eltern(X,Z)& eltern(Y,Z)& X/=Y.
vetter(X,Y):eltern(X,Z)& eltern(Y,Z')&
geschwister(Z,Z').
G(X,Y) := πX,Y(σ X¹Y(E(X,Z) >< E(Y,Z)))
V(X,Y) := πX,Y(E(X,Z) >< E(Y,Z) >< G(Z,Z))
Prof. Dr. Gerhard Goos, Dr. Sabine Glesner
Höhere Programmiersprachen WS 2004/05 (3. Foliensatz: Deklaraktive Sprachen)
44
Rekursive Klauseln
Ersetze :- durch =, d.h. jede Implikation setzt sich selbst voraus
● bedenke:
●
rekursive Implikation q(...) :- q1(...),...,qm(...) nur sinnvoll,
wenn es wenigstens eine nicht-rekursive Implikation für das gleiche q(...) gibt
●
daher erfüllt die Lösung des nicht-rekursiven Falls die Gleichung
●
alle weitere Lösungen sind umfangreicher: Halbordnung durch Mengeninklusion
● Gesamtlösung ist minimaler Fixpunkt des Gleichungssystems
● Gesamtlösung durch Iteration berechenbar
(gleiche Methodik wie bei iterativer Lösung von Datenflußgleichungen)
Prof. Dr. Gerhard Goos, Dr. Sabine Glesner
Höhere Programmiersprachen WS 2004/05 (3. Foliensatz: Deklaraktive Sprachen)
45
Beispiel (fortgesetzt)
...
vetter(X,Y):eltern(X,Z)& eltern(Y,Z')& geschwister(Z,Z').
vetter(X,Y):eltern(X,Z)& eltern(Y,Z')& vetter(Z,Z').
V (X,Y) = πX,Y (E (X,Z) >< E (Y,Z) >< G (Z,Z)) ∪
πX,Y (E (X,Z) >< E (Y,Z) >< V (Z,Z))
Prof. Dr. Gerhard Goos, Dr. Sabine Glesner
Höhere Programmiersprachen WS 2004/05 (3. Foliensatz: Deklaraktive Sprachen)
46
Auswertung durch Induktion
Anfang:
●
Initialisiere linke Seiten
●
extensional gegebener Relationen wie definiert
●
intensional gegebener Relationen mit Ø.
● Schritt:
●
Brechne rechte Seiten wie bei nichtrekursiven Relationen
● Wiederhole bis intensionale Relationen fix
● Wohldefiniert weil:
●
Regeln sicher
●
Operationen ( >< , ∪ , ... ) monoton bzgl. ⊆
●
Prof. Dr. Gerhard Goos, Dr. Sabine Glesner
Höhere Programmiersprachen WS 2004/05 (3. Foliensatz: Deklaraktive Sprachen)
47
Negation
Negation, d.h. Übergang zum Mengenkomplement der Relationen
in Datalog nicht erlaubt, da dann minimaler Fixpunkt nicht
eindeutig:
(1) r(1).
(2) p(X) :- r(X) &¬q(X)
(3) q(X) :- r(X) & ¬p(X)
P=R-Q Q=R-P
(S1)
(S2)
P= Ø
P = {1}
Q = {1}
Q= Ø
Minimaler Fixpunkt nicht eindeutig trotz geschlossener Welt.
Mathematische Ursache: Regeln nicht mehr monoton.
Prof. Dr. Gerhard Goos, Dr. Sabine Glesner
Höhere Programmiersprachen WS 2004/05 (3. Foliensatz: Deklaraktive Sprachen)
48
Einschränkung des Verbots der
Negation
●
●
●
Geschichtete (stratified) Negationen in sicheren Regeln
Kopf P und negiertes Literal ¬S im Rumpf,
dann keine transitive Abhängigkeit von P und positivem Literal S.
Minimaler Fixpunkt dann eindeutig.
Prof. Dr. Gerhard Goos, Dr. Sabine Glesner
Höhere Programmiersprachen WS 2004/05 (3. Foliensatz: Deklaraktive Sprachen)
49
Herunterladen