Vorlesung 18
This commit is contained in:
parent
13e27ab74e
commit
13e6195c4e
BIN
Assets/Logik-logische-programmierung-einordnung.png
Normal file
BIN
Assets/Logik-logische-programmierung-einordnung.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 232 KiB |
BIN
Assets/Logik-prädikate-suche-fail-2.png
Normal file
BIN
Assets/Logik-prädikate-suche-fail-2.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 96 KiB |
BIN
Assets/Logik-prädikate-suche-fail.png
Normal file
BIN
Assets/Logik-prädikate-suche-fail.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 104 KiB |
BIN
Assets/Logik-prädikate-suche.png
Normal file
BIN
Assets/Logik-prädikate-suche.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 94 KiB |
@ -3013,3 +3013,140 @@ Dies geschieht solange, bis
|
||||
|
||||
Zusätzliche Markierung der Kanten mit der Variablenersetzung (dem Unifikator).
|
||||
|
||||
|
||||
### PROLOG aus prozeduraler Sicht
|
||||
Beispiel: die „Hackordnung“
|
||||
1. chef_von(mueller,mayer).
|
||||
2. chef_von(mayer,otto).
|
||||
3. chef_von(otto,walter).
|
||||
4. chef_von(walter,schulze).
|
||||
5. weisungsrecht(X,Y) :- chef_von(X,Y).
|
||||
6. weisungsrecht(X,Y) :- chef_von(X,Z), weisungsrecht(Z,Y).
|
||||
|
||||
> Deklarative Interpretation
|
||||
In einem Objektbereich $I=\{mueller, mayer, schulze, ...\}$ bildet das Prädikat $weisungsrecht(X,Y)$ $[X,Y]$ auf wahr ab, gdw.
|
||||
- das Prädikat $chef_von(X,Y)$ das Paar $[X,Y]$ auf wahr abbildet oder
|
||||
- es ein $Z\in I$ gibt, so dass
|
||||
- das Prädikat $chef_von(X,Z)$ das Paar $[X,Z]$ auf wahr abbildet und
|
||||
- das Prädikat $weisungsrecht(Z,Y)$ das Paar $[Z,Y]$ auf wahr abbildet.
|
||||
|
||||
> Prozedurale Interpretation
|
||||
Die Prozedur $weisungsrecht(X,Y)$ wird abgearbeitet, indem
|
||||
1. die Unterprozedur $chef_von(X,Y)$ abgearbeitet wird. Im Erfolgsfall ist die Abarbeitung beendet; anderenfalls werden
|
||||
2. die Unterprozeduren $chef_von(X,Z)$ und $weisungsrecht(Z,Y)$ abgearbeitet; indem systematisch Prozedurvarianten beider Unterprozeduren aufgerufen werden.Dies geschieht bis zum Erfolgsfall oder erfolgloser erschöpfender Suche.
|
||||
|
||||
|
||||
| deklarative Interpretation | prozedurale Interpretation |
|
||||
| --- | --- |
|
||||
Prädikat | Prozedur
|
||||
Ziel | Prozeduraufruf
|
||||
Teilziel | Unterprozedur
|
||||
Klauseln mit gleichem Kopfprädikat | Prozedur-varianten
|
||||
Klauselkopf | Prozedurkopf
|
||||
Klauselkörper | Prozedurrumpf
|
||||
|
||||
Die Gratwanderung zwischen Wünschenswertem und technisch Machbarem erfordert mitunter „Prozedurales Mitdenken“, um
|
||||
1. eine gewünschte Reihenfolge konstruktiver Lösungen zu erzwingen,
|
||||
2. nicht terminierende (aber – deklarativ, d.h. logisch interpretiert - völlig korrekte) Programme zu vermeiden,
|
||||
3. seiteneffektbehaftete Prädikate sinnvoll einzusetzen,
|
||||
4. (laufzeit-) effizienter zu programmieren und
|
||||
5. das Suchverfahren gezielt zu manipulieren.
|
||||
|
||||
Programm inkl. Deklarationsteil (BSP3.PRO)
|
||||
```
|
||||
domains
|
||||
person = symbol
|
||||
predicates
|
||||
chef_von(person,person)
|
||||
weisungsrecht(person,person)
|
||||
clauses
|
||||
chef_von(mueller,mayer).
|
||||
chef_von(mayer,otto).
|
||||
chef_von(otto,walter).
|
||||
chef_von(walter,schulze).
|
||||
weisungsrecht(X,Y) :- chef_von(X,Y).
|
||||
weisungsrecht(X,Y) :- chef_von(X,Z), weisungsrecht(Z,Y).
|
||||
goal
|
||||
weisungsrecht(Wer,Wem).
|
||||
```
|
||||
|
||||
Prädikate zur Steuerung der Suche nach einer Folge von Resolutionsschritten!
|
||||
|
||||
!(cut)
|
||||
Das Prädikat $!/0$ ist stets wahr. In Klauselkörpern eingefügt verhindert es ein Backtrack der hinter $!/0$ stehenden Teilziele zu den vor $!/0$ stehenden Teilzielen sowie zu alternativen Klauseln des gleichen Kopfprädikats. Die Verarbeitung von $!/0$ schneidet demnach alle vor der Verarbeitung verbliebenen Lösungswege betreffenden Prozedur ab.
|
||||
|
||||
Prädikate zur Steuerung der Suche: $!/0$
|
||||

|
||||
|
||||
|
||||
Prädikate zur Steuerung der Suche nach einer Folge von Resolutionsschritten
|
||||
**fail**
|
||||
Das Prädikat $fail/0$ ist stets falsch. In Klauselkörpern eingefügt löst es ein Backtrack aus bzw. führt zum Misserfolg, falls der Backtrack-Keller leer ist, d.h. falls es keine verbleibenden Lösungswege (mehr) gibt.
|
||||

|
||||

|
||||
|
||||
### Listen und rekursive Problemlösungsstrategien
|
||||
Listen
|
||||
1. $[]$ ist eine Liste.
|
||||
2. Wenn $T$ ein Term und $L$ eine Liste ist, dann ist
|
||||
1. $[T|L]$ eine Liste.
|
||||
2. $T.L$ eine Liste. (ungebräuchlich)
|
||||
3. $.(T,L)$ eine Liste. (ungebräuchlich)
|
||||
Das erste Element $T$ heißt Listenkopf, $L$ heißt Listenkörper oder Restliste.
|
||||
3. Wenn $t_1, ... ,t_n$ Terme sind, so ist $[t_1,...,t_n]$ eine Liste.
|
||||
4. Weitere Notationsformen von Listen gibt es nicht.
|
||||
|
||||
|
||||
|
||||
Listen als kompakte Wissensrepräsentation: ein bekanntes Beispiel (BSP5.PRO)
|
||||
- arbeiten_in([meier, mueller], raum_1).
|
||||
- arbeitet_in(meier, raum_1).
|
||||
- arbeitet_in(mueller, raum_1).
|
||||
- arbeitet_in(otto, raum_2).
|
||||
- arbeiten_in([otto], raum_2 ).
|
||||
- arbeitet_in(kraus, raum_3).
|
||||
- arbeiten_in([kraus], raum_3 ).
|
||||
- anschluesse_in([raum_2, raum_3]).
|
||||
- anschluss_in(raum_2).
|
||||
- anschluss_in(raum_3).
|
||||
|
||||
**Rekursion** in der Logischen Programmierung
|
||||
Eine Prozedur heißt (direkt) rekursiv, wenn in mindestens einem der Klauselkörper ihrer Klauseln ein erneuter Aufruf des Kopfprädikates erfolgt.
|
||||
Ist der Selbstaufruf die letzte Atomformel des Klauselkörpers der letzten Klausel dieser Prozedur - bzw. wird er es durch vorheriges „Abschneiden“ nachfolgender
|
||||
Klauseln mit dem Prädikat $!/0$ - , so spricht man von Rechtsrekursion ; anderenfalls von Linksrekursion.
|
||||
Eine Prozedur heißt indirekt rekursiv, wenn bei der Abarbeitung ihres Aufrufes ein erneuter Aufruf derselben Prozedur erfolgt.
|
||||
|
||||
Wissensverarbeitung mit Listen: (BSP5.PRO)
|
||||
- erreichbar(K) :- arbeitet_in(K,R), anschluss_in(R).
|
||||
- erreichbar(K) :- anschluesse_in(Rs), member(R, Rs), arbeiten_in(Ks, R), member(K, Ks).
|
||||
- koennen_daten_austauschen(K1,K2) :- arbeitet_in(K1,R),arbeitet_in(K2,R).
|
||||
- koennen_daten_austauschen(K1,K2) :- arbeiten_in(Ks,_),member(K1,Ks), member(K2,Ks).
|
||||
- koennen_daten_austauschen(K1,K2) :- erreichbar(K1),erreichbar(K2).
|
||||
- koennen_daten_austauschen(K1,K2) :- erreichbar(K1),erreichbar(K2).
|
||||
|
||||
BSP5.PRO
|
||||
```
|
||||
domains
|
||||
person, raum = symbol
|
||||
raeume = raum*
|
||||
personen = person*
|
||||
predicates
|
||||
arbeiten_in(personen, raum)
|
||||
anschluesse_in(raeume)
|
||||
erreichbar(person)
|
||||
koennen_daten_austauschen(person,person)
|
||||
member(person,personen)
|
||||
member(raum,raeume)
|
||||
clauses
|
||||
... (siehe oben)
|
||||
member(E,[E|_]).
|
||||
member(E,[_|R]) :- member(E,R).
|
||||
goal
|
||||
erreichbar(Wer).
|
||||
```
|
||||
|
||||
**Unifikation 2er Listen**
|
||||
1. Zwei leere Listen sind (als identische Konstanten aufzufassen und daher) miteinander unifizierbar.
|
||||
1. Zwei nichtleere Listen $[K_1|R_1]$ und $[K_2|R_2]$ sind miteinander unifizierbar, wenn ihre Köpfe ($K_1$ und $K_2$) und ihre Restlisten ($R_1$ und $R_2$) jeweils miteinander unifizierbar sind.
|
||||
3. Eine Liste $L$ und eine Variable $X$ sind miteinander unifizierbar, wenn die Variable selbst nicht in der Liste enthalten ist. Die Variable $X$ wird bei erfolgreicher Unifikation mit der Liste $L$ instanziert: $X:=L$.
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user