Heute: • Terme vergleichen • Struktur von Termen • Operatoren
Heute: • Terme vergleichen • Struktur von Termen • Operatoren
Heute: • Terme vergleichen • Struktur von Termen • Operatoren
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
<strong>Terme</strong><br />
<strong>Heute</strong>:<br />
<strong>•</strong> <strong>Terme</strong> <strong>vergleichen</strong><br />
<strong>•</strong> <strong>Struktur</strong> <strong>von</strong> <strong>Terme</strong>n<br />
<strong>•</strong> <strong>Operatoren</strong><br />
Logik in der Praxis – Logikprogrammierung (Prolog) – p.1
Termgleichheit: ==<br />
?- a == a.<br />
yes<br />
?- a == b.<br />
no<br />
?- X == Y.<br />
no<br />
?- X == X.<br />
yes<br />
?- X == a.<br />
no<br />
Logik in der Praxis – Logikprogrammierung (Prolog) – p.2
Termungleichheit: \==<br />
?- a \== a.<br />
no<br />
?- a \== b.<br />
yes<br />
?- X \== Y.<br />
yes<br />
?- X \== X.<br />
no<br />
?- X \== a.<br />
yes<br />
Logik in der Praxis – Logikprogrammierung (Prolog) – p.3
== vs. =<br />
?- a == X.<br />
no<br />
?- a = X.<br />
yes<br />
?- X == Y.<br />
no<br />
?- X = Y.<br />
yes<br />
?- X=Y, X==Y.<br />
yes<br />
Logik in der Praxis – Logikprogrammierung (Prolog) – p.4
Vergleichsoperatoren<br />
Operator Negation Vergleichtyp<br />
= \= Unifikation<br />
=:= =\= Aritmetische Gleichkeit<br />
== \== Termgleichkeit<br />
Logik in der Praxis – Logikprogrammierung (Prolog) – p.5
<strong>Terme</strong> in Prolog<br />
<strong>Terme</strong><br />
✟<br />
✟❍ ✟ ❍❍<br />
✟ ❍<br />
einfache <strong>Terme</strong><br />
complexe <strong>Terme</strong><br />
✟<br />
✟❍ ✟ ❍❍<br />
✟ ❍<br />
Variablen Konstanten<br />
✟<br />
✟❍ ✟ ❍❍<br />
✟ ❍<br />
Atome<br />
Zahlen<br />
Logik in der Praxis – Logikprogrammierung (Prolog) – p.6
<strong>Terme</strong> analysieren<br />
Prädikat<br />
atom/1<br />
integer/1<br />
number/1<br />
atomic/1<br />
var/1<br />
nonvar/1<br />
testet ob sein Argument<br />
ein Atom ist<br />
eine natürliche Zahl ist<br />
eine Zahl ist<br />
eine Konstante ist<br />
uninstanziiert ist<br />
instanziiert ist<br />
Logik in der Praxis – Logikprogrammierung (Prolog) – p.7
Beispiele<br />
?- atom(a).<br />
yes<br />
?- atom(7).<br />
no<br />
?- atom(X).<br />
no<br />
?- atomic(play(mia,piano)).<br />
no<br />
?-var(X).<br />
yes<br />
?- var(x).<br />
no<br />
?- nonvar(X).<br />
no.<br />
?- X=g, nonvar(X).<br />
yes<br />
?- atomic(7).<br />
yes<br />
Logik in der Praxis – Logikprogrammierung (Prolog) – p.8
Die <strong>Struktur</strong> der <strong>Terme</strong><br />
Bei der Verarbeitung <strong>von</strong> komplexen <strong>Terme</strong>n braucht man Prädikate,<br />
die:<br />
<strong>•</strong> den Zugriff auf den Funktor erlauben<br />
<strong>•</strong> die Stelligkeit eines komplexen Terms zurückgeben<br />
<strong>•</strong> den Zugriff auf ein bestimmtes Argument eines komplexen Terms<br />
erlauben<br />
<strong>•</strong> den Zugriff auf alle Argumente eines komplexen Terms erlauben<br />
Logik in der Praxis – Logikprogrammierung (Prolog) – p.9
Das Prädikat functor/3<br />
Der Zugriff auf Funktor und Stelligkeit eines komplexen Terms ist<br />
ermöglicht <strong>von</strong> dem Prädikat functor/3:<br />
?- functor(f(a,b),F,A).<br />
F=f<br />
A=2<br />
?- functor(a,F,A).<br />
F=a<br />
A=0<br />
?- functor([1,2,3],F,A).<br />
F=’.’<br />
A=2<br />
Logik in der Praxis – Logikprogrammierung (Prolog) – p.10
functor/3<br />
Mit dem Prädikat functor/3 ist es auch möglich komplexe <strong>Terme</strong> zu<br />
konstruieren:<br />
?- functor(T,f,5).<br />
T=f( 1, 2, 3, 4, 5).<br />
yes<br />
Aber:<br />
?- functor(C,f,A).<br />
ERROR: Arguments are not sufficiently instantiated<br />
?- functor(C,F,3).<br />
ERROR: Arguments are not sufficiently instantiated<br />
Logik in der Praxis – Logikprogrammierung (Prolog) – p.11
Das Predikat arg/3<br />
Das Predikat arg/3 ermöglicht den Zugriff auf die Argumente eines<br />
komplexen Terms:<br />
?- arg(1, play(mia, guitar), Result).<br />
Result = mia<br />
?- arg(2, play(mia,piano), Result).<br />
Result = piano<br />
?- arg(2, play(mia), Result).<br />
no<br />
Logik in der Praxis – Logikprogrammierung (Prolog) – p.12
Anwendung <strong>von</strong> arg/3<br />
Mit dem Prädikat arg/3 es ist möglich Elemente in komplexe <strong>Terme</strong>n zu<br />
instanziieren:<br />
?- arg(1, loves(X,mia), vincent).<br />
X = vincent.<br />
?- arg(1, loves(X,Y), vincent), arg(2, loves(X,Y), mia).<br />
X=vincent<br />
Y=mia<br />
Logik in der Praxis – Logikprogrammierung (Prolog) – p.13
Das Prädikat ’=..’/2<br />
Das Prädikat ’=..’/2 (univ) ermöglicht die Umwandlung <strong>von</strong> einem<br />
komplexen Term in eine Liste:<br />
?- f(a,b,c,d) =.. X.<br />
X= [f,a,b,c,d]<br />
?- X =.. [f,a,b,c,d]<br />
X = f(a,b,c,d)<br />
?- play(mia,X) =.. Y<br />
X= 23<br />
Y=[play, mia, 23]<br />
Logik in der Praxis – Logikprogrammierung (Prolog) – p.14
Anwendung <strong>von</strong> ’=..’<br />
Wir wollen ein Prädikat term a to b/2 definieren, das in allen<br />
Argumenten eines komplexen Terms das Atom a durch das Atom b<br />
ersetzt:<br />
z.B. f(a, b, a, c) → f(b, b, b, c))<br />
/*<br />
Das Prädikat term a to b/2 wandelt alle a Atome<br />
eines Terms in b Atome um<br />
∗/<br />
term a to b(Term a,Term b):-<br />
Term a =.. [H|Ra],<br />
list a to b(Ra,Rb),<br />
Term b =.. [H|Rb].<br />
Logik in der Praxis – Logikprogrammierung (Prolog) – p.15
*<br />
Das Prädikat list a to b/2 wandelt alle a Atome<br />
einer Liste in b Atome um<br />
∗/<br />
% Basisklausel<br />
list a to b([],[]).<br />
% Rekursive Klausel<br />
list a to b([H|T],[b|R]) :- H==a, list a to b(T,R).<br />
list a to b([H|T],[H|R]) :- H\==a, list a to b(T,R).<br />
Logik in der Praxis – Logikprogrammierung (Prolog) – p.16
Aufgaben<br />
1. Definiere ein Prädikat islist/1, das testet, ob sein Argument eine<br />
Liste ist.<br />
2. Definiere ein Prädikat isComplexTerm/1, das testet, ob sein<br />
Argument ein komplexer Term ist.<br />
3. Definiere ein Prädikat check term/1, das testet , ob alle<br />
Argumente eines komplexen Terms Atome sind.<br />
Logik in der Praxis – Logikprogrammierung (Prolog) – p.17
Benutzerfreundliche Notation <strong>von</strong> <strong>Operatoren</strong><br />
Interne Darstellung<br />
Benuzterfreundliche Darstellung<br />
+(3,2) 3+2<br />
is(X,+(2,3)) X is 2+3<br />
+(3,-(2)) 3 + -2<br />
>(4,3) 4>3<br />
Logik in der Praxis – Logikprogrammierung (Prolog) – p.18
Eigenschaften <strong>von</strong> <strong>Operatoren</strong><br />
<strong>Operatoren</strong> werden durch die folgende Eigenschaften definiert:<br />
<strong>•</strong> Typ<br />
<strong>•</strong> Priorität<br />
<strong>•</strong> Assoziativität<br />
Logik in der Praxis – Logikprogrammierung (Prolog) – p.19
Typ<br />
Der Typ eines Operators bestimmt die Beziehung zwischen dem<br />
Operator und seinen Argumenten; d.h. ob der Operator zwischen, vor<br />
oder nach seinen Argumenten geschrieben werden muss.<br />
Es gibt drei Typen <strong>von</strong> <strong>Operatoren</strong>:<br />
<strong>•</strong> infix <strong>Operatoren</strong> → xOy<br />
z.B. Operator +: 3+4<br />
<strong>•</strong> prefix <strong>Operatoren</strong> → Ox<br />
z.B. Operator -: -2<br />
<strong>•</strong> postfix <strong>Operatoren</strong> → xO<br />
Logik in der Praxis – Logikprogrammierung (Prolog) – p.20
Priorität<br />
Die Priorität eines Operators bestimmt die Beziehung des Operators zu<br />
anderen <strong>Operatoren</strong>. Durch die Priorität wird der Hauptoperator eines<br />
Ausdrucks bestimmt.<br />
Gegeben die folgenden <strong>Operatoren</strong>, geordnet nach aufsteigender<br />
Priorität:<br />
Prec(O1) > Prec(O2) > Prec(O3)<br />
Dann wird der Ausdruck:<br />
x O2 y O3 z O1 w<br />
wie folgt geklammert:<br />
O1(O2(x,O3(y,z)),w)<br />
Logik in der Praxis – Logikprogrammierung (Prolog) – p.21
Priorität (forts.)<br />
Zum Beispiel:<br />
Prec(is) > Prec(+) > Prec(*)<br />
X is 3 + 2*4 ⇒ is(X,+(3,*(2,4)))<br />
Logik in der Praxis – Logikprogrammierung (Prolog) – p.22
Priorität <strong>von</strong> <strong>Terme</strong>n<br />
<strong>•</strong> Atome, Variablen und Zahlen haben die Priorität 0.<br />
<strong>•</strong> Die Priorität <strong>von</strong> komplexen <strong>Terme</strong>n wird durch die Priorität des<br />
Hauptoperators bestimmt.<br />
Logik in der Praxis – Logikprogrammierung (Prolog) – p.23
Assoziativität<br />
Die Assoziativität bestimmt die Klammerung der Argumente in einem<br />
Ausdruck, in dem mehrere <strong>Operatoren</strong> mit der gleichen Priorität<br />
vorkommen.<br />
<strong>Operatoren</strong> können in Bezug auf ihre Assoziativität:<br />
<strong>•</strong> rechtsassoziativ sein<br />
<strong>•</strong> linksassoziativ sein<br />
<strong>•</strong> nicht assoziativ<br />
Logik in der Praxis – Logikprogrammierung (Prolog) – p.24
Rechtsassoziative <strong>Operatoren</strong><br />
Das ein Operator rechtsassoziativ ist bedeutet, dass die Priorität des<br />
linken Arguments kleiner als die des Operators sein muss, so dass der<br />
Ausdruck <strong>von</strong> rechts angefangen geklammert wird:<br />
x O 1 y O 1 z O 1 w → O 1 (x,O 1 (y,O 1 (z,w)))<br />
3 + 4 + 5 + 6 → (3 + (4 + (5 + 6)))<br />
Logik in der Praxis – Logikprogrammierung (Prolog) – p.25
Linksassoziative <strong>Operatoren</strong><br />
Das ein Operator linksassoziativ ist bedeutet, dass die Priorität des<br />
rechten Arguments kleiner als die des Operators sein muss, so dass der<br />
Ausdruck <strong>von</strong> links angefangen geklammert wird:<br />
x O 1 y O 1 z O 1 w → O 1 (O 1 (O 1 (x,y),z),w)<br />
3 + 4 + 5 + 6 → (((3 + 4) + 5) + 6)<br />
Logik in der Praxis – Logikprogrammierung (Prolog) – p.26
Nicht assoziative <strong>Operatoren</strong><br />
<strong>Operatoren</strong> können auch nicht assoziativ sein, d.h. beide Argumente<br />
des Operators müssen eine kleinere Priorität haben als der Operator. In<br />
diesem Fall kann der Ausduck nicht geklammert werden:<br />
?- 2 =:= 3 == =:=(2,3).<br />
ERROR: Syntax error: Operator priority clash<br />
?- (2 =:= 3) == =:=(2,3).<br />
yes<br />
Logik in der Praxis – Logikprogrammierung (Prolog) – p.27
<strong>Operatoren</strong> selber definieren<br />
Prolog erlaubt dem Programmierer <strong>Operatoren</strong> selber zu definieren.<br />
:- op(Priorität, Typ&Assoziativität, Name).<br />
Priorität ∈ {1,...,1200}<br />
Typ&Assoziativität ∈ :<br />
{xfx, xfy, yfx} wenn f infix ist<br />
{fx,fy} wenn f prefix ist<br />
{xf,yf} wenn f postfix ist<br />
x bedeutet: Die Priorität dieses Arguments ist kleiner als die Priorität<br />
des Operators.<br />
y bedeutet: Die Priorität dieses Arguments ist kleiner oder gleich der<br />
Priorität des Operators.<br />
Logik in der Praxis – Logikprogrammierung (Prolog) – p.28
Beispiele<br />
:-op(500, yfx, +).<br />
:-op(700, xfx, =).<br />
:-op(700, xfx, is).<br />
<strong>•</strong> X is 3 + 2 ⇒ (X is (3+2)) ⇒ is(X, +(3,2))<br />
<strong>•</strong> 3 + 2 + 4 ⇒ ((3+2)+4)<br />
Logik in der Praxis – Logikprogrammierung (Prolog) – p.29
Beispiel<br />
Wir wollen die Syntax <strong>von</strong> Prolog mit einem neuen Postfixoperator<br />
erweitern, der testet ob sein Argument eine Liste ist oder nicht.<br />
Wir werden in zwei Schritten vorgehen:<br />
<strong>•</strong> Operator deklarieren,<br />
<strong>•</strong> Bedeutung zuweisen<br />
% Syntaktische Erweiterung<br />
:-op(500, xf, is a list).<br />
% Bedeutungszuweisung:<br />
is a list([]).<br />
is a list(L) :- functor(L, ’.’, 2), arg(2, L, T), is a list(T).<br />
Logik in der Praxis – Logikprogrammierung (Prolog) – p.30
?- [a,b,c] is a list.<br />
yes<br />
?- [] is a list.<br />
yes<br />
?- a(b,c) is a list.<br />
no<br />
?- is a list([1,2,3]).<br />
yes<br />
Logik in der Praxis – Logikprogrammierung (Prolog) – p.31
Zusammenfassung<br />
<strong>Heute</strong> haben wir gesehen<br />
<strong>•</strong> was für eingebaute Prädikate es zur Termverarbeitung gibt,<br />
<strong>•</strong> was <strong>Operatoren</strong> sind und<br />
<strong>•</strong> wie man <strong>Operatoren</strong> selber definieren kann.<br />
Nächste Woche Montag (01.12.) Cut und Negation<br />
Übungsaufgaben: Die Übungen sind auf der Webseite.<br />
Logik in der Praxis – Logikprogrammierung (Prolog) – p.32