Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

15.01.09GK Prolog - Cut, Negation, Datenbasis1 Cut, Negation, Manipulation der Datenbasis Prolog Grundkurs WS 08/09 Christof Rumpf

Ähnliche Präsentationen


Präsentation zum Thema: "15.01.09GK Prolog - Cut, Negation, Datenbasis1 Cut, Negation, Manipulation der Datenbasis Prolog Grundkurs WS 08/09 Christof Rumpf"—  Präsentation transkript:

1 15.01.09GK Prolog - Cut, Negation, Datenbasis1 Cut, Negation, Manipulation der Datenbasis Prolog Grundkurs WS 08/09 Christof Rumpf rumpf@uni-duesseldorf.de

2 15.01.09GK Prolog - Cut, Negation, Datenbasis2 Der Cut Der Cut ! ist ein eingebautes Prädikat, mit dem Backtracking kontrolliert werden kann. Der Cut kann folgendes bewirken: –Effizienzsteigerung –Speichereinsparung –Kürzere Programme

3 15.01.09GK Prolog - Cut, Negation, Datenbasis3 Wirkungsweise des Cut –Der Cut wird im Rumpf von Regeln eingesetzt und verhindert Backtracking. –Der Top-Down-Beweis des Cut gelingt immer. –Gelangt der Interpreter beim Backtracking zurück zu einem Cut, scheitert der Beweis des Prädikats im Kopf der Regel endgültig - ungeachtet weiterer Backtrackingmöglichkeiten vor dem Cut bzw durch nachfolgende Klauseln.

4 15.01.09GK Prolog - Cut, Negation, Datenbasis4 Generelles Beispiel A 1 :-....... A j :- B 1,...,B i-1,!,B i+1,..., B n.... A m :-.... Das Prädikat A ist durch m Klauseln definiert. Ein Beweis des Cut in A j beschränkt Backtracking auf den blau umrahmten Bereich.

5 15.01.09GK Prolog - Cut, Negation, Datenbasis5 max/3 mit und ohne Cut % ohne Cut max(X,Y,X):- X >= Y. max(X,Y,Y):- X < Y. % mit Cut max(X,Y,X):- X >= Y, !. max(X,Y,Y). Die Lösung mit Cut macht den Test X < Y für die zweite Klausel überflüssig und verleiht der zweiten Klausel Default-Charakter: Y ist immer das Maximum, außer wenn X größer oder gleich Y ist.

6 15.01.09GK Prolog - Cut, Negation, Datenbasis6 ifthenelse/3 % ohne Cut ifthenelse(B,P,Q):- call(B), call(P). ifthenelse(B,P,Q):- call(not(B)), call(Q). % mit Cut ifthenelse(B,P,Q):- call(B), !, call(P). ifthenelse(B,P,Q):- call(Q). Der Cut macht die nochmalige Prüfung der Bedingung B in der zweiten Klausel überflüssig.

7 15.01.09GK Prolog - Cut, Negation, Datenbasis7 Rote und grüne Cuts In der Literatur wird oft zwischen roten und grünen Cuts unterschieden. –Ein grüner Cut kann aus einem Programm entfernt werden, ohne daß sich die Bedeutung des Programms ändert. –Ein roter Cut kann nicht aus einem Programm entfernt werden, ohne daß sich die Bedeutung des Programms ändert.

8 15.01.09GK Prolog - Cut, Negation, Datenbasis8 max/3 mit grünen und roten Cuts % grüne Cuts max(X,Y,X):- X >= Y, !. max(X,Y,Y):- X < Y, !. % roter Cut max(X,Y,X):- X >= Y, !. max(X,Y,Y). Die grünen Cuts könnten genausogut weggelassen werden.

9 15.01.09GK Prolog - Cut, Negation, Datenbasis9 Ist es ein roter oder grüner Cut? Die Entscheidung ist nicht immer trivial. Beispiel: append([],L,L):- !. append([H|T1],L,[H|T2]):- append(T1,L,T2). Bei einer Anfrage ?- append([1,2],[3,4],L). liefert append/3 mit Cut korrekt L=[1,2,3,4]. Bei einer Anfrage ?- append(X,Y,[1,2,3,4]). bekommen wir allerdings nur noch (deterministisch) die Lösung X=[] und Y=[1,2,3,4].

10 15.01.09GK Prolog - Cut, Negation, Datenbasis10 Die Schattenseite des Cut –Der Cut zertört die Deklarativität von Prolog- Programmen. –Die Interpretation einer Prädikatsdefinition mit roten Cuts ist i.d.R. nur noch unter Berücksichtigung der Reihenfolge der Beweisschritte möglich. –Deshalb: Cut nur einsetzen, wenn ein offensichtlicher Vorteil erzielt werden kann.

11 15.01.09GK Prolog - Cut, Negation, Datenbasis11 Verwendungsweisen des Cut Die Verwendung des Cuts kann je nach Anwendungsfall verschieden charakterisiert werden: –Beschneiden des Suchraums. –Erzwingen von Determinismus. –Modellierung von Defaults. –Modellierung von Negation.

12 15.01.09GK Prolog - Cut, Negation, Datenbasis12 Negation Negation wird in Prolog mit Hilfe einer Cut-Fail- Kombination realisiert und zur Unterscheidung von der Negation z.B. in der PrädikatenlogikNegation als Scheitern bzw negation as failure genannt. Hier die Definition des eingebauten Prädikats not/1 : not(G):- call(G), !, fail. not(G).

13 15.01.09GK Prolog - Cut, Negation, Datenbasis13 Probleme mit der Negation Negation als Scheitern ist nur dann mit Sicherheit deklarativ, wenn in dem negierten Beweisziel beim Aufruf keine Variablen enthalten sind. ledigerStudent(X):- not verheiratet(X), student(X). student(peter). verheiratet(klaus). ?- ledigerStudent(peter). yes ?- ledigerStudent(X). no

14 15.01.09GK Prolog - Cut, Negation, Datenbasis14 Anwendung: Defaults can_fly(X):- penguin(X), !, fail. can_fly(X):- bird(X). bird(X):- penguin(X). bird(X):- eagle(X). penguin(tweety). eagle(klaus). can_fly(X):- bird(X), not penguin(X). bird(X):- penguin(X). bird(X):- eagle(X). penguin(tweety). eagle(klaus). Cut-Fail-Version (schlecht) Version mit Negation (ok)

15 15.01.09GK Prolog - Cut, Negation, Datenbasis15 Manipulation der Datenbasis Prolog stellt eine Reihe von Prädikaten zur Verfügung, die eine Manipulation der Datenbasis während der Laufzeit eines Programms ermöglichen. –assert/1 –retract/1 –clause/2 –...

16 15.01.09GK Prolog - Cut, Negation, Datenbasis16 Erweitern der Datenbasis –assert(Clause) fügt eine Klausel am Ende der Datenbasis hinzu. –asserta(Clause) fügt eine Klausel am Anfang der Datenbasis hinzu. –Beispiel: ?- assert((sterblich(X):-mensch(X))). yes.

17 15.01.09GK Prolog - Cut, Negation, Datenbasis17 Anwendung: Memo-Funktion Memo-Funktionen dienen zur Speicherung von berechneten Ergebnissen, um eine erneute Berechnung zu vermeiden. lemma(G):- call(G), asserta((G:- !)). ?- lemma(vorfahr(X,Y)), fail. Die Anfrage berechnet die Vorfahr-Relation vollständig und schreibt die Ergebnisse mit asserta/1 in die Datenbasis.

18 15.01.09GK Prolog - Cut, Negation, Datenbasis18 Löschen in der Datenbasis retract(+Clause) entfernt die erste Klausel aus der Datenbasis, die mit Clause unifiziert. ?- retract(mensch(X)). X = sokrates ->; X = aristoteles ->; no ?- retract((sterblich(_):- mensch(_))). yes

19 15.01.09GK Prolog - Cut, Negation, Datenbasis19 Anwendung: Kopieren von Termen copy_term(Term1,Term2) erstellt in Term2 eine Kopie von Term1 mit neuen Variablen. copy_term(T1,T2):- assert( ´TMP´(T1)), retract(´TMP´(T2)). ?- copy_term(rel(A,A,B),Copy). Copy = rel(C,C,D), yes

20 15.01.09GK Prolog - Cut, Negation, Datenbasis20 Zugriff auf Klauseln clause(Head,Body) erlaubt einen Zugriff auf Klauseln. Head muß beim Aufruf instantiiert sein. Body hat bei Fakten die Instanz true. ?-clause(sterblich(_),T). T = mensch(X) ->;...

21 15.01.09GK Prolog - Cut, Negation, Datenbasis21 Löschen einer Prädikatsdefinition retractall(H):- % Regeln clause(H,B), retract((H:-B)), fail. retractall(H):- % Fakten retract(H), fail. retractall(_). ?- retractall(vorfahr(_,_)). yes

22 15.01.09GK Prolog - Cut, Negation, Datenbasis22 name/2 name(Atom,List) wandelt ein Atom in eine Liste von ASCII-Symbolen um und umgekehrt. ?- name(sokrates,L). L = [115,111,107,114,97,116,101,115] yes ?- name(A,[115,111,107,114,97,116,101,115]). A = sokrates yes

23 15.01.09GK Prolog - Cut, Negation, Datenbasis23 Anwendung: Erzeugen neuer Atome gensym(Root,Symbol) erzeugt bei jedem Auruf ein neues Atom Symbol, indem an eine spezifizierbare Wurzel Root eine fortlaufende Zahl angehängt wird. ?- gensym(x, S). S = x0, yes ?- gensym(x, S). S = x1, yes Definition

24 15.01.09GK Prolog - Cut, Negation, Datenbasis24 gensym/2 gensym(Root,Symbol):- symbol(Root,Nr), name(Root,RootL), name(Nr,NrL), append(RootL,NrL,SymbolL), name(Symbol,SymbolL). symbol(Root,Nr):- retract(symb(Root,ONr)),!,Nr is ONr+1, assert(symb(Root,Nr)). symbol(Root,0):- assert(symb(Root,0)).


Herunterladen ppt "15.01.09GK Prolog - Cut, Negation, Datenbasis1 Cut, Negation, Manipulation der Datenbasis Prolog Grundkurs WS 08/09 Christof Rumpf"

Ähnliche Präsentationen


Google-Anzeigen