Einführung
deklarative Programmierung
beruht auf der mathematischen Logik
- Axiome(Fakten, Regeln), Situation(was gilt)
- Axiome enthalten die gesamte Datenbasis
- Anfrage, Ziel
- Interpreter, weitere Regeln herleiten
Lösungsmethode
- Tiefensuche mit Unifikation und Resolution
- Ziel: Variablenbelegungen
- Positive Antwort: eine gültige Belegung
- Negative Antwort: kann nicht aus Datenbasis abgegeben
Sprache Syntax
Begriffe
- Programm
- Prädikate(predicates), allgemeiner als Funktionen
- Klauseln(clauses)
- Literalen(literals)
- Terme(terms)
- Eine Klausel kann entweder ein Fakt(fact), Regel(rule) oder eine Anfrage(query, goal) sein
- Closed-world assumption: Datenbasis und sonst nichts gilt
Fakt: Aussage, die wahr ist
Regel: head :- body.
- Implikation :-
- Konjunktion logisches UND ,
- Disjunktion logisches ODER ;
- Fakt entspricht Regel: body = true
Terme
- Zahlen
- Individuenkonstanten: luke, `apple`, australia
- Strings: "Hallo."
- Listen
- Variablen: Starten mit Großbuchstaben oder Unterstrich: X, _Student
- Funktoren
- Basisterm: hat keine Variablen
Variablen
- Singletons: nur einmal auftauchen
- gebundene Varialen: mehrfach auftauchen, also verwendet werden
- Anonyme Variable: `_`
Anfragen ?-
- ?- father(anakin, _). true.
- ?- father(shim, X). X=luke; X=leia; false.
Funktoren
- Funktor zur expliziten Benennung eines Arguments
- Funktor zur Zusammenfassung von zusammengehörigen Termen (Daten)
- Namen von Funktoren können keine Variablen sein
Arithmetik
- and(,), or(), implies(:-), not(\+)
- Zahlen: Numerisch gleich(=:=), ungleich(=\=), <, >, =<, >=
- Unifizierbar(=), nicht unifizierbar(\=): Test ob ein Term in den anderen umgewandelt werden kann
- identisch(==), nicht identisch(\==): Test ob zwei Terme gleich sind
- Grundrechenarten +, -, *, /, mod
- Zuweisung: is
Listen
- [], [Head(Element(e))|Tail(Liste)]
Listenoperationen
- is_list(L).
- length(List, Length).
- member(E, List).
- delete(List1, E, List2).
- append(L1, L2, L1_2).
Unifikation und Resolution
Unifikation Beispiele
?- gleich = gleich.
true.
?- X = gleich.
true.
?- father(ana, luke) = father(ana, X).
X=luke.
?- A=f(A).
A=f(A). /*Zyklischer Term erzeugt unendlichen Baum.*/
Unifizierbar
- Sie beide dieselbe individuenkonstante sind
- Einer von ihnen eine freie Variable ist
- Komplexe Term:
- Funktor derselbe
- die Anzahl parameter ist gleich (Stelligkeit)
- deren Argumente paarweise unifizierbar
Resolution
- Lösungsbaum erzeugen
- Tiefensuche
- Bei Misserfolg: Backtracking zur letzten Entscheidung
- "false" möglich durch Closed-World-Assumption (Alles, was also nicht modelliert ist, existiert im Modell auch nicht und ist nicht beweisbar, also falsch, das heißt nicht ableitbar.)
Rekursion
Beispiel 1
cntAncestor(A, B, cnt, Erg) :- parent(A, B), Erg = Cnt.
cntAncestor(A, B, cnt, Erg) :- parent(A, A_B), Cnt1 is Cnt + 1, cntAncestor(A_B, B, Cnt1, Erg).
?- cntAncestor(shmi, luke, 1, Erg). /*inkrementieren*/
Erg = 2.
Beispiel 2
cntAncestor(A, B, 1) :- parent(A, B).
cntAncestor(A, B, Erg) :- parent(A, A_B), cntAncestor(A_B, B, Erg1), Erg is Erg1 + 1.
Beispiel 3
fak(0, 1).
fak(N, F) :- N1 is N - 1, fak(N1, F1), F is N * F1./*F ist das Ergebnis. Ergebnis wird nach dem Rekursionsschritt aktualisiert.*/
Nicht-rekursive Literale vor rekursivem Literal
Zyklische Daten
Beispel
knows(A, B, _) :- friend(A, B).
knows(A, B, Visited) :- friend(A, C), \+ member(C, Visited), knows(C, B, [A|Visited]). /*merke Zwischenwert*/
?- knows(jim, johnny, [ ]).
true;
false
Vordefinierte Prädikate
write(X).
findall(X, G, L).
setof(X, G, L). /*set: sortieren*/