Sunteți pe pagina 1din 11

Lucrarea 2 Bazele inteligenei artificiale

- 1 -


Obiecte i structuri de date n SWI-Prolog.


Obiectivele lucrrii

Conceptele introduse n aceast lucrare sunt: obiecte, structuri,
constante, variabile, atomi, numere, operatori, infixat, functor, argumente,
unificare, recursivitate.

n figura 2.1 prezentm o clasificare a obiectelor din mediul
dezvoltare SWI-Prolog.
OBIECTE PROLOG
STRUCTURI OBIECTE ELEMENTARE
VARIABILE CONSTANTE
ATOMI NUMERE NTREGI NUMERE REALE

Figura 2.1 Taxonomia obiectelor SWI-Prolog

Sistemul Prolog recunoate tipul obiectelor din program dup
forma sintactic, deoarece sintaxa Prolog impune diferite forme pentru
fiecare tip de obiect. n SWI-Prolog exist o mulime de predicate
predefinite, unele fiind predicate standard, iar altele depinznd de
implementare. De fapt, un program Prolog este alctuit din predicate.
Fiecare predicat este definit de numele su i de aritatea (numr fix de
argumente ale predicatului) sa. n Prolog, dou predicate cu acelai nume,
dar numr diferit de argumente, se consider c sunt predicate diferite.
Argumentele predicatelor Prolog, prin analogie cu logica predicatelor de
Lucrarea 2 Bazele inteligenei artificiale

- 2 -
ordinul I, se numesc termeni, i pot fi constante, variabile sau structuri. n
lucrarea 1, numi !!!!., am artat cum se definesc constantele (ncep
ntotdeauna cu liter mic) i variabilele (ncep ntotdeauna cu liter mare).

Constante: atomi simbolici i numere

O constant (atom) este un identificator ce poate fi construit n trei
feluri:
Poate ncepe cu liter mic i se continu cu orice niruire de litere
mici, litere mari, cifre sau caracterul _ (underscore): ana, nil, x25,
x_25, x_25AB, x_, x__y, procedura_alfa_beta, dna_Maria,
domnul_Goe, etc.
Poate ncepe cu iruri de caractere speciale: <>, <>, =, ==, ==>,
, etc
Exist, totui, i posibilitatea ca atomul s nceap cu liter mare sau
s conin caractere speciale. Limbajul Prolog permite acest lucru
prin ncadrarea atomului ntre caractere apostrof (ex. tata('Alexe Ion',
daniel), Bogdan, Romania, etc.).

n SWI-Prolog, numerele pot fi reprezentate ca: ntregi, reale.
Sintaxa pentru numere ntregi este ct se poate de simpl: 1, 1313, 0, -97,
+32. Numerele reale, n general (depind de tipul de Prolog utilizat), sunt
reprezentate ntr-o form similar celor din C, C++: 3.14, 0.56, -0.0035,
100.2, 25.78. Numerele reale nu sunt foarte utilizate n Prolog. Motivul este
c limbajul Prolog este orientat pe simboluri, pe calcul non-numeric
(numerele ntregi, n schimb, sunt utilizate frecvent pentru a contoriza
numrul de elemente dintr-o list, etc.). deoarece

Variabile

Din punct de vedere sintactic, variabilele sunt tot atomi, ns au o
alt semnificaie fa de constante, dup cum s-a artat n prima lucrare de
laborator. Variabilele sunt iruri de caractere, cifre sau caracterul underscore
i ncep cu liter mare sau caracterul underscore: X, Rezultat, Obiect1,
Lista_participanti, _x24, _25.
n Prolog exist situaii n care o variabil apare o singur dat ntr-o
regul, caz n care nu avem nevoie de un nume pentru ea, deoarece nu este
referit dect ntr-un singur loc. De exemplu, n cazul n care dorim s
scriem o regul care ne spune dac cineva este fiul cuiva, o posibil
implementare ar fi:
Lucrarea 2 Bazele inteligenei artificiale

- 3 -
este_fiu(Fiu):- parinte(Y, Fiu).
n relaia (regula) de mai sus am denumit cu Y un printe anonim. n
acest caz, nu intereseaz cine apare pe post de printe. Pentru a nu ncrca
regulile cu nume (dac situaia permite acest lucru) care pot distrage atenia
i ngreuia citirea programelor, se pot utiliza variabile anonime, notate cu
_ (underscore). Prin urmare, regula anterioar se poate rescrie astfel:
este_fiu(Fiu):- parinte(_, Fiu).
Variabilele din Prolog nu sunt identice ca semnificaie cu variabilele
C, C++, fiind mai curnd similare cu variabilele n sens matematic. O
variabil, odat ce a primit o valoare, nu mai poate fi modificat. Acest
lucru elimin efectele laterale care sunt permise n limbajele procedurale. O
variabil Prolog neinstaniat semnific ceva necunoscut.

Structuri

Structurile sunt folosite pentru a grupa sub acelai nume, mai multe
date de acelai tip sau de tipuri diferite. Obiectele structurate (numite pe
scurt structuri), sunt obiecte formate din mai multe componente.
Componentele, pot fi, la rndul lor, structuri. De exemplu, data
calendaristic poate fi vzut ca o structur cu trei componente: zi, luna, an.
Dei formate din cteva componente, structurile sunt tratate n Prolog ca
obiecte singulare. Pentru a mixa componentele ntr-un singur obiect avem
nevoie de un functor. Pentru exemplul din figura 2.2, functorul potrivit este:
data(1,martie, 2009).
data
1 martie 2009
data (1, martie, 2009)
functor argumente
a) b)

Figura 2.2 Exemplu de structur de date: a) reprezentare sub form de arbore, b)
reprezentare cod Prolog

Toate componentele din acest exemplu sunt constante (doi ntregi i
un atom), iar elementul care le unete (liantul) este functorul data. Precizm
faptul c functorul poate fi orice atom, iar componentele pot fi orice obiect
Prolog.
Aadar, n Prolog, o structur se definete prin specificarea:
numelui structurii ( functorul structurii);
elementelor structurii (componentele structurii).
Lucrarea 2 Bazele inteligenei artificiale

- 4 -
Structurile Prolog pot fi utilizate pentru reprezentarea structurilor de
date, de exemplu liste sau arbori.

Operatori

Limbajul Prolog pune la ofer trei categorii de operatori:
operatori aritmetici,
operatori relaionali,
operatori definii de utilizator.
Operatorii aritmetici sunt utilizai pentru operaii matematice de baz.
Aceste sunt:
+ adunare,
- scdere,
* nmulire,
/ mprire,
mod modulo
La ntrebarea:
?- X = 1 + 2.
Prolog va raspunde cu:
X = 1 + 2
i nu X = 3, aa cum ne-am atepta (innd cont de limbajele clasice
procedurale C, Pascal). Motivul pentru care Prolog rspunde astfel este c n
expresia 1 + 2, termenul + este functorul iar 1 i 2 sunt argumentele
acestuia. Deci nu exist nimic n acest scop care s activeze operaia de
adunare. Operatorul special predefinit pentru operaia de adunare este is.
Operatorul predefinit infixat is va fora evaluarea expresiei. Prin urmare,
modul corect de a cere rspunsul la operaia aritmetic de adunare este:
?- X is 1 + 2.
Acum Prolog va raspunde cu (variabila X este instaniat cu 3):
X = 3
Operatorii relaionali sunt predicate predefinite infixate. Acetia sunt:
= operatorul de egalitate. Predicatul (operatorul) de egalitate
funcioneaz ca i cum ar fi definit prin urmtorul fapt: X=X.,
iar ncercarea de a satisface un scop de tipul X = Y se face prin ncercarea
de a unifica X cu Y. Din aceasta cauz, dndu-se un scop de tipul X = Y,
regulile de decizie care indic dac scopul se ndeplinete sau nu sunt
urmtoarele:
Dac X este variabil neinstaniat, iar Y este instaniat la orice
obiect Prolog, atunci scopul reuete. Ca efect lateral, X se va
instania la aceeai valoare cu cea a lui Y. De exemplu:
?- merg(studenti, universitate) = X.
Lucrarea 2 Bazele inteligenei artificiale

- 5 -
este un scop care reuete i X se instaniaz la merg(studenti,
universitate).
Dac att X ct i Y sunt variabile neinstaniate, scopul X = Y
reuete, variabila X este legat la Y i reciproc. Aceasta nseamn
c ori de cte ori una dintre cele dou variabile se instaniaz la o
anumit valoare, cealalt variabila se va instania la aceeai
valoare.
Atomii i numerele sunt ntotdeauna egali cu ei nii. De exemplu,
urmtoarele scopuri au rezultatul marcat drept comentariu:
ana = ana % este satisfcut
dulce = amar % eueaz
10 = 10 % reuete
1100 = 1011 % eueaz
Dou structuri sunt egale dac au acelai functor, acelai numr de
componente i fiecare component dintr-o structur este egal cu
componenta corespunztoare din cealalt structur. De exemplu,
scopul:
data(1,3,2009,timp(12,20,33)) = data(1,3,X,timp(12,Y,33)). este
satisfcut, iar ca efect lateral se fac instanierile: X = 2009 i Y =
20. Scopul:
autor(emil, X) = autor(Y, cioran). este satisfcut, iar ca efect
lateral se fac instanierile:X = cioran i Y = emil. n urma
acestui proces, ambii termeni arat astfel: autor(emil, cioran).
Aadar, unificarea (modul n care Prolog realizez potrivirile
ntre termeni) presupune att modificarea obiectului int, ct i
a obiectului surs.

= = testeaz echivalena a dou variabile. El consider cele dou
variabile egale doar dac ele sunt deja partajate. X = = Y reuete ori de cte
ori X = Y reuete, dar reciproca este fals:
?- X = = X.
yes %variabil neinstaniat
?- X= =Y.
no
\= operatorul de inegalitate reprezint un predicat opus
celui de egalitate. Scopul X \= Y reuete dac scopul X = Y nu este
satisfcut i eueaz dac X = Y reuete.
X > Y X este mai mare dect Y
X < Y X este mai mic dect Y
X >= Y X este mai mare sau egal cu Y
X =< Y X este mai mic sau egal cu Y
Lucrarea 2 Bazele inteligenei artificiale

- 6 -
X =\= Y returneaz adevrat dac X i Y au valori diferite (face
evaluare aritmetic dar nu instaniaz nimic).
X =:= Y returneaz adevrat dac X i Y au aceleai valori (face
evaluare aritmetic dar nu instaniaz nimic).
Exemplu:
?- 1 + 2 =:= 2 + 1. % se face evaluarea aritmetic a expresiei
yes
?- 1 + 2 = 2 + 1. % se compar obiectele
no

Recursivitate n Prolog

Programarea n Prolog depinde foarte mult de aceasta tehnic numit
recursivitate. n principiu, recursivitatea implica definirea unui predicat n
functie de el nsui. Cheia care ne asigur c aceast tehnic are sens const
n aceea ca ntotdeauna trebuie s definim predicatul la o scal mai mic.
Recursivitatea de la nivelul algoritmilor este echivalenta cu demonstrarea
prin inductie din matematic.
O definitie recursiv (n orice limbaj procedural sau declaraiv)
trebuie sa aib ntotdeauna cel puin dou pri: o condiie elementar i o
parte recursiv. Conditia elementar definete un caz simplu, care tim c
este ntotdeauna adevrat. Partea recursiv simplific problema eliminnd
iniial un anumit grad de complexitate i apoi apelndu-se pe ea nsi. La
fiecare nivel, condiia elementar este verificat. Dac s-a ajuns la ea,
recursivitatea se ncheie, altfel, recursivitatea continu.
O definiie recursiv au o serie de noiuni matematice, cum ar fi
factorialul unui numr, numerele lui Fibonacci, turnurile din Hanoi, etc.

Aplicatii in Prolog:

1. Problema unicornului (Lewis Carroll Alice n ara minunilor). n cele
ce urmeaz prezentm premisele de la care se pleac:
Leul minte luni, mari i miercuri i spune adevrul n toate
celelalte zile.
Unicornul minte joi, vineri i smbt i spune adevrul n toate
celelalte zile.
Astzi leul zice: Ieri a fost una din zilele n care eu mint.
Tot astzi unicornul zice: Ieri a fost una din zilele n care eu
mint.
ntrebarea (concluzia) este: Ce zi este astzi?
Soluie:
Lucrarea 2 Bazele inteligenei artificiale

- 7 -
Codul surs (SWI-Prolog) al programului este urmtorul:



La interogarea:
?- azi ( Ast azi ) .
rspunsul sistemului va fi:
Ast azi = j oi ;
f al se.

2. n cele ce urmeaz prezentm un program Prolog ce rezolv ecuaia de
gradul al doilea. Vom declara urmtoarele predicate:
delta se calculeaz discriminantul ecuaiei de gradul 2.
ec_grad2 - primete a argumente coeficienii ecuaiei i, n
funcie de valoarea coeficienilor i a discriminantului, realizeaz
urmtoarele aciuni:
Afieaz soluiile n cazul n care acestea sunt numere
ntregi sau reale.
Afieaz mesajul Ecuaia nu este de gradul 2, n cazul
n care coeficientul lui x
2
este 0.
Afieaz mesajul Ecuaia nu are soluii reale, n cazul
n care discriminantul este negativ.
Codul surs (SWI-Prolog) al programului este urmtorul:

Lucrarea 2 Bazele inteligenei artificiale

- 8 -
sol ut i e( A, B, _, D) : -
D >= 0,
X1 i s ( - B- sqr t ( D) ) / ( 2*A) ,
X2 i s ( - B+sqr t ( D) ) / ( 2*A) ,
wr i t e( ' Sol ut i i l e sunt : X1=' ) , wr i t e( X1) ,
wr i t e( ' , X2= ' ) , wr i t el n( X2) .
La interogarea:
?- ec_gr ad2( 1, 4, 2) .
rspunsul sistemului va fi:
Sol ut i i l e sunt : X1=- 3. 41421, X2= - 0. 585786
true.

3. n cele ce urmeaz prezentm un program Prolog care calculeaz
factorialul unui numr n. tim c n! = 123n i 0! = 1.
n acest exemplu identificm condiia elementar ca fiind factorial(0) =
1 (aceasta va fi condiia care va opri recursivitatea). descrie relaiile
existente ntr-o familie.
Codul surs (SWI-Prolog) al aplicaiei este prezentat n figura qq:

Figura q.q Implementare Prolog pentru factorial (n)

Spre exemplu, pentru a afla factorialul numrului 3, interogarea este
urmtoarea:
?- f act or i al ( 3, Rez) .
Rspunsul sistemului este:
Rez = 6 ;
Limbajul Prolog rezolv aceast problem n conformitate cu arborele
prezentat n figura xx. Arborele are ca noduri clauze care nu conin variabile
libere, ci instane ale acestora.
Lucrarea 2 Bazele inteligenei artificiale

- 9 -
factorial (3, Rez)
3>0
2 is 3-1
(Nr1)
factorial (2, X1) Rez is 3 * X1 Rez=6
2>0
1 is 2-1
(Nr1)
factorial (1, X1) Rez is 2 * X1
1>0
0 is 1-1
(Nr1)
factorial (0, X1) Rez is 1 * X1
Rez=2*1
Rez =1*1
factorial (0, 1)
TRUE

Figura x.x Arborele corespunztor interogrii factorial (3, Rez)

4. n cele ce urmeaz prezentm un program Prolog care rezolv problema
turnurilor din Hanoi. Se dau trei tije (stanga, mijloc, dreapta) si n
discuri de diferite dimensiuni, stivuite pe tija stanga n ordine
descrescatoare a dimensiunilor lor, formnd un turn ca n figura xa.
stanga mijloc dreapta

Figura x.x Turnurile din Hanoi

Cele n discuri de pe tija din stanga trebuie mutate pe tija din dreapta
astfel nct acestea s fie ordonate ca la nceput. Mutrile se fac cu
urmtoarele restricii:
La fiecare micare se poate muta doar un disc.
Un disc cu diametrul mai mare nu poate fi mutat peste unul
cu diametrul mai mic.
Lucrarea 2 Bazele inteligenei artificiale

- 10 -
Tija din mijloc poate fi utilizat ca tij intermediar.
Codul surs (SWI-Prolog) al aplicaiei este urmtorul:

sol ut i e( N) : - hanoi ( N, st anga, dr eapt a, mi j l oc) .
hanoi ( 0, _ , _ , _ ) .
hanoi ( N, A, B, C) : -
N > 0, N1 i s N - 1,
hanoi ( N1, A, C, B) ,
wr i t e( ' Mut a di scul di n ' ) , wr i t e( A) , wr i t e( ' i n
' ) , wr i t e( B) , nl ,
hanoi ( N1, C, B, A) .

La interogarea:
?- sol ut i e( 3) .
rspunsul sistemului va fi:
Mut a di scul di n st anga i n dr eapt a
Mut a di scul di n st anga i n mi j l oc
Mut a di scul di n dr eapt a i n mi j l oc
Mut a di scul di n st anga i n dr eapt a
Mut a di scul di n mi j l oc i n st anga
Mut a di scul di n mi j l oc i n dr eapt a
Mut a di scul di n st anga i n dr eapt a
true

Desfurarea lucrrii:

1. Se va citi breviarul teoretic. Se atrage atenia asupra faptului c toate
cunotinele din aceast lucrare vor fi necesare i n derularea
celorlalte lucrri.
2. Se vor studia problemele rezolvate (problemele prezentate pe
parcursul acestui laborator), ncercnd gsirea altor posibiliti de
soluionare a acestora. Utilizai i alte scopuri (interogri) pentru a
testa definiiile predicatelor introduse.
3. Se vor rezolva urmtoarele probleme propuse i se va urmri
execuia lor corect.
Definii relaia max(X, Y, Max) astfel nct Max este mai
mare dect cele dou numere X i Y.
Definii relaia max(X, Y, Max) astfel nct Max este cel mai
mare numr din cele dou X i Y (Ex: max(23, 34, Max)
rezulta Max=34).
Definii relaia divide(A, B) care testeaz dac un numr este
divizibil cu altul.
Lucrarea 2 Bazele inteligenei artificiale

- 11 -
Definii procedura intre(N1, N2, X) care, pentru dou numere
ntregi date N1 i N2, genereaz prin backtracking toii
ntregii X care satisfac condiia: N1 X N2.
S se scrie un program Prolog care calculeaz termenul n din
irul lui Fibonacci. Sirul lui Fibonacci este o secven de
numere n care fiecare numr se obine din suma
precedentelor dou din ir, conform relaiei:

> +
=
=
=

1
1 1
0 0
1 1
n daca F F
n daca
n daca
F
n n
n

S se scrie un program Prolog care calculeaz cel mai mare
divizor comun dintre dou numere. Indicaie: Se folosete
definiia recursiv a lui Euclid:
Dac a i b dou numere ntregi pozitive.
dac b = 0
atunci cmmdc(a, b) = a;
altfel cmmdc(a, b) = cmmdc(b, r),
unde r este restul mpririi lui a la b.
S se scrie un program Prolog care testeaz dac un numr
introdus de la tastatur este prim.
S se scrie un program Prolog care s calculeze suma
primelor N numere naturale nenule.

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

  • L3 Bia
    L3 Bia
    Document15 pagini
    L3 Bia
    Dragos Neata
    Încă nu există evaluări
  • L1 Bia
    L1 Bia
    Document19 pagini
    L1 Bia
    Dragos Neata
    Încă nu există evaluări
  • Biometrie
    Biometrie
    Document64 pagini
    Biometrie
    Dragos Neata
    Încă nu există evaluări
  • Punctaj Ae TCM 4
    Punctaj Ae TCM 4
    Document2 pagini
    Punctaj Ae TCM 4
    Dragos Neata
    Încă nu există evaluări