• Keine Ergebnisse gefunden

A Closer Look

N/A
N/A
Protected

Academic year: 2022

Aktie "A Closer Look"

Copied!
31
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

A Closer Look

Datenobjekte in Prolog und Syntax

Ablauf des internen Lösungsverfahrens (goal resolving) Vorausschau: Regression

(2)

Datenobjekte in Prolog

Datenobjekte

Strukturen

Zahlen Atome

Variablen Konstanten

einfache Objekte

(3)

Konstanten

Syntax bedeutet: wie müssen die Elemente eines Systems geschrieben werden, dass Sie das Vereinbarte bedeuten Terme: Konstanten, Variable, Strukturen

Terme sind eine Sequenz von Zeichen (char) Konstanten sind Atome oder Zahlen

Atome beginnen mit einem Kleinbuchstaben und können sonst beliebige Buchstaben (A-Z, a-z), Ziffern (1-9) bzw. das

Sonderzeichen '_' enthalten

mary, john, einfuehrung_in_die_programmierung, a …

Durch Quotes wie in 'Irgendetwas' wir Irgendetwas zur Konstante 'Mary', 'John'

Integer werden benutzt um Zahlen zu repräsentieren.

11, 1200 ...

(4)

Variablen

Variablen beginnen mit einem Großbuchstaben oder Underscore.

X, Y, Haltestelle, HALTESTELLE, _john

Zur Erinnerung: Variable stehen für ein Objekt, welches wir zum

Zeitpunkt der Programmerstellung noch nicht benennen können oder wollen.

Variable die nur der Internen Verarbeitung dienen und deren Name nicht weiter benutzt wird:

anonyme Variable: '_' einzelner underscore

?-likes(_, john).

Wir wollen wissen ob überhaupt jemand john mag aber es interessiert uns nicht wer.

Die Systemantwort ist entweder false oder true

(5)

Strukturen

Strukturen sind komplexe Terme (compound terms).

Eine Struktur ist ein einzelnes Objekt, welches aus einer Sammlung anderer Objekte, seinen Komponenten besteht.

Beispiel: Metadatensatz für ein Buch in einer Bibliothek

Eine Gruppe verbundener Informationen wird als einzelnes Objekt behandelt.

Abstrakte Struktur: spezifiziere den Funktor und seine

Komponenten. In anderen Programmiersprachen wäre der Funktor ein Datentyp.

Komponenten sind in runden Klammern durch Komma getrennt und können selbst wieder Strukturen sein.

functor(component1, component2).

(6)

Strukturen

functor(component1, component2).

book(moby_dick, melvile).

owns(john, book(moby_dick, melville).

welchen Sinn hat das? Stellen wir uns vor wir wollen fragen,

"besitzt john ein Buch von melville"

(7)

Strukturen

Datenbank

owns(john, book(moby_dick, melville).

welchen Sinn hat das? Stellen wir uns vor wir wollen fragen,

"besitzt john ein Buch von melville"

?- owns(john, book(

Entscheidend: wo müssen wir verallgemeinern und wie verallgemeinert man in Prolog.

Irgendein Buch: _ die anonyme Variable wir brauchen nur ja oder nein, false oder true

Ein bestimmtes Buch: X eine spezifische Variable

wir wollen etwa die Variable im Programm weiter verarbeiten

?- owns(john, book(X, melville).

X = moby_dick.

(8)

Strukturen

Prolog Terme: Konstanten, Variablen, Strukturen Zur Prolog Terminologie:

Prädikat ist ein Funktor innerhalb einer Regel.

Argumente eines Prädikats sind die Komponenten eines Funktors

(9)

Position, Präzedenz, Assoziativität

Prolog wie auch andere Programmiersprachen unterscheidet Infix, Präfix und Suffixprädikate.

Grundsätzlich werden selbstgeschriebene Prädikate als Präfix vor den Klammerausdruck geschrieben.

Zur leichteren Lesbarkeit können die arithmetischen Operatoren (in Prolog Prädikate) auch in gewohnter Schreibweise als Infix

geschrieben werden.

(10)

Präzedenz

+,-,*,/

+(x,*y,z)) explizite Präzedenz durch Klammerung,

Präfixschreibweise. Jeder eingebaute Operator hat in Prolog eine Präzedenzklasse.

Wie gewohnt * hat eine höhere Klasse als +,-

(11)

Assoziativität

Bei mehreren Operatoren gleicher Präzedenz entscheidet die Assoziativität was zuerst ausgeführt wird.

8/2/2

2 8

Arithmetische Operatoren stind stets linksassoziativ. Bei Unklarheit ist es stets eine gute Lösung explizite Klammerung zu benutzen.

(12)

Gleichheit und Unifikation

Die Anfrage ?- X=Y.

belegt X und Y intern mit einem unbestimmten Wert und unifiziert die beiden. = ist ein sogenanntes built-in Prädikat.

Wenn etwa X uninstantiert ist und Y zu irgendeinem Term instantiert ist so werden durch = X und Y gleich. X wird instantiert zu was

immer Y ist. Ineger (1, 127...) und atomare Terme (a, john...) sind sich selbst gleich.

Strukturen sind dann gleich, wenn sie denselben Funktor, die gleiche Stelligkeit und gleiche Komponenten haben.

?- rides(student, bike) = rides(student, X).

X= bike.

! es handelt sich nicht um eine Frage zu der Struktur rides sondern um eine Frage zur Gleichheit '='

(13)

Gleichheit und Unifikation: Beispiel

?- a(b,c,d(e,F,g(h,i,J))) = a(B,c,d(E,f,g(H,i,j))).

a=a: Funktor gleich

3=3 Komponenten, Stelligkeit gleich B=b

c=c

d=d: Funktor gleich 3=3: Stelligkeit gleich

E=e F=f

g=g: Funktor gleich 3=3: Stelligkeit gleich

H=h i=i J=j

Ergebnis: Test auf Gleichheit true. Geben Sie das Ergebnis auf SWI mit eingeschaltetem Trace aus.

(14)

Gleichheit und Unifikation

Wird versucht zwei uninstantierte Variablen gleich zu machen: das goal ist erfolgreich und die beiden Variablen werden intern gleich (share). Wird im weiteren Verlauf etwa durch Regelübergaben eine dieser Variablen instantiert, so auch die andere.

equal(X,Y):- X = Y.

=> equal(X,X).

(15)

Gleichheit und Unifikation

Übung: Welche der folgenden Ziele können erfüllt werden und wenn, welche Variablen werden wie instantiert?

pilots(A,london) = pilots(london,paris).

point(X,Y,Z) = point(X1,Y1,Z1).

letter(C) = word(letter).

noun(alpha) = alpha.

'student' = student.

f(X,X) = f(a,b).

f(X,a(b,c)) = f(Z,a(Z,c))

(16)

Arithmetik

(1) Vergleichen von Zahlen

(2) Kalkulieren von Resultaten

(17)

Arithmetik: Zahlenvergleich

built-in Prädikate zum Zahlenvergleich:

=:= gleich

=/= ungleich

< kleiner

> größer

=< kleiner oder gleich Achtung '=>' bleibt frei

>= größer oder gleich

Argumente: Zahlen als Konstanten, Variablen als Zahl instantiert, Ausdrücke, die zu einer Zahl auswerten

built-in Prädikate dürfen nicht durch weitere Fakten angereichert (verändert) werden.

2>3 führt zu einem Fehler. Das Prädikat > darf nicht in unerwarteter Weise benutzt werden.

(18)

Zahlenvergleich: Beispiel

regiert(adenauer,1949,1963).

regiert(erhardt,1963,1966).

regiert(kissinger,1966,1969).

regiert(brandt,1969,1974).

regiert(schmidt,1974,1982).

regiert(kohl,1982,1998).

regiert(schröder,1998,2005).

Wir wollen eine Regel, die uns sagt, wer in einem bestimmten Jahr Bundeskanzler war.

Also eine Regel, die als Input einen Namen und ein Jahr bekommt.

(19)

Zahlenvergleich: Beispiel

X war in einem bestimmten Jahr Y Bundeskanzler, wenn X

zwischen den Jahren A und B regierte und Y innerhalb dieser Jahre A und B liegt.

bundeskanzler(X,Y):- regiert(X,A,B), Y>=A,

Y=<B.

?- bundeskanzler(X,1976).

X=schmidt.

?- bundeskanzler(X,1974).

X=brandt;

X=schmidt.

(20)

Arithmetik: Kalkulation

'is' Prädikat: ist ein Infix-Operator Die rechte Seite wird als

arithmetischer Ausdruck interpretiert. Die Antwort der rechten Seite wird dann mit dem linken Argument unifiziert.

Bsp: Y is P/A.

Alle Variablen auf der rechten Seite müssen zum

Auswertungszeitpunkt instantiert sein. Wenn Y nicht instantiert ist, wird es mit dem Wert des ausgewerteten arithmetischen Ausdrucks belegt.

Das Prädikat is muss immer dann benutzt werden, wenn eine arithmetische Auswertung in Gang gesetzt werden soll.

(21)

Kalkulation: Beispiel

verschuldung(bayern, 3632052000).

verschuldung(berlin, 49310976000).

verschuldung(brandenburg, 17679220000).

verschuldung(schleswig-holstein, 21084960000).

einwohner(bayern,12520).

einwohner(berlin,3432).

einwohner(brandenburg,2522).

einwohner(schleswig-holstein,2834).

Prädikat prokopfverschuldung

(22)

Kalkulation: Beispiel

Prokopfverschuldung entspricht den Gesamtschulden durch die Einwohnerzahl.

prokopfverschuldung(Land, X) :- verschuldung(Land, A), einwohner(Land,B),

X is A/B.

Operationen: X+Y X-Y

X*Y X/Y

X//Y Integerquotient X mod Y Integerrest

(23)

Zusammenfassung: Prologs Mechanismus Ziele zu erfüllen

Prolog arbeitet Anfragen ab. Eine Anfrage übergibt an Prolog eine Konjunktion von Zielen. Prolog benutzt die Klauseln die es kennt um die Ziele zu erfüllen:

aus der ihm zugänglichen Datenbank, dem(n) Programm(en)

Ein Fakt kann ein Ziel sofort erfüllen. Eine Regel kann die Aufgabe nur "reduzieren": zur Erfüllung möglicherweise mehrerer neuer

Ziele, die statt dem ursprünglichen Ziel in die Zielliste aufgenommen werden. Sind alle Ziele erfüllt antwortet Prolog mit true. Sind nicht alle Ziele erfüllt und sind auch keine neuen zugänglichen

Datenbankinhalte vorhanden (=zielunifizierende Fakten oder Regelköpfe) so antwortet Prolog mit false.

Solange noch Datenbankklauseln angesteuert werden können sucht Prolog weiter: Achtung unendliche Rekursionen...

(24)

Erfolgreiche Erfüllung einer Konjunktion von Zielen

female(mary).

parents(C,M,F) :- mother(C,M), father(C,F).

mother(john,ann).

mother(mary,ann).

father(mary,fred).

father(john, fred).

sister(X,Y):- female(X), parents(X,M.F), parents(Y,M,F).

(25)

Konjunktion von Zielen

Ist mary die schwester von john?

?- sister(mary,john).

female(mary) parents(mary,M,F)

parents(john,M,F)

3 Subgoals

(26)

Konjunktion von Zielen

parents(mary,M,F)

mother(mary,M)

father(mary,F) Subgoal2

mother(mary,ann)

father(mary,fred) M = ann

F= fred

Subgoal1 parents(mary,ann,fred)

M = ann, F = fred

(27)

Vorausschau: Regression

Abkommenschaft: Y ist ein Abkomme von X wenn X ein Elternteil von X ist.

offspring(Y,X) :- parent(X,Y)

wenn die Bedingung parent wahr ist, dann ist die logische Konsequenz, dass offspring wahr ist.

(28)

Vorausschau: Regression

grandparent(X,Z):- parent (X,Y), parent(Y,Z).

Y Y

X X

Z parent

parent parent

grandparent

(29)

Vorausschau: Regression

Definiere die Relation Vorfahre:

umständlich für jede Ebene eine Regel:

predecessor(X,Z) :- parent(X,Y1),parent(Y1,Y2), parent(Y2,Z).

predecessor(X,Z) :- parent(X,Y1),parent(Y1,Y2), parent(Y2,Y3), parent(Y3,Z) .

...

besser rekursiver Aufruf

X ist ein Vorfahre von Z, wenn es ein Y gibt, so dass (1) X ist ein Elternteil von Z

oder

(2) X ein Elternteil von Y ist und (3) Y ein Vorfahre von Z.

(30)

Vorausschau: Regression

predecessor(X,Z):- parent(X,Z).

predecessor(X,Z):- parent(X,Y,), predecessor(Y,Z).

(31)

Hausaufgabe

1) versuchen Sie sich die Beispiele zur Arithmetik klarzumachen.

Geben Sie sie als Prologprogramm ein und lassen Sie die Programme mit verschiedenen Anfragen ablaufen.

2) schreiben sie ein Prologprogramm mit ihrer Familie als Datenbank 3) lesen Sie Kapitel 2 in Clocksin/Melish

4) lesen Sie zur Vertiefung zusätzlich Kapitel 1 und Kapitel 2 in Bratko (1.November ist Feiertag und damit vorlesungsfrei)

Referenzen

ÄHNLICHE DOKUMENTE

[r]

Der Adressat des Briefes, der Marquis de l’Hˆ opital, hat es in der Wissen- schaftsgeschichte durch einen wohl einmaligen Vorgang zu zweifelhaftem Ruhm ge- bracht.. Die von

Betrachte Beispiel 3.12 von Folie 169, die Arithmetik der

Betrachte Beispiel 3.12 von Folie 169, die Arithmetik der

Axel Gr¨ unrock.. UBUNGEN ZUR ANALYSIS

(1) Man beachte, dass die partiellen Ableitungen im Gegensatz zu den gew¨ ohn- lichen Ableitungen nicht durch Striche (oder Punkte im Falle der zeitlichen Ableitung)

Wir werden in diesem Abschnitt einige wichtige Anwendungen der Taylorschen Formel behandeln: Das totale Differenzial als lineare N¨ aherung, die Fehlerrechnung, die Theorie der

In order to determine suitable localisation conditions for Marnet data assimilation, the BSHcmod error statistics have been analysed based on LSEIK filtering every