30.12.2013 Aufrufe

Heute: • Terme vergleichen • Struktur von Termen • Operatoren

Heute: • Terme vergleichen • Struktur von Termen • Operatoren

Heute: • Terme vergleichen • Struktur von Termen • Operatoren

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!