88
Curs nr 14 – Prolog Cartea de baza Ivan Bratko, Programming for Artificial Intelligence, Three edition 2001, Addision Wesley 1

Curs 14 Paradigma programarii logice

  • Upload
    vunhi

  • View
    280

  • Download
    3

Embed Size (px)

Citation preview

Curs nr 14 – PrologCartea de baza

Ivan Bratko, Programming for Artificial Intelligence, Three edition 2001, Addision Wesley

1

Programare logică

Se bazează pe faptul că, rezolvarea uneiprobleme constă dintr-o reprezentarecorespunzătoare a cunoştinţelor.

Limbajele de programare logică se mainumesc şi limbaje declarative.

2

Programare logică

Teoria matematică care stă la baza acesteiparadigme este logica predicatelor de ordinunu, care lucrează cu entităţi logice (nu cu numere).

Logica predicatelor este o logică simbolică al cărui scop este de a reprezenta tipuri de raţionament.

3

Programare logică

Programarea cunoştinţelor face parte din metoda soluţiei generale, care implică propagarea constrângerilor.

Valorile de adevăr pot fi binare (T, F) saumulti-valoare (T, probabil T, posibil T, F).

4

logica predicatelor

Limbajul predicatelor de ordin unu dispune de instrumente pentru a defini diverse tipuri de obiecte matematice, cum ar fi:

numere,

variabile numerice,

Funcţii şi operaţii matematice

relaţii,

propoziţii,

teoreme matematice.

5

Calcul Predicativ

Simbolurile folosite in calculul predicativ folosescurmatorul alfabet:

1. Setul de litere mari/mici al alfabetului englez

2. Setul de numere 0,1,…,9

3. underscore, _

P: “a plouat miercuri”P:”vremea (miercuri, ploaie)

Variabila: Xvremea(X, ploaie)

Calcul PredicativSimbolurile utimimiate pot fi:1. logice: true sau false2. constante : expresii care incep cu litera mica3. Variabile: expresii care incep cu litera mare4. Functii: expresii care incep cu litera mica

Operatorii pot fi: ^, , ¬, ,

Fraze tipice:Orice simbol inclusiv cele logice: true, P, Q, …Negarea unei propozitii: ¬P, ¬falseConjunctie or and doua propozitii: P^ ¬PDisjungerea or and doua propozitii: P ¬PImplicarea unei propozitii de catre alta: P QEchivalenta a doua propozitii: PQR

Tabele de adevarLegi si reguli:

¬(¬P) = P

(P Q) = (¬P Q)

Legea “contra positive” : (P Q) = (¬Q ¬P)

Legea De Morgan : ¬(P Q) = (¬P^¬Q)

Legea Comutativitatii: (P^Q) = (Q^ P)

Legea Distributivitatii: P^(Q R) = (P^Q) (P^R)

P Q P^Q

T T T

T F F

F T F

F F F

Exemple Vasile nu iubeste pe nimeni in afara de Maria

¬Y (iubeste(Vasile, Maria) ^ iubeste(Vasile,Y) ^(YMaria)

¬Y (iubeste(Vasile, Y)) ^ (¬ Y=Maria)

Y ¬iubeste(Vasile,Y) Y=Maria

Y ¬iubeste(Vasile,Y) Y=Maria

Oriciney iubeste numai o persoana

X Y iubeste(X,Y) ^ (Z iubeste(X,Z) Y=Z)

X Y (Z iubeste(X,Z) Y=Z)

Exista cel putin doua persoane diferit (doua variabile diferite) X astfelincat A(X)

X Y (X Y ^ A(X) ^ A(Y))

Exista numain un singu x astfel incat A(X)

X A(X) ^ (A(Y) Y=X)

X Y (A(Y) Y=X

A(Y) Y=X ^ Y=X A(Y)

Exemple

Oricine intarzie va fi pedepsit

X isLate(X) punished(X)

Baietii care intarzie vor fi pedepsiti

Y (isLate(Y) ^ isBoy(Y) punished(Y)

Oricine de aici este mai batran ca oricine de acolo

X,Y isHere(X) ^ isThere(Y)) olderThan(X,Y)

X isHere(X) ¬ (Y isThere(Y) ^ olderThan(Y,X)

Y ¬ isThere(Y) ¬olderThan(Y,X)

Y isThere(Y) olderThan(Y,X)

Oricine se admira

X human(X) admire(X,X)

Vasile iubeste Maria dar Maria iubeste pe altcineva

love(Vasile,Maria) ^ Y love(Maria,Y) ^ (YVasile)

ExempleRelatiile de familie descrise folosind predicatele:

mother (Ileana,Mihai) = Ileana este mama lui Mihai

mother(Ileana,Stefan) = …

father(Ghita, Mihai) = …

father(Ghita,Stefan) = …

Aici se folosesc predicatele mama(mother) sitata(father) pentru a dedini un set de relatii parinte– copil. Implicatiile vor da conditii generale pentrualte tipuri de relatii regulile de inferenta!

parinte(X,Y) ^ parinte(X,Z) sibling(Y,Z) YZ

parinte(X,Y) father(X,Y) mother(X,Y)

Exemple

Daca Gica invidiaza pe Constantin sau invers dar nu simultan atunciGica invidiaza pe Constantin, daca si numai daca Constantin nu ilinvidiaza pe Gica.

1. ((Gica invidiaza Constantin) (Constantin invidiaza Gica)) ^

2. ¬ ((Gica invidiaza Constantin) ^ (Constantin invidiaza Gica))

3. (Gica invidiaza Constantin)

4. ¬ (Constantin invidiaza Gica)

(AB) ^ (¬ (A^B) (A ¬ B)

(A B) ^ (¬ (A ^ B) (A ¬ B)

T T T F F T T T T T F F

T T F T T T F F T T T T

F T T T T F F T T F T F

F F F F T F F F T F F T

Inferenţă logică Regulile de inferenţă uzuale sunt:

Modus ponens – (F, F -> G G)

Modus tollens – (¬ G, F -> GF)

Regula eliminării cuantificatorului universal –

X: (∀ X F(X) F(t))

O mulţime de premise se numesc inconsistente, dacă orice formulă poate fi obţinută prin inferenţădin mulţimea de formule.

13

Exemplu

Mihai are bani

Masina este alba

Masina este frumoasa

Daca masina este alba sau masina este frumoasa siMihai are bani atunci Mihai pleaca in vacanta

B

A

F

(A F) B C

Cunoştinţe în Prolog Un program Prolog este o listă ordonată de clauze

Horn (prin care se formamimiează enunţurideclarative) care exprimă:

1. Reguli:

2. Fapte:

3. Scopuri:

Unei reguli i se poate asocia:

o interpretare logică –

o interpretare procedurală –

15

Reprezentarea cunoştinţelor în Prolog

Principalele secţiuni

Domeniile

Predicatele

Scopul

Clauzele

Termeni specifici subprogramw&implementari

16

Subrutine .

Predicatele

Argumentele predicatelor

Dacă un argument primeşte o valoare în timpulapelului predicatului, atunci argumentul este de tip intrare, altfel de tip ieşire.

17

Tipuri de date: sunt symbol, integer, real, string, char, list, file, simple, compound. Nu se pot definitablouri.

Constantele sunt true şi fail.

Comentariile dacă sunt pe mai multe linii suntcuprinse între /* şi */, iar dacă sunt pe o singurălinie încep cu %.

Clauzele sunt scrise în Prolog după sintaxa:

cap :- corp

Scopurile sunt trecute într-o listă separate prin , sau ;

18

Rezoluţia în Prolog

Exemplu: se dau

Fapte (a) tata(paul, ion)

(b) tata(marian, paul)

Regula (c) bunic(A,B):- tata(A,P), tata(P,B)

Scop (d) bunic(X,Y).

19

Noile scopuri sunt (e) tata(X,P),tata(P,Y).

Noul scop este : (f) tata(Ion,Y).

Noul scop este : (g) tata(Paul,X).

Noul scop este: (h) clauza vidă.

20

Observaţii Soluţiile nu sunt găsite întotdeauna; ordinea

clauzelor din program este importantă.

Ca regulă generală într-un program se scriu fapteleşi apoi regulile.

De exemplu:

1. a->a a

determină o buclă infinită pentru scopul a, în pofidaunui răspuns evident.

2. a a->a

dă un răspuns adevărat.

21

Controlul rezoluţiei În Prolog există un predicat predefinit „!” (sau „/”)

care permite suprimarea explorării anumitorramuri din arborele de rezoluţie.

Acest predicat este întotdeauna True.

În utiliziarea metodei backtracking, dacăinterpretorul ajunge la un nod la care lista de scopuri începe cu predicatul de întrerupere a explorării arborelui de rezoluţie, atunci se întoarcepână la nodul corespunzător nodului precedent, scop care a declanşat apelul regulii care conţineapredicatul !.

22

23

Definirea relatiilor prin fapte Fie un intreg arbore de familie

Arborele definit de programulProlog va fi:

parinte( Ioana, gigi).

% Ioana este parinte pentru gigi

parinte( Ion, gigi).

parinte( Ion, mimi).

parinte( gigi, fifi).

parinte( gigi, ana).

parinte( ana, ticu).

Ioana

mimigigi

ticu

anafifi

Ion

24

Intrebari posibile:

Este gigi parinte pentru ana?

?- parinte( gigi, ana).

?- parinte( mimi, ana).

?- parinte( Ion, ben).

Cine este parintele lui mimi?

?- parinte( X, mimi).

Care sunt copii lui gigi?

?- parinte( gigi, X).

Ioana

mimigigi

ticu

anafifi

Ion

Definirea relatiilor prin fapte

25

Intrebari:

Cine este parintele si al cui este?

Gaseste X si Y care satisfac faptulca X este parintele lui Y.

?- parinte( X, Y).

Cine este bunicul lui ticu?

?- parinte( Y, ticu),

parinte( X, Y).

Ioana

mimigigi

ticu

anafifi

Ion

ticu

parinte

parinte

X

Y bunic

Definirea relatiilor prin fapte

26

Intrebari:

Care sunt nepotii lui Ion?

?- parinte( Ion, X),

parinte( X, Y).

Au fifi si cu ana un parinte comun?

?- parinte( X, fifi),

parinte( X, ana).

Ioana

mimigigi

ticu

anafifi

Ion

Definirea relatiilor prin fapte

27

In Prolog este usor sa se defineasca o relatie

Utilizatorul poate interoga usor sistemulprolog despre relatiile definite in program.

Un program Prolog este compus din clauze. Fiecare clauza se termina cu oprire completa.

Argumentele unei relatii pot fi:

Atomi:

Variabile:

Definirea relatiilor prin fapte

28

Fapte: female( Ioana). % Ioana este femeie male( Ion). % Ion este barbat male( gigi). female( mimi). female( fifi). female( ana). male( ticu).

Definirea relatiei de “copil al lui/ei” - “offspring()”: Fapt: offspring( mimi, Ion). Regula: offspring( Y, X) :- parinte( X, Y).

Pentru toti X si Y, Y este un copil al lui X dacaX este un parinte al lui Y.

Ioana

mimigigi

ticu

anafifi

Ion

Definirea relatiilor prin reguli

29

Dupa cum am mai spus regulile sunt compusedin: O parte de conditie (corpul)

Plasata in partea dreapta a regulii

O parte de concluzie (capul) Plasata in partea stanga a reguliithe left-hand side of the rule

Exemplu: offspring( Y, X) :- parinte( X, Y).

Regula este in general in sensul ca este aplicabila asupraunor obiecte de tipul X si Y.

Un caz special al reulii generale poate fi: offspring( mimi, Ion) :- parinte( Ion, mimi).

?- offspring( mimi, Ion).

?- offspring( X, Y).

X

Y

parinte copil

Definirea relatiilor prin reguli

30

Definirea realtiei de tip “mama”: mother( X, Y) :- parinte( X, Y), female( X).

Pentru toti X si Y X este mama lui Y daca

X este parinte al lui Y si

X este femeie

Definirea relatiei de tip “bunic”: grandparinte( X, Z) :- parinte( X, Y), parinte( Y, Z).

Pentru toti X si Y X este bunic pentru Z daca

X este parinte pentru Y si

Y este parinte pentru Z

parine

X

Y

mama

femeie

Definirea relatiilor prin reguli

Z

parinte

parinte

X

Y bunic

31

Definirea relatiei “sora”: sister( X, Y) :-parinte( Z, X), parinte( Z, Y), female(X). Pentru orice X si Y

X este o sora a lui Y daca1. Atat X si Y au acelasi parinte si2. X este femeie

Exemplu de intrebari ce pot fi puse sistemului: ?- sister( fifi, ana). ?- sister( X, ana). ?- sister( ana, ana).

ana este sora pentru ea insasi?! Pentru a corecta relatia de tip sora:

sister( X, Y) :-parinte( Z, X), parinte( Z, Y), female(X),

different( X, Y). different (X, Y) este satisfacuta daca si numai daca X si Y nu sunt egale

Y

parinteparinteZ

X

sorafemeie

Definirea relatiilor prin reguli

32

Dupa cum stim clauzele Prolog suntformate din: capCorp

Clauzele prolog sunt de trei tipuri:FapteReguliintrebari

Definirea relatiilor prin reguli

33

O variabila poate fi inlocuita cu orice alt obiect

Variabilele se presupun a fi universal cuantificate sisunt citite “for all”.

De exemplu:hasachild( X) :- parinte( X, Y).

Poate fi citit/interpretat in doua moduri

(a) For all X si Y,

daca X este un parinte al lui Y tatunci X are un copil.

(b) For all X,

X are un copil daca exita cativa Y astfel incat X esteparinte al lui Y.

Definirea relatiilor prin reguli

34

Reguli recursive Definirea relatiei de tip “predecesor()”

predecesor( X, Z):- parinte( X, Z).

predecesor( X, Z):-

parinte( X, Y), predecesor( Y, Z).

For all X si Z,

X este un predecesor al lui Z daxa

exista un Y astfel incat

(1) X este un parinte al lui Y si

(2) Y este un predecesor al lui Z.

?- predecesor( Ioana, X).

parinte

X

Y

predecesor

Z

parinte

parinte

X

Y predecesor

Y2

parinte

parinte

X

Y1

predecesor

Z

parinte

parinte

X

Y1

predecesor

Z

:predecesor

35

parinte( Ioana, gigi). parinte( Ion, gigi).parinte( Ion, mimi).parinte( gigi, fifi).parinte( gigi, ana).parinte( ana, ticu).

female( Ioana). female( mimi).female( fifi).female( ana).male( Ion). male( gigi).male( ticu).

offspring( Y, X) :-parinte( X, Y).

mother( X, Y) :-parinte( X, Y), female( X).

grandparinte( X, Z) :-parinte( X, Y), parinte( Y, Z).

sister( X, Y) :-parinte( Z, X),parinte( Z, Y), female( X),X \= Y.

predecesor( X, Z) :- % regula pr 1parinte( X, Z).

predecesor( X, Z) :- % regula pr 2parinte( X, Y),predecesor( Y, Z).

Programul pentru familie

36

Reguli recursive

Procedure:

In programul anterior, sunt doua clauze privindrelatiile de definire a predecesorului

predecesor( X, Z) :- parinte( X, Z).

predecesor( X, Z) :- parinte( X, Y), predecesor( Y, Z).

Un astfel set de clauze este numit procedura.

Comentariile se pot introduce in codul sursaastfel:

/* This is a comment */

% This is also a comment

37

Trace and Notrace| ?- trace.Compilatorul va prezenta informatii detaileate

privind executia programului (trace)

(15 ms) yes{trace}

| ?- predecesor( X, Z).1 1 Call: predecesor(_16,_17) ? 2 2 Call: parinte(_16,_17) ? 2 2 Exit: parinte(Ioana,gigi) ? 1 1 Exit: predecesor(Ioana,gigi) ?

X = IoanaZ = gigi ? ;

1 1 Redo: predecesor(Ioana,gigi) ? 2 2 Redo: parinte(Ioana,gigi) ? 2 2 Exit: parinte(Ion,gigi) ? 1 1 Exit: predecesor(Ion,gigi) ?

X = IonZ = gigi ? ;

X = gigiZ = ticu

1 1 Redo: predecesor(gigi,ticu) ? 3 2 Redo: predecesor(ana,ticu) ? 4 3 Call: parinte(ana,_144) ? 4 3 Exit: parinte(ana,ticu) ?

…4 3 Fail: parinte(ticu,_17) ? 4 3 Call: parinte(ticu,_144) ? 4 3 Fail: parinte(ticu,_132) ? 3 2 Fail: predecesor(ticu,_17) ? 1 1 Fail: predecesor(_16,_17) ?

(266 ms) no{trace}

| ?- notrace.debugger este oprit

yes

38

Cum raspunde Prolog la intrebari Prolog accepta fapte si reguli ca pe un set de axioms,

iar intrebarile puse de utilizator ca o teoremaneverificata (inca)

Exemple:

Axiome: Toti oamenii sunt supusi greselii.

Socrates este un om.

Teorema: Socrate este supus greselii.

Pentru oricare , daca X este omatunci X etse supusgreselii.

fallible( X) :- man( X).

man( socrates). ?- fallible( socrates).

39

?- predecesor( Ion, ana).predecesor( X, Z) :- parinte( X, Z). %regula pr 1

predecesor( X, Z) :- parinte( X, Y), % regula pr2

predecesor( Y, Z).

(1) parinte( gigi, ana) este un fapt/adevar predecesor( gigi, ana)

Pornind de la parinte( gigi, ana) va urma regula pr1 predecesor( gigi, ana).

(2) parinte( Ion, gigi) este un fapt.

(3) parinte( Ion, gigi) si predecesor( gigi, ana)

predecesor( Ion, ana).

Folosind acest fapt si pe cel derivat parinte( gigi, ana) se poate concluziona ca predecesor( Ion, ana).

Ioana

mimigigi

ticu

anafifi

Ion

parinte( Ioana, gigi). parinte( Ion, gigi).parinte( Ion, mimi).parinte( gigi, fifi).parinte( gigi, ana).parinte( ana, ticu).

Cum raspunde Prolog la intrebari

40

?- predecesor( Ion, ana).predecesor( X, Z) :- parinte( X, Z). % regula pr1predecesor( X, Z) :- parinte( X, Y), % regula pr2

predecesor( Y, Z).

Cum lucreaza de fapt Prolog pentru demonstratea uneiafirmatii?

Prolog incearca intai prima clauza care apare in program. (regula pr 1 in cazul nostru)

Now, X= Ion, Z = ana.

Apoi telul predecesor( Ion, ana) este inlocuit cu parinte( Ion, ana).

Ioana

mimigigi

ticu

anafifi

Ion

Cum raspunde Prolog la intrebari

41

?- predecesor( Ion, ana).predecesor( X, Z) :- parinte( X, Z). % Regula pr1

predecesor( X, Z) :- parinte( X, Y), % Regula pr2

predecesor( Y, Z).

Se aplica regula pr2, X = Ion, Z = ana, dar Y nu esteinca instantiat.

Telul/scopul predecesor( Ion, ana) este inlocuit cu doua scopuri: parinte( Ion, Y)

predecesor( Y, ana)

Ioana

mimigigi

ticu

anafifi

Ion

parinte( Ioana, gigi). parinte( Ion, gigi).parinte( Ion, mimi).parinte( gigi, fifi).parinte( gigi, ana).parinte( ana, ticu).

Cum raspunde Prolog la intrebari

42

predecesor( Ion, ana)

predecesor( gigi, ana)

parinte( Ion, Y)predecesor( Y, ana)

parinte( Ion, ana)

parinte( gigi, ana)

no

Folosind regula pr1 Folosind regula pr2

Folosind faptulparinte( Ion, gigi)Y = gigi

Folosind regula pr1

yes

Diagrame de desfasurare

parinte( Ioana, gigi). parinte( Ion, gigi).parinte( Ion, mimi).parinte( gigi, fifi).parinte( gigi, ana).parinte( ana, ticu).

predecesor( X, Z) :- parinte( X, Z). % Rule pr1predecesor( X, Z) :- parinte( X, Y), % Rule pr2

predecesor( Y, Z).

Cum raspunde Prolog la intrebari

43

Urmarirea executiei / Trace| ?- predecesor( Ion, ana).

1 1 Call: predecesor(Ion,ana) ? 2 2 Call: parinte(Ion,ana) ? 2 2 Fail: parinte(Ion,ana) ? 2 2 Call: parinte(Ion,_79) ? 2 2 Exit: parinte(Ion,gigi) ? 3 2 Call: predecesor(gigi,ana) ? 4 3 Call: parinte(gigi,ana) ? 4 3 Exit: parinte(gigi,ana) ? 3 2 Exit: predecesor(gigi,ana) ? 1 1 Exit: predecesor(Ion,ana) ?

true ?

predecesor( X, Z) :- parinte( X, Z). % Rule pr1predecesor( X, Z) :- parinte( X, Y), % Rule pr2

predecesor( Y, Z).

Diagrame de desfasurare

predecesor( Ion, ana)

predecesor( gigi, ana)

parinte( Ion, Y)predecesor( Y, ana)

parinte( Ion, ana)

parinte( gigi, ana)

no

Folosind regula pr1 Folosind regula pr2

Folosind faptulparinte( Ion, gigi)Y = gigi

Folosind regula pr1

yes

44

Obiecte de date

Obiecte de date

variabileconstante

structuriObiecte simple

numereatomi

45

Atomi si numere Caractere:

Litere mari A, B,…, Z Litere mici, b,…, z Cifre 0,1,2,…,9 Caractere speciale cum ar fi +-*/<>=:.&_~

Atomii (Atoms()) pot fi contruiti in trei moduri :

1) Siruri de litere, cifre si caracterul’_’, incaepand cu o litera mica

Ioana, z45, a_25CZ, a___c, domisoara_Mihaela

2) Siruri de caractere speciale: <--->, ===>, …,::=,.:., (except :- )

3) Siruri de caracter e intre ghilimele ‘Ion’, ‘Nord_est’, ‘Georgica Jorge’

Numere: Numerele folosite in Prolog include intregi si reali

Numere intregi: 6014, 0, -33 Real numbers: 6.28, -0.0044, 300.1

In calculul simbolic sunt folosite des numerele intregiintegers

46

Variabile Variabilele incep cu o litera mare sau un caracter

underscore.

Exemple: S, Vina, _y12, _44

Variabile anonime:

Exemple:

hasachild( X) :- parent( X, Y).

hasachild( X) :- parent( X, _).

somebody_has_child :- parent( _, _).

somebody_has_child :- parent( X, Y).

somebody_has_child :- parent( X, X).

?- parent( X, _) Suntem interesati de oamenii care au copii, dar nu si de numele

copiilor.

47

Scopul lexical al numelor variabilelor este o clauza .

Daca numele Z14 apare in doua clauze, atunciel semnifica doua variabile diferite.

hasachild(X) :- parent( X, Y).

isapoint(X) :- point( X, Y, Z).

Dar fiecare aparitie al lui Z14 cu aceeasi clauzainseamna referire la aceeasi variabila.

hasachild( X) :- parent( X, Y).

Variabile

48

Obiectele structurate sunt obiecte care au mai multecomponente.

Toate obiectele structurate pot fi reprezentate ca arbori.

Radacina arborelui este functor-ul.

Copii radacinii sunt componentele

Componentele pot li la randul lor alte structuri sau simple varoabile

date( Day, may, 2001)

Example: date( 1, may, 2001)

Toate obiectele de date in Prolog reprezinta termeni.

date

1 may 2001

(functor, radacina)

(argumente)

Structuri

Obiecte de date

variabileconstante

structuriObiecte simple

numereatomi

49

Se vor alege urmatorii functori:

point pentru puncte,

seg pentru segmente de dreapta

triangle pentru triunghiuri.

Reprezentare:

P1 = point( 1, 1)

P2 = point( 2, 3)

S = seg( P1, P2)

= seg( point(1,1), point(2,3))

T = triangle( point(4,2), point(6,4), point(7,1))

P1=(1,1)

(4,2)

(7,1)

(6,4)P2=(2,3)

TS

Structuri

50

Reprezentarea structurala a obiectelor:

P1 = point( 1, 1)

S = seg( P1, P2)

= seg( point(1,1), point(2,3))

T = triangle( point(4,2), point(6,4), point(7,1))

P1=point

1 1 point

1 1

point

2 3

S=seg

point

4 2

point

6 4

T=triangle

point

7 1

Functor principal

Structuri

51

point( X1, Y1) and point( X, Y, Z)

sunt diferite.

Sistemul Prolog va recunoaste diferenta dintre numarulergumentelor si va interpreta numele ca doi functori .

Structura arborescenta corespunzatoareexpresieie (a + b)*(c - 5).

Folosind operatorii ‘*’,’+’ si ‘-’ ca functori

*(+( a, b), -( c, 5))?- X = *(+( a, b), -( c, 5)).

?- X is *(+( 3, 4), -( 6, 5)).

De fapt Prolog foloseste notatia infix (aia normala)

Structuri

a b

c 5

*

3 4

6 5

*

Notatia infix

52

Tema Propuneti o reprezentare pentru dreptunghi, patrat si cerc ca o structura Prolog

De exemplu un dreptunghi poate fi reprezentat de ptru puncte dar nu e

obligatoriu poate fi reprezentat de trei puncte si altceva .

Incercati sa scrieti niste exemple concrete pentru structurile propuse .

point

4 2

point

6 4

T=triangle

point

7 1

53

Potrivirea / Matching Cea mai importanta operatie aplicata termenilor este cea de

potrivire.

Potrivirea este un proces care primeste la intrare doitermeni si verifica daca acestia se potrivesc. Da eroare: daca termenii nu se potrvesc

Reuseste: daca termenii se potrivesc

Fie doi termeni vom spune ca acestia se potrivesc daca: Eai sunt identici sau

Variabilele din cei doi termeni pot fi instantiate catre obiecte astfelincat prin aceasta substitutie termenii devin identici.

De exemplu:

termenii date( D, M, 2001) si date( D1, may, Y1) se potrivesc

termenii date( D, M, 2001) and date( D1, M1, 1444) NU se potrivesc

54

Potrivirea

| ?- date( D, M, 2001) = date(D1, may, Y1).

D1 = DM = mayY1 = 2001

Yes

| ?- date( D, M, 2001) = date(D1, may, Y1), date( D, M, 2001) = date( 15, M, Y).

D = 15D1 = 15

M = mayY = 2001Y1 = 2001

Yes

Cerere de verificare a potrivirii folosind operatorul ‘=‘:

55

Regulile generale pentru a decide ca doi termeni S si T se postrivesc sunt dupa cum urmeaza:

Daca S si T sunt constante atunci S si T se potrivescnumai daca sunt acelasi obiect.de exemplu: | ?- date( D, M, 2001) = date(D1, may, 2001).

D1 = D M = may yes

Daca S este o variabila si T este orice altceva atunci se potrivesc daca S poate fi instantiat la T.

Daca S si T sunt structuri atunci se potrivesc numai daca

S si T au acelasi functor/comportament principal, and

Toate componentele lor se potrivesc.

Potrivirea

56

Potrivirea| ?- triangle( point(1,1), A, point(2,3))=

triangle( X, point(4,Y), point(2,Z)).

A = point(4,Y)

X = point(1,1)

Z = 3

yes

X point

4 Y

triangle

point

2 Z

point

1 1

A

triangle

point

2 3

57

Potrivirea Segmente de linie verticale si orizontale

‘Vertical’ este o relatie unara.

Un segment este vertical daca coordonaletele de pe x ale punctelor care il definesc sunte egale.

Proprietatea orizontal este definita la fel numai capentru coordonatele de pe y .

vertical( seg( point(X,Y), point(X, Y1))).

horizontal( seg( point(X,Y), point(X1, Y))).

point(X,Y1)

point(X,Y)

point(X1,Y)point(X,Y)

x

y

58

Potrivirea Un exemplu:

point(1,1).point(1,2).point(2,4).seg(point(1,1), point(1,2)).seg(point(1,1), point(2,4)).seg(point(1,2), point(2,4)).vertical( seg( point( X, Y), point( X, Y1))).horizontal( seg( point( X, Y), point( X1, Y))).

| ?- vertical( seg( point(1,1), point( 1,2))).yes

| ?- vertical( seg( point(1,Y), point(2,Y))).no

| ?- horizontal( seg( point(1,1), point(2,Y))).Y = 1yes

59

Potrivirea| ?- horizontal( seg( point(1,1), P)).

P = point(_,1)

Yes

| ?- vertical( seg( point(1,1), P)).

P = point(1,_)

_Yes

| ?- vertical( S), horizontal( S).

S = seg( point( A,B), point( A,B))

yes

60

Intelegerea declaritiva si procedurala a programelor Prolog

Sunt doua niveluri de interpretare a unui program Prolog:

Sensul declarativ

Sensul procedural

61

Intelesul declarativ al programelor de tip Prolog

Fie o clauza :P :- Q, R.

O interpretare declarativa a acestei cauze este:

P este adevarat daca Q si R sunt adevarate.

Din Q si R urmeaza P.

Doua interpretari de tip procedural pentru aceasta clauzasunt:

Pentru a rezolva problema P, intai se rezolvasubproblema Q si apoi subproblema R.

Pentru a satisface P, intai se satisface Q si apoi R.

62

Intelesul/Interpretarea declarativa: Interpretarea declarativa a programelor determina atunci cand un tel este

adevarat si daca da pentru ce valori ale variabilelor este acest lucru adevarat

Instanta versus variant: O instanta a unei clauzze C este clauza C cu fiecare din variabilele sale

inlocuita de un termen.

Un variant al unei clauze C este o instanta a clauzei C unde fiecare variabilaeste sustituita se alta variabila.

De exemplu considera clauza:

hasachild( X) :- parinte( X, Y).

Intelesul declarativ al programelor de tip Prolog

Cele doua variante ale aceste clauze sunt:

hasachild( A) :- parinte( A, B).

hasachild( X1) :- parinte( X1, X2).

Instantele acestei clauze sunt:

hasachild( peter) :- parinte( peter, X).hasachild( barry) :- parinte( barry, small(caroline)).

63

Un tel/scop G este true daca si numaidaca

(1) Exista o clauza C in program astfel incat

(2) Exista o instanta I a clauzei C astfel incat

(a)Capul lui I este identic cu G, si

(b) Toate scopurile din corpul lui I sunttrue.

Intelesul declarativ al programelor de tip Prolog

64

Prolog accepta si disjungerea scopurilor:

Oricare din scopurile prezentate intr-o disjungere trebuiesa sa fie adevarat.

P :- Q; R.

P este true daca Q este true SAU R este true.

Exemplu:

P :- Q, R; S, T, U.

P :- (Q, R); (S, T, U).

P :- Q, R.

P :- S, T, U.

Intelesul declarativ al programelor de tip Prolog

65

executie

program

lista scopuriIndicator de Succes/Nu

Instantiatierea variabilelor

Indicatorul de sucses/nu este‘DA’ daca telurile pot fi

indeplinitesi ‘NU’ in rest.program

Instantierea variabilelor esterealizata numai in caz de

terminare cu succes

Intelesul procedural al programelor de tip Prolog

66

O procedura se executa: Daca lista de teluri G1,…,Gm este goala atunci se termina

cu succes.

Daca lista de scopuri nu este goala atunci se apeleazaSCANNING.

SCANNING : Cauta prin clauzele din program de sus in jos (top to bottom) pana

cand este gasita prima clauza C astfel incat capul lui C se potriveste cu primul tel G din lista. Daca nu se gaseste o astfel de clauza atunci se termina xu eroare.

Daca exista o astfel de clauza C, atunci redenumeste variabilele din C pentru a obtine un variant C’ al lui C, astfel incat C’ si listaG1, …,Gm nu mai au variabile comune.

Incearca o potrivire intre G1 si capul lui C’. In locuieste G1 cu corpullui C (mai putin faptele) pentru a obtine o noua lista de teluri.

Executa aceasta noua lista de teluri.

Intelesul procedural al programelor de tip Prolog

67

Program:

big( bear).

big( elephant).

small( cat).

brown( bear).

black( cat).

gray( elephant).

dark(Z):- black(Z).

dark(Z):- brown(Z).

{trace}

| ?- dark(X), big(X). (goal list: dark(X), big(X))

1 1 Call: dark(_16) ? (dark(Z):- black(Z);

goal list: black(X), big(X))

2 2 Call: black(_16) ?

2 2 Exit: black(cat) ? (yes)

1 1 Exit: dark(cat) ? (X = cat; goal list: big(X))

3 1 Call: big(cat) ? (no)

3 1 Fail: big(cat) ?

1 1 Redo: dark(cat) ? (X != cat, backtrack;

goal list: dark(X), big(X))

2 2 Call: brown(_16) ? (dark(Z):- brown(Z);

goal list: brown(X), big(X))

2 2 Exit: brown(bear) ?

1 1 Exit: dark(bear) ? (yes, X= bear; goal list: big(X))

3 1 Call: big(bear) ? (yes)

3 1 Exit: big(bear) ?

X = bear

yes

{trace}

Intelesul procedural al programelor de tip Prolog

68

De fiecare data cand un apel de executierecursiv da eroare, executia programului se intoarce SCANING, si continua de la clauza C care fusese ultima folosita

Prolog abandoneaza toate rezultateleexecutiei lipsite de succes si se intoarcelapunctul de unde ramura eronata a executieia inceput .

Intelesul procedural al programelor de tip Prolog

69

Temabig( bear).

big( elephant).

small( cat).

brown( bear).

black( cat).

gray( elephant).

dark(Z):- black(Z).

dark(Z):- brown(Z).

In care din cele doua cazuri Prolog trebuie sa munceasca maimult inainte de a gasi raspunsul ?

?- big(X), dark(X).

?- dark(X), big(X).

70

Exemplu: maimutza si banana Problema:

Este o maimuta intr-o camera linga usa

In mijlocul camerei o atarna de tavan o banana.

Maimuta este infometata si vrea sa ajunga la banana darnu se poate intinde/sari suficient de mult/sus ca sapoata ajunge la banana

La fereastra camerei se afla o cutie pe care maimuta o poate folosi .

Maimuta poate efectua urmatoarele actiuni:

Merge pe podea

Se catara pe cutie

Impinge cutia intr-o directie

Apuca banana daca sta pe cutie dedesuptul bananei

Poate maimuta lua banana?

71

Reprezentarea problemei: Starea initiala:

(1) Maimuta este la usa.

(2) Maimuta is on floor.

(3) Cutia este la freastra.

(4) Maimuta does not have banana.

state( atdoor, onfloor, atwindow, hasnot)

Scopul jocului:

state( _, _, _, has)

atdoor onfloor atwindow

state

hasnot

Exemplu: maimutza si banana

72

Exista patru tipuri de miscari:(1) apuca banana,

(2) catara pe cutie,

(3) impinge cutia,

(4) umbla prin camera.

O relatie cu trei parametri:

move( State1, Move, State2)

‘prinde’:

move( state( middle, onbox, middle, hasnot),

grasp,

state( middle, onbox, middle, has)).

State2Misca

State1

Exemplu: maimutza si banana

73

‘merge’:move( state( P1, onfloor, Box, Has),

walk( P1, P2),

state( P2, onfloor, Box, Has)).

‘catara’:move( state( P, onfloor, P, Has),

climb,

state( P, onbox, P, Has)).

‘impinge’:move( state( P1, onfloor, P1, Has),

push( P1, P2),

state( P2, onfloor, P2, Has)).

Exemplu: maimutza si banana

74

Intrebare: Poate maimuta intr-o stare initiala State sa iabanana?

canget( State)

canget( state( _, _, _, has)).

canget( State1) :-

move( State1, Move, State2),

canget( State2).

canget canget has

State1 State2Move

Exemplu: maimutza si banana

75

move( state( middle, onbox, middle, hasnot), grasp,

state( middle, onbox, middle, has) ).

move( state( P, onfloor, P, H),climb, state( P, onbox, P, H) ).

move( state( P1, onfloor, P1, H),push( P1, P2), state( P2, onfloor, P2, H) ).

move( state( P1, onfloor, B, H),walk( P1, P2), state( P2, onfloor, B, H) ).

canget( state( _, _, _, has) ).

canget( State1) :- move( State1, Move, State2), canget( State2).

Programul pentru problema maimutza si banana

76

| ?- canget( state( atdoor, onfloor, atwindow, hasnot)).true ? Yes (maimuta poate lua banana in aceasta stare.)

{trace} | ?- canget( state( atdoor, onfloor, atwindow, hasnot)).

1 1 Call: canget(state(atdoor,onfloor,atwindow,hasnot)) ? 2 2 Call: move(state(atdoor,onfloor,atwindow,hasnot),_45,_85) ? 2 2 Exit: move(state(atdoor,onfloor,atwindow,hasnot),

walk(atdoor,_73),state(_73,onfloor,atwindow,hasnot)) ? 3 2 Call: canget(state(_73,onfloor,atwindow,hasnot)) ? 4 3 Call: move(state(_73,onfloor,atwindow,hasnot),_103,_143) ? 4 3 Exit: move(state(atwindow,onfloor,atwindow,hasnot),

climb,state(atwindow,onbox,atwindow,hasnot)) ? 5 3 Call: canget(state(atwindow,onbox,atwindow,hasnot)) ? 6 4 Call: move(state(atwindow,onbox,atwindow,hasnot),_158,_198) ? 6 4 Fail: move(state(atwindow,onbox,atwindow,hasnot),_158,_186) ? 5 3 Fail: canget(state(atwindow,onbox,atwindow,hasnot)) ? 4 3 Redo: move(state(atwindow,onfloor,atwindow,hasnot),

climb,state(atwindow,onbox,atwindow,hasnot)) ?

Exemplu: maimutza si banana

77

4 3 Exit: move(state(atwindow,onfloor,atwindow,hasnot),

push(atwindow,_131),state(_131,onfloor,_131,hasnot)) ?

5 3 Call: canget(state(_131,onfloor,_131,hasnot)) ?

6 4 Call: move(state(_131,onfloor,_131,hasnot),_161,_201) ?

6 4 Exit: move(state(_131,onfloor,_131,hasnot),

climb,state(_131,onbox,_131,hasnot)) ?

7 4 Call: canget(state(_131,onbox,_131,hasnot)) ?

8 5 Call: move(state(_131,onbox,_131,hasnot),_216,_256) ?

8 5 Exit: move(state(middle,onbox,middle,hasnot),

grasp,state(middle,onbox,middle,has)) ?

9 5 Call: canget(state(middle,onbox,middle,has)) ?

9 5 Exit: canget(state(middle,onbox,middle,has)) ?

7 4 Exit: canget(state(middle,onbox,middle,hasnot)) ?

5 3 Exit: canget(state(middle,onfloor,middle,hasnot)) ?

3 2 Exit: canget(state(atwindow,onfloor,atwindow,hasnot)) ?

1 1 Exit: canget(state(atdoor,onfloor,atwindow,hasnot)) ?

true ?

(62 ms) yes

{trace}

Exemplu: maimutza si banana

78

Simularea unui automat nedeterminist finit De exemplu:

Stari: {s1, s2, s3, s4}.

Stare initiala: s1.

Stare finala: s3.

Simboluri: {a, b}.

null (simbolul null)

Arcele etichetate cu nul corespund

tranzitiilor neconditionate ale automatului

Tranzitiile apar fara o citire a intrarii.

s1 s2

s4 s3

a

ba

b

b

null

null

79

Se spune ca automatul accepta sir la intrare daca este o cale de tranzitii in graf care se ocupa de aceasta astfel incat(1) Porneste din starea initiala

(2) Sfarseste in starea finala si

(3) Etichetele arcelor de-a lungul respectiveicai corespund tuturor elementelor continutein sirul de intrare (deci analiza se face complet).

De exemplu : Automatul va accepta sirulurile ab si aabaab.

Va rejecta sirurile abb si abba.

De fapt se observa ca utomatul accepta oricesir care se termina cu ab, si le respinge perestul.

s1 s2

s4 s3

a

ba

b

b

null

null

Simularea unui automat nedeterminist finit

80

In Prolog, un automat poate fi definit de trei relatii :(1) O relatie unara final care defineste sfarsitul executiei automatului(starea finala).

final(F)

inseamna ca F este stare finala.

(2) O relatie ternara trans care defineste tranitiile intre stari astfel

trans( S1, X, S2)

(3) O relatie binara

silent( S1, S2)

s1 s2

s4 s3

a

ba

b

b

null

null

Simularea unui automat nedeterminist finit

81

De exemplu automatul de mai jos estedescris astfel:

final(s3).

trans(s1, a, s1).

trans(s1, a, s2).

trans(s1, b, s1).

trans(s2, b, s3).

trans(s3, b, s4).

silent(s2, s4).

silent(s3, s1).

s1 s2

s4 s3

a

ba

b

b

null

null

Simularea unui automat nedeterminist finit

82

Reprezentarea sirurilor de intrare: ca liste Prolog.

de exemplu, [a, a, a, b].

Definirea acceptarii unui sir dintr-o stare anume :accepts( State, String)

Relatia binara accepts este adevarata daca automatul incepand din starea State ca stare initiala accepta sirul de simboluri/caractereString.

De exemplu:

| ?- accepts( s1, [a, a, a, b]).true ? yes

s1 s2

s4 s3

a

ba

b

b

null

null

Simularea unui automat nedeterminist finit

83

Relatia accepts poate fi definita de trei clauze:(1) Sir gol, [], este acceptat din starea State daca State este o stare

finala .

accepts( State, []):- final( State).

(2) Un sir nevid este acceptat fin starea State daca citire primuluisimbol din sir poate aduce automatul intr-o stare interna oarecareState1, iar restul sirului este accepta din starea State1.

accepts( State, [ X| Rest]):-

trans( State, X, State1), accepts( State1, Rest).

(3) Un sir este acceptat din starea State daca automatul poate face o tranzitie neconditionata din starea State in starea State1 si apoi saccepte (intregul) sir din starea State1.

accepts( State, String):-

silent( State, State1), accepts( State1, String).

S S1X

S S1null

Simularea unui automat nedeterminist finit

84

For example:| ?- accepts( s1, [a, a, a, b]).true ? yes

| ?- accepts( S, [a, b]).S = s1 ? ;S = s3 ? ;no

| ?- accepts( s1, [X1, X2, X3]).

X1 = aX2 = aX3 = b ? ;X1 = bX2 = aX3 = b ? ;No

| ?- String=[_,_,_,_], accepts( s1, String).

String = [a,a,a,b] ? ;String = [a,b,a,b] ? ;String = [a,b,a,b] ? ;String = [b,a,a,b] ? ;String = [b,b,a,b] ? ;no

s1 s2

s4 s3

a

ba

b

b

null

null

Simularea unui automat nedeterminist finit

85

Comunicarea cu fisiereleComunicarea dintre user si program este

urmatoarea :

Utilizatorul pune intrebari programului

Programul raspunde in termeni de instantiere de variabile

Extensii

86

In orice moment al executiei un program Prolog exista active numai doua fisiere (fluxuri etc) :

Unul pentru intrare (cel curent)

Unul pentru iesire (cel curent)

Fluxul curent de intrare poate fi redirectionat catre un alt fisier cu numele specificat prin Filename daca se folosesteurmatorul tel:

see( Filename)

Fluxul curent de iesire poate fi redirectionat catre un alt fisier cu numele specificat prin Filename daca se folosesteurmatorul tel:

tell( Filename)

Comunicarea cu fisierele

87

De exemplu:

see( file1),

read_from_file( Information),

see( user),

tell( file3),

write_on_file( Information),

tell( user),

Alt exemplu:

readfile( X, Y) :- see('test.txt'), get( X), get( Y), seen.

writefile(X) :- tell('test1.txt'), put( X), told.

| ?- readfile(X, Y).X = 48Y = 49yes

test.txt0123456 …

Comunicarea cu fisierele

Mostra de examen teoretic la PP

88