Sunteți pe pagina 1din 47

PLFav ...

2017 / 2018

Programare logică şi funcţională avansată (PLFav)

V. Negru
Universitatea de Vest din Timişoara
Departamentul de Informatică
e-mail: vnegru@info.uvt.ro

Viorel Negru UVT


PLFav ... 2017 / 2018

Prolog

3 limbaj de programare bazat pe logica

• programare declarativă (specificăm ce să rezolvam)

• pattern matching

• structurare date bazată pe arbori

• backtracking automat

3 PROLOG (PROgramming in LOGic), 1970

• Alain Colmeraurer (Marseille)

• Robert Kowalski, Maarten van Emden, David Warren (Ed-


inburgh)

• Programamre logică cu constrângeri (CLP)

• 1996 - standard ISO pentru Prolog

Viorel Negru UVT


PLFav ... 2017 / 2018

Bibliografie

3 Bibliografie

• I. Bratko - PROLOG. Programming for Artificial Intelli-


gence, Addison Wesley, third edition, 2001

• C. Muscalagiu - Introducere ı̂n programarea logică şi limba-


jele de programare logică, Ed. Univ. ”A.I.Cuza” Iaşi, 1996

• N. Tăndăreanu - Programare logică ı̂n Turbo Prolog, Ed.


Intarf, Craiova, 1994

• H.Pop, G.Serban - Programare ı̂n inteligenţa artificială -


LISP si PROLOG (editia II), Editura Albastră, 2004

• http://web.info.uvt.ro/˜ cizbasa/prolog/

Viorel Negru UVT


PLFav ... 2017 / 2018

Introducere

3 Lisp, Prolog

• lambda calcul, logica predicatelor

• două semantici

3 Prolog

• obiecte, relaţii, reguli de deducere

• lipseşte atribuirea (ı̂nlocuită cu unificarea)

• demonstrator (procesor de cunoştinţe)

• nedeterminism

3 Aplicaţii: IA, prelucrarea limbajului natural, baze de date,


demonstrare de teoreme, calcul simbolic

Viorel Negru UVT


PLFav ... 2017 / 2018

Introducere

3 Construcţii de bază (univers → program)

• obiecte → termeni (constante simbolice)

Maria → maria

• proprietăţi → simboluri predicat

este femeie → femeie

• enunţuri de proprietăţi → clauze (aserţiuni)

Maria este femeie → femeie(maria).

Viorel Negru UVT


PLFav ... 2017 / 2018

Termeni

3 termeni logici (termeni / arbori)

are(maria,carte)

3 variabile - caracter local ı̂n clauze

variable libere / legate

3 Definiţie termeni:

1) constantele simbolice sunt termeni atomici,

2) termenii atomici şi variabilele sunt termeni,

3) dacă f este o funcţie de aritate n şi t1, t2, ..., tn sunt termeni
atunci f (t1, t2, ..., tn) este termen (termen construit).

3 termen ı̂nchis (constant), termen neı̂nchis (deschis)

• atomii ı̂ncep cu litere mici; variabilele ı̂ncep cu litera mare


sau cu

Viorel Negru UVT


PLFav ... 2017 / 2018

Clauze

3 Prolog - bazat pe logica predicatelor

• ... mai exact pe un subset numit ”clauze Horn”

3 Clauze

• aserţiuni / fapte

• reguli

• clauzele cu acelaşi nume (acceaşi parte stângă) - proceduri

3 program = mulţime de clauze

• goal

Viorel Negru UVT


PLFav ... 2017 / 2018

Clauze

3 Clauze - elementele de baza ale unui program

if c1, c2, ..., cn then a1, a2, ..., am

ceea ce ı̂nseamnă:

c1 ∧ c2 ∧ ... ∧ cn ⇒ a1 ∧ a2 ∧ ... ∧ am

• clauză Horn

if c1, c2, ..., cn then c

ceea ce ı̂nseamnă:

c1 ∧ c2 ∧ ... ∧ cn ⇒ c

• sau srisă ı̂n Prolog:

c :- c1, c2, ..., cn.

Viorel Negru UVT


PLFav ... 2017 / 2018

Fapte

3 O proprietate a unui obiect sau o relaţieı̂ntre obiecte (aserţiune


/ fapt)

Relaţii cunoscute ca şi adevărate

Ex. are(maria,carte).

Un fapt este un termen de forma

nume(arg1, arg2, ..., argn).

Viorel Negru UVT


PLFav ... 2017 / 2018

Reguli

c :- c1, c2.

unde c, c1, c2 sunt termeni; c - head; c1, c2 - body

are următoarele interpretări declarative:

c este adevărat dacă c1 şi c2 sunt adevărate

sau

din c1 şi c2 deducem c,

respectiv, următoarele interpretări procedurale:

ca să rezolvăm problema c, mai ı̂ntâi rezolvam subproblema c1


şi apoi subproblema c2

sau

ca să satisfacem pe c, mai ı̂ntâi satisfacem pe c1 si apoi pe c2

Viorel Negru UVT


PLFav ... 2017 / 2018

Reguli

c :- c1; c2.

unde ; reprezinta disjuncţia (sau)

semnificaţia fiind similara cu:

c :- c1.

c :- c2.

conjuncţia (şi) are ordinul de precedenţă mai mare decât disjuncţia


(sau)

c :- c1, c2; c3, c4, c5.

este echivalent cu:

c :- c1, c2.

c :- c3, c4, c5.

Viorel Negru UVT


PLFav ... 2017 / 2018

Structura unui program Prolog

3 proiect (mai multe module)

• modulul principal (conţine ţinta)

• modul (mai multe secţiuni)

• constants, domains, database, predicates, clauses

• goals

Viorel Negru UVT


PLFav ... 2017 / 2018

Exemplu

domains
nume=symbol
obiect=simbol
predicates
are(nume, obiect)
clauses
are(maria, carte).
are(maria, caiet).
are(nicu, stilou).

goal
are(maria, carte)
yes

are(maria, stilou)
no

Viorel Negru UVT


PLFav ... 2017 / 2018

Mecanismul de unificare

3 Operaţii de bază asupra termenilor

• substituţia - o mulţime finită de perechi < xi, ti > unde:

1) xi este o variabilă

2) ti este un termen

3) xi ̸= xj pentru toţi i ̸= j

4) xi nu apare ı̂n nici un tj , ∀i, j

• Putem aplica o substituţie S = < xi, ti > la un termen T :

T −→ TS

Exemplu: T = f f (gg(X), hh(aa, Y )),

S = < X, d >, < Y, bb(Z, e) >

Viorel Negru UVT


PLFav ... 2017 / 2018

Unificare

• Instanţă

Un termen T1 este o instanţă a unui termen T2 dacă ∃ o


substituţie S a.ı̂. T1 = (T2)S

În general este posibil ca nici unul să fie instanţă a celuilalt

Dacă T1 este instanţă a lui T2 spunem ca T2 este mai general


decât T1

• Instanţă comună

Un termen T este instanţă comună pentru T1 şi T2 d.d. T este


instanţă pentru T1 şi T este instanţă pentru T2

La fiecare instanţă comună este asociată o substituţie (numită


unificator), ce aplicată la cei doi termeniı̂i face egali cu instanţa
comună.

Viorel Negru UVT


PLFav ... 2017 / 2018

Unificare

• Termeni unificabili

Doi termeni sunt unificabili dacă au una sau mai multe instanţe
comune

Dacă doi termeni au un unificator, ı̂n general, ∃ mai mulţi,


unul producând instanţa comună cea mai generală. Acesta
este numit unificatorul minimal şi este unic.

• Exemplu

• Algoritmul lui Robinsonm, 1965

Viorel Negru UVT


PLFav ... 2017 / 2018

Execuţia unui program

3 aserţiuni constante, variabile ı̂n ţintă (rezolvantă)

1) ţintă simplă: are(maria, X)

X = carte

X = caiet

În logică are(maria, X) din Prolog corespunde la:

∃x are(maria, x)

2) ţintă compusă: are(maria, X), are(nicu, Y)

În logică avem:


∃x are(maria, x) ∃y are(nicu, y)


sau ∃x ∃y (are(maria, x) are(nicu, y))

Viorel Negru UVT


PLFav ... 2017 / 2018

Algoritmul de ştergere

1) alege o subţintă din ţintă

2) caută o aserţiune care este instanţă a subţintei

- fie S substituţia

- dacă ∃ şi alte alternative (alte aserţiuni posibile) le memoram


pentru reveniri ulterioare după eşec sau succes

- dacă nu ∃ soluţie atunci reluăm cu eşec

3) aplicăm substituţia S la subţintele restante

4) şterge subţinta aleasă

5) dacă nu ∃ subţinte de şters (ţinta vidă)

- reluăm cu succes

- altfel, reı̂ncepem de la (1) procesul de ştergere a subţintelor

Viorel Negru UVT


PLFav ... 2017 / 2018

Algoritmul de ştergere

3 O etapă de calcul elementar ı̂n Prolog corespunde la un ciclu


de ştergere (reducere / inferenţă logică)

• LIPS (număr de inferenţe logice / secundă) - măsură de


eficienţă (eficacitate) a unui interpretor Prolog

• alegere:

- tip şi - ı̂n ţintă

- tip sau - ı̂n baza de aserţiuni

- retur ı̂napoi

• strategie

- subţinte: de la stânga la dreapta

- clauze: de sus ı̂n jos

Viorel Negru UVT


PLFav ... 2017 / 2018

Execuţia unui program

3 Variabile ı̂n aserţiuni

Baza de clauze

aduna(0, X, X).

goal

aduna(0, 1, 1)

yes

• Înterpretarea ı̂n logică este următoarea:

∀x 0+x=x

Aserţiunea căutată este fie o instanţă a ţintei fie mai generală


ca ţinta.

Viorel Negru UVT


PLFav ... 2017 / 2018

Execuţia unui program

3 Variabile ı̂n aserţiuni şi ţintă

Baza de clauze

aduna(0, X, X).

Goal

aduna(0, 1, V).

Viorel Negru UVT


PLFav ... 2017 / 2018

Execuţia unui program

3 Clauze compuse (reguli)

barbat(ion).
barbat(mihai).
barbat(alin).
barbat(george).
femeie(maria).
femeie(silvia).
femeie(ioana).
tata(ion, mihai).
tata(mihai, alin).
tata(george, maria).
mama(maria, alin).
mama(silvia, mihai).
mama(ioana, maria).
parinte(X, Y) :- tata(X, Y).
parinte(X, Y) :- mama(X, Y).
fiica(X, Y) :- parinte(Y, X), femeie(X).

goal
fiica(X, george)
X = Maria
No

Viorel Negru UVT


PLFav ... 2017 / 2018

Execuţia unui program

fiica(X, Y) :- parinte(Y, X), femeie(X).

are ı̂n logică interpretarea:


∀x∀y (fiica(x,y) ⇐ parinte(y, x) femeie(x))

3 Reguli de inferenţă

• modus-ponens

∧ ∧ ∧
A1 ,A2 ,...,An ;B⇐A1 A2 ... An
B

• modus-ponens universal
∧ ∧ ∧
A1 (a),A2 (a),...,An (a);B⇐A1 (x) A2 (x) ... An (x)
B(a)

Viorel Negru UVT


PLFav ... 2017 / 2018

Algoritmul general

1) alege o subţintă din ţintă

2) caută o clauză care partea stângă se unifica cu ţinta

- fie U unificatorul

- dacă ∃ şi alte alternative (alte clauze posibile) le memoram


pentru reveniri ulterioare după eşec sau succes

- dacă nu ∃ soluţie atunci reluăm cu eşec

3) aplicăm U la corpul clauzei selectate si la subţintele restante

4) ı̂nlocuieşte ţinta aleasă cu corpul substituit al clauzei (corp


ce poate fi si vid)

5) dacă nu ∃ subţinte de şters (ţinta vidă)

- reluăm cu succes

- altfel, reı̂ncepem de la (1) procesul de ştergere a subţintelor

Viorel Negru UVT


PLFav ... 2017 / 2018

Arborele de căutare

3 arbore şi/sau

Descompunere ţintă ı̂n subţinte

La fiecare nod avem: - o clauză cu variabilele redenumite; -


unificatorul minimal ı̂ntre subţinta curentă şi clauză

Fiecare nod are: - o ţinta (nodul rădăcină are ţinta iniţială); -


o subţintă aleasă conform strategiei standard

Nod şi - subţinte; nod sau - parcurgere bază de clauze (cu


acelaşi nume)

Noduri frunză: - nod eşec - nu există clauză cu care să se unifice


sunţinta; - nod succes - există aserţiune cu care se unifică

Fiecare ramură retrasează istoricul demonstraţiei

Viorel Negru UVT


PLFav ... 2017 / 2018

Strategia

3 backtracking cronologic

Parcurgere - strategia standard - ı̂n adâncime şi de la stânga


la dreapta

Se reţine o ramură - cea a demonstraţiei cucrente (ramurile


de eşec şi de succes sunt uitate; variantele alternative sunt
memorate)

Atenţie - ramuri infinite

Strategia standard este incompletă

Algortim de parcurgere - construcţie a unui arbore de cautare

Ordinea subţintelor, clauzelor: - modificarea ordinii clauzelor -


alt parcurs al arborelui de căutare; modificarea ordinii subţintelor
- efect mai profund

Viorel Negru UVT


PLFav ... 2017 / 2018

Recursivitate

bunic(X, Y) :- tata(X, Z),parinte(Z, Y).

% stramos este ^ınchiderea tranzitivă a relaţiei parinte


% clauză de terminare
stramos(X, Y) :- parinte(X, Y).
% clauză recursivă
stramos(X, Y) :- parinte(X, Z),stramos(Z, Y).

goal
stramos(X, Alin)

X = ion
...

% rescrierea clauzei recursive astfel:


stramos(X, Y) :- stramos(Z, Y),parinte(X, Z).
% poate produce solutii, dar ciclează

%la inversarea clauzelor astfel:


stramos(X, Y) :- parinte(X, Z),stramos(Z, Y).
stramos(X, Y) :- parinte(X, Y).
% nu mai obţinem nimic

Viorel Negru UVT


PLFav ... 2017 / 2018

Reducerea nedeterminismului

3 Cut (!)

Predicat de aritate 0; Modifică strategia standard de parcur-


gere (strategia sau)

Nu are semnificaţie logică

Suprimare alternative; Tăiere dinamică a arborelui de căutare

Dacă o subţintă cut este selecţionată - ea este considerată re-


zolvată imediat şi este ştearsă din ţintă

% Exemplu
P :- P1,P2,!,P3.
P.

Viorel Negru UVT


PLFav ... 2017 / 2018

Tăietura cut

• Efectul asupra parcurgerii arborelui este următorul:

Fie N nodul părinte al nodului ı̂n care apare cut şi NC nodul
ı̂n care subţinta cut este aleasă.

Sunt suprimate toate variantele ı̂n aşteptare de la N (inclusiv)


la NC; Sunt suprimate şi ramurile lăsate la dreapta ı̂n timpul
trecerii de la N la NC pentru a evita alegerea lor ı̂n revenire.

• Efectul asupra programului este următorul:

Alternativele cauzate de clauzele (cu acelaşi nume) ce se găsesc


dupa clauza ce conţine cut sunt eliminate

Sunt eliminate şi alternativele generate de conjuncţia de subţinte


ce se află ı̂n stânga lui cut

Nu sunt eliminate altermativele generate ulterior de conjuncţia


de subţinte ce se găsesc dupa cut (deaorece nu au fost ı̂ncă
construite)

Viorel Negru UVT


PLFav ... 2017 / 2018

Tăietura cut

• Tăietură verde - nu schimbă semantica programului

Îmbunătăţirea eficienţei unui program (timp, spaţiu)

• Tăietură roşie - modificarea semanticii programului

Exemple

Viorel Negru UVT


PLFav ... 2017 / 2018

Cut şi fail

3 Predicatul fail produce ı̂ntotdeauna eşec

• cut + fail = taietură eşec

dif(X, X) :- !, fail.
dif(X, Y).

Unele implementări Prolog - cer ca argumentele predicatului


dif sa fie ı̂nchise (instanţiate) ı̂n momentul alegerii subţintei dif

frate(X, Y) :- parinte(Z, X), parinte(Z, Y), barbat(X).

frate(X, Y) :- parinte(Z, X), parinte(Z, Y),


dif(X, Y), barbat(X).

frate(X, Y) :- dif(X, Y), parinte(Z, X),


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

Colorarea unei hărţi

Viorel Negru UVT


PLFav ... 2017 / 2018

Negaţia prin eşec

3 Ipoteza lumii ı̂nchise

normal nu putem deduce decât fapte pozitive (cut permite


deducerea anumitor informaţii negative - dif)

ce vrem să demonstrăm: ⌉A este consecinţă logică a lui P


(program)

ce putem demonstra: A nu este consecinţă logică a lui P

A nu este deductibil de P
⌉A

(tot ce nu poate fi dedus este fals - ipoteza lumii ı̂nchise)

Ipoteza nu este ı̂ntotdeauna operaţionala - regula negării prin


eşec (finit)

A esueaza f init
⌉A

Viorel Negru UVT


PLFav ... 2017 / 2018

Negaţia prin eşec

not(P) :- P, !, fail.
not(P).

dif(X, Y) :- not(eq(X, Y)))

not(not(A(X))) $\equiv$ P(X) ???

Viorel Negru UVT


PLFav ... 2017 / 2018

Liste

3 Cea mai utilizată structură de date

• Exemple

[a, b, c],

[1, X, a, f(Y, c), [d, e, f]]

• Lista vida: []

• functor special .

[a, b, c] este echivalent intern cu:

.(a, .(b, .(c, [])

• caz special de arbore binar

Viorel Negru UVT


PLFav ... 2017 / 2018

Head, Tail

3 O listă este fie lista vidă, fie constă din două părţi head şi
tail:

1) primul element - capul listei (head)

2) restul elementelor (tail)

L = [a, b, c]

Tail = [b, c]

L = .(a, Tail)

L = [a | Tail]

Viorel Negru UVT


PLFav ... 2017 / 2018

Liste

Avem:

[a, b, c] = [a | [b, c]] = [a, b | [c]] = [a, b, c | []]

Listele pot fi reprezentate ı̂n Prolog:

1) [elem1, elem2, ...]

2) [Head | Tail]

3) [Elem1, Elem2, ... | Rest]

Viorel Negru UVT


PLFav ... 2017 / 2018

Operaţii cu liste

3 Apartenenţa unui element, concatenarea, extragerea unei


subliste

• member

% member(El, L)
% El este membru a lui L dacă
% i) El este head-ul lui L
% ii) El este membru ^ın tail a lui L
%
member (El, [El | Rest]).
member (El, [Head | Rest]) :- member (El, Rest).

goal
member(b, [a, b, c])
true

member(b, [a, [b, c]])


false

member([b, c], [a, [b, c]])


true

Viorel Negru UVT


PLFav ... 2017 / 2018

Operaţii cu liste

3 Concatenare liste

% conc(L1, L2, L3)


conc([], L, L).
conc([Elem | L1], L2, [Elem | L3) :- conc(L1, L2, L3).

goal
conc([a, b], [c, d], [a, b, c, d])
true
conc([a, b], [c, d], [a, b, c, d, e])
false
conc([1, 2], [a, c, c], L)
L=[1, 2, a, b, c]

conc(L1, L2, [a, b, c])


L1 = [] L2 = [a, b, c]
L1 = [a] L2 = [b, c]
L1 = [a, b] L2 = [c]
L1 = [a, b, c] L2 = []

conc(Primele, [4 | Ultimele], [1, 2, 3, 4, 5, 6])


Primele = [1, 2, 3]
Ultimele = [5, 6]

Viorel Negru UVT


PLFav ... 2017 / 2018

Operaţii cu liste

goal
conc(_, [X, 4, Y | _], [1, 2, 3, 4, 5, 6])
X = 3 Y = 5

3 Member cu ajutorul lui conc

%
member(El, L) :- conc(L1, [El | L2], L).

% variabile anomime
member(El, L) :- conc(_, [El | _], L).

Viorel Negru UVT


PLFav ... 2017 / 2018

Operaţii cu liste

3 Adăugare / ştergere elemente

% adauga element
adaug(X, L, [X | L]).

% sterge element
delete(X, [X | Rest], Rest).
delete(X, [Y | Rest], [Y | Rest1] :-
delete(X, Rest, Rest1).

goal
delete(a, [a, a, b, b, a], L)
L = [a, b, b, a]
L = [a, b, b, a]
L = [a, a, b, b]
% input devine output
delete(1, L, [a, b])
L = [1, a, b]
L = [a, 1, b]
L = [a, b, 1]

Viorel Negru UVT


PLFav ... 2017 / 2018

Operaţii cu liste

% Inserare element cu ajutorul lui delete


inserare(X, L, LX) :- delete(X, LX, L).

% member cu ajutorul lui delete


member(El, L) :- delete(El, L, _).

% S este sublistă a lui L


sublist(S, L) :- conc(L1, L2, L),
conc(S, L3, L2).

goal
sublist([2, 3], [1, 2, 3])
true

sublist(S, [1, 2, 3])


S = []
S = [1]
S = [1, 2]
S = [1, 2, 3]
...

Viorel Negru UVT


PLFav ... 2017 / 2018

Permutări

1) daca prima lista este vida atunci a doua lista vida

2) daca prima lista este nevida (de forma [X | L]), se permuta


L după care se obţine L1 prin inserarea lui X ı̂n orice poziţie
a lui L1

%
permutare([], []).
permutare([X | L], P) :- permutare(L, L1),
inserare(X, L1, P).

goal
permutare([1, 2, 3], P
P = [1, 2, 3]
P = [1, 3, 2]
P = [2, 1, 3]
...

% cu ajutorul lui delete


permutare([], []).
permutare(L, [X | P]) :- delete(X, L, L1),
permutare(L1, P).

Viorel Negru UVT


PLFav ... 2017 / 2018

Artimetica in Prolog

3 matching (=)

3+2=2+3

No

3 evaluare artimetica (is)

X is 2 + 3

X=8

Yes

Viorel Negru UVT


PLFav ... 2017 / 2018

Artimetica in Prolog

3 funcţii aritmetice şi operatori (build-in): (+, -, ...)

X is max(2,4) + 5 * 2

X = 14

Yes

3 comparaţii

3 + 2 =:= 2 + 3

Yes

3 Precedenţă operatori

Viorel Negru UVT


PLFav ... 2017 / 2018

Operaţii cu liste

3 Lungimea unei liste

%
our-length([], 0).
our-length([_ | Rest], N) :- our-length(Rest, N1),
N is 1 + N1.
% N1 trebuie să fie instanţiat cand
% se evaluează 1 + N1

goal
lenght([1, [2, 3], 4], N)
N = 3

% varianta cu =
length([], 0).
length([_ | Rest], N) :- length(Rest, N1),
N = 1 + N1.

goal
length([1, [2, 3], 4], N)
N = 1 + (1 + (1 + 0))

Viorel Negru UVT


PLFav ... 2017 / 2018

Operaţii cu liste

3 Lungimea unei liste

% se pot inversa subţintele


length([], 0).
length([_ | Rest], N) :- N = 1 + N1,
length(Rest, N1).

% mai simplu
length([], 0).
length([_ | Rest], 1 + N) :- length(Rest, N).

Viorel Negru UVT


PLFav ... 2017 / 2018

cmmd

cmmd(X, X, X).
cmmd(X, Y, D) :- X < Y,
Y1 is Y - X,
cmmd(X, Y1, D).
ccmd(X, Y, D) :- Y < X,
cmmd(Y, X, D).

% ultima clauză poate fi şi:

cmmd(X, Y, D) :- Y < X,
X1 is X - Y,
cmmd(X1, Y, D).
% ^
ın cazul comparaţiilor se forţează
% evaluarea argumentelor

Viorel Negru UVT

S-ar putea să vă placă și