VL11 Logische Programmierung Notiz

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*/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值