0% fanden dieses Dokument nützlich (0 Abstimmungen)
8 Ansichten33 Seiten

File 6

Das Dokument behandelt die Grundlagen von Termen in Prolog, einschließlich der Termgleichheit, der Struktur von Termen und der Verwendung von Operatoren. Es werden verschiedene eingebaute Prädikate zur Analyse und Verarbeitung von Termen vorgestellt, sowie die Definition und Verwendung von benutzerdefinierten Operatoren. Abschließend werden Übungen zur Vertiefung des Gelernten angeboten.

Hochgeladen von

negabe8139
Copyright
© All Rights Reserved
Wir nehmen die Rechte an Inhalten ernst. Wenn Sie vermuten, dass dies Ihr Inhalt ist, beanspruchen Sie ihn hier.
Verfügbare Formate
Als PDF, TXT herunterladen oder online auf Scribd lesen
0% fanden dieses Dokument nützlich (0 Abstimmungen)
8 Ansichten33 Seiten

File 6

Das Dokument behandelt die Grundlagen von Termen in Prolog, einschließlich der Termgleichheit, der Struktur von Termen und der Verwendung von Operatoren. Es werden verschiedene eingebaute Prädikate zur Analyse und Verarbeitung von Termen vorgestellt, sowie die Definition und Verwendung von benutzerdefinierten Operatoren. Abschließend werden Übungen zur Vertiefung des Gelernten angeboten.

Hochgeladen von

negabe8139
Copyright
© All Rights Reserved
Wir nehmen die Rechte an Inhalten ernst. Wenn Sie vermuten, dass dies Ihr Inhalt ist, beanspruchen Sie ihn hier.
Verfügbare Formate
Als PDF, TXT herunterladen oder online auf Scribd lesen

Terme

Programmierkurs Prolog – p.1


Heute:

Terme vergleichen

Struktur von Termen

Operatoren

Programmierkurs Prolog – p.2


Termgleichheit:

?- a a.


yes

?- a b.


no

?- X Y.


no

?- X X.


yes

?- X a.


no

Programmierkurs Prolog – p.3


Termungleichheit: = =


?- a = = a.
no


?- a = = b.
yes


?- X = = Y.
yes


?- X = = X.
no


?- X = = a.
yes

Programmierkurs Prolog – p.4


vs.

?- a X.



no

?- a X.


yes

?- X Y.


no

?- X Y.


yes

?- X Y, X Y.


yes

Programmierkurs Prolog – p.5


Vergleichsoperatoren

Operator Negation Vergleichtyp

= =

Unifikation

=:= = = Aritmetische Gleichkeit




== == Termgleichkeit

Programmierkurs Prolog – p.6


Terme in Prolog

Terme


einfache Terme

complexe Terme


Variablen Konstanten 

Atome Zahlen

Programmierkurs Prolog – p.7


Terme analysieren

Prädikat testet ob sein Argument

atom/1 ein Atom ist

integer/1 eine natürliche Zahl ist

number/1 eine Zahl ist

atomic/1 eine Konstante ist

var/1 uninstanziiert ist

unvar/1 instanziiert ist

Programmierkurs Prolog – p.8


Beispiele

?- atom(a). ?-var(X).
yes yes

?- atom(7). ?- var(x).
no no

?- atom(X). ?- nonvar(X).
no no.

?- atomic(play(mia,piano)). ?- X=g, nonvar(X).


no yes

?- atomic(7).
yes

Programmierkurs Prolog – p.9


Die Struktur der Terme

Bei der Verarbeitung von komplexen Termen braucht man Pr ädikate,


die:

den Zugriff auf den Funktor erlauben

die Stelligkeit eines komplexen Terms zurückgeben

den Zugriff auf ein bestimmtes Argument eines komplexen Terms


erlauben

den Zugriff auf alle Argumente eines komplexen Terms erlauben

Programmierkurs Prolog – p.10


Das Prädikat functor/3

Der Zugriff auf Funktor und Stelligkeit eines komplexen Terms ist
ermöglicht von dem Prädikat functor/3:

?- functor(f(a,b),F,A).
F=f
A=2
?- functor(a,F,A).
F=a
A=0
?- functor([1,2,3],F,A).
F=’.’
A=2

Programmierkurs Prolog – p.11


functor/3

Mit dem Prädikat functor/3 ist es auch möglich komplexe Terme zu


konstruieren:

?- functor(T,f,5).
T=f( 1, 2, 3, 4, 5).
yes

Aber:

?- functor(C,f,A).
ERROR: Arguments are not sufficiently instantiated
?- functor(C,F,3).
ERROR: Arguments are not sufficiently instantiated

Programmierkurs Prolog – p.12


Das Predikat arg/3

Das Predikat arg/3 ermöglicht den Zugriff auf die Argumente eines
komplexen Terms:

?- arg(1, play(mia, guitar), Result).


Result = mia
?- arg(2, play(mia,piano), Result).
Result = piano
?- arg(2, play(mia), Result).
no

Programmierkurs Prolog – p.13


Anwendung von arg/3

Mit dem Prädikat arg/3 es ist möglich Elemente in komplexe Termen zu


instanziieren:

?- arg(1, loves(X,mia), vincent).


X = vincent.

?- arg(1, loves(X,Y), vincent), arg(2, loves(X,Y), mia).


X=vincent
Y=mia

Programmierkurs Prolog – p.14


Das Prädikat ’=..’/2

Das Prädikat ’=..’/2 (univ) ermöglicht die Umwandlung von einem


komplexen Term in eine Liste:

?- f(a,b,c,d) =.. X.
X= [f,a,b,c,d]

?- X =.. [f,a,b,c,d]
X = f(a,b,c,d)

?- play(mia,X) =.. Y
X= 23
Y=[play, mia, 23]

Programmierkurs Prolog – p.15


Anwendung von ’=..’

Wir wollen ein Prädikat term a to b/2 definieren, das in allen


Argumenten eines komplexen Terms das Atom a durch das Atom b
ersetzt:

z.B. f(a, b, a, a) f(b, b, b, c))

/*
Das Prädikat term a to b/2 wandelt alle a Atome
eines Terms in b Atome um
/


term a to b(Term a,Term b):-




Terma a =.. [H R],


list a to b(Ra,Rb),


Term b =.. [H Rb].


Programmierkurs Prolog – p.16
/*
Das Prädikat list a to b/2 wandelt alle a Atome
einer Liste in b Atome um
/


% Basisklausel
list a to b([],[]).

% Rekursive Klausel


list a to b([H T],[b R]) :- H==a, list a to b(T,R).




list a to b([H T],[H R]) :- H= =a, list a to b(T,R).

Programmierkurs Prolog – p.17


Aufgaben

1. Definiere ein Prädikat islist/1, das testet, ob sein Argument eine


Liste ist.

2. Definiere ein Prädikat isComplexTerm/1, das testet, ob sein


Argument ein komplexer Term ist.

3. Definiere ein Prädikat check term/2, das testet , ob alle


Argumente eines komplexen Terms Atome sind.

Programmierkurs Prolog – p.18


Benutzerfreundliche Notation von Operatoren

Interne Darstellung Benuzterfreundliche Darstellung

+(3,2) 3+2

is(X,+(2,3)) X is 2+3

+(3,-(2)) 3 + -2

(4,3) 4 3

Programmierkurs Prolog – p.19


Eigenschaften von Operatoren

Operatoren werden durch die folgende Eigenschaften definiert:

Typ

Priorität

Assoziativität

Programmierkurs Prolog – p.20


Typ

Der Typ eines Operators bestimmt die Beziehung zwischen dem


Operator und seinen Argumenten; d.h. ob der Operator zwischen, vor
oder nach seinen Argumenten geschrieben werden muss.
Es gibt drei Typen von Operatoren:

infix Operatoren xOy


z.B. Operator +: 3+4

prefix Operatoren Ox
z.B Operator -: -2

postfix Operatoren xO

Programmierkurs Prolog – p.21


Priorität

Die Priorität eines Operators bestimmt die Beziehung des Operators zu


anderen Operatoren. Durch die Priorität wird der Hauptoperator eines
Ausdrucks bestimmt.

Gegeben die folgenden Operatoren, geordnet nach aufsteigender


Priorität:

Prec(O1) Prec(O2) Prec(O3)

Dann wird der Ausdruck:

x O2 y O3 z O1 w

wie folgt geklammert:

O1(O2(x,O3(y,z)),w)

Programmierkurs Prolog – p.22


Priorität (forts.)

Zum Beispiel:

Prec(is) Prec(+) Prec(*)

X is 3 + 2*4 is(X,+(3,*(2,4)))

Programmierkurs Prolog – p.23


Priorität von Termen

Atome, Variablen und Zahlen haben die Priorität 0.

Die Priorität von komplexen Termen wird durch die Priorität des
Hauptoperators bestimmt.

Programmierkurs Prolog – p.24


Assoziativität

Die Assoziativität bestimmt die Klammerung der Argumente in einem


Ausdruck, in dem mehrere Operatoren mit der gleichen Priorit ät
vorkommen.
Operatoren können in Bezug auf ihre Assoziativität:

rechtsassoziativ sein

linksassoziativ sein

nicht assoziativ

Programmierkurs Prolog – p.25


Rechtsassoziative Operatoren

Das ein Operator rechtsassoziativ ist bedeutet, dass die Priorit ät des
rechten Arguments kleiner als die des Operators sein muss, so dass der
Ausdruck von rechts angefangen geklammert wird:

xO yO zO w O (x,O (y,O (z,w)))

3+4+5+6 (3 + (4 + (5 + 6)))

Programmierkurs Prolog – p.26


Linksassoziative Operatoren

Das ein Operator linksassoziativ ist bedeutet, dass die Priorit ät des
linken Arguments kleiner als die des Operators sein muss, so dass der
Ausdruck von links angefangen geklammert wird:

xO yO zO w O (O (O (x,y),z),w)

3+4+5+6 (((3 + 4) + 5) + 6)

Programmierkurs Prolog – p.27


Nicht assoziative Operatoren

Operatoren können auch nicht assoziativ sein, d.h. beide Argumente


des Operators müssen eine kleinere Priorität haben als der Operator. In
diesem Fall kann der Ausduck nicht geklammert werden:

?- 2 3 (2,3).



ERROR: Syntax error: Operator priority clash

?- (2 3) (2,3).


yes

Programmierkurs Prolog – p.28


Operatoren selber definieren

Prolog erlaubt dem Programmierer Operatoren selber zu definieren.


:- op(Priorität, Typ&Assoziativität, Name).


Priorität 1,...,1200
Typ&Assoziativität :


xfx, xfy, yfx wenn f infix ist




fx,fy wenn f prefix ist




xf,yf wenn f postfix ist

x bedeutet: Die Priorität dieses Arguments ist kleiner als die Priorität
des Operators.

y bedeutet: Die Priorität dieses Arguments ist kleiner oder gleich der

Priorität des Operators.

Programmierkurs Prolog – p.29


Beispiele

:-op(500, yfx, +).


:-op(700, xfx, =).
:-op(700, xfx, is).

X is 3 + 2 (X is (3+2)) is(X, +(3,2))

3+2+4 ((3+2)+4)

Programmierkurs Prolog – p.30


Beispiel

Wir wollen die Syntax von Prolog mit einem neuen Präfixoperator
erweitern, der testet ob sein Argument eine Liste ist oder nicht.
Wir werden in zwei Schritten vorgehen:

Operator deklarieren,

Bedeutung zuweisen

% Syntaktische Erweiterung
:-op(500,xf,is a list).

% Bedeutungszuweisung:
is a list([]).
is a list(L) :- functor(L,.,2), arg(2,L,T), is a list(T).

Programmierkurs Prolog – p.31


?- [a,b,c] is a list.

yes
?- [] is a list.

yes
?- a(b,c) is a list.

no
?- is a list([1,2,3]).

yes

Programmierkurs Prolog – p.32


Zusammenfassung

Heute haben wir gesehen

was für eingebaute Prädikate es zur Termverarbeitung gibt,

was Operatoren sind und

wie man Operatoren selber definieren kann.

Nächste Woche Freitag (13.6.) fällt die Vorlesung aus. Die Übung am
darauffolgenden Dienstag (17.6.) findet statt.
Übungsaufgaben: Die “Exercises” aus Kapitel 9 von Learn Prolog Now!.

Programmierkurs Prolog – p.33

Das könnte Ihnen auch gefallen