Sunteți pe pagina 1din 7

MINISTERUL EDUCATIEI AL REPUBLICII MOLDOVA

UNIVERSITATEA DE STAT DIN MOLDOVA


FACULTATEA DE MATEMATICA SI INFORMATICA
DEPARTAMENTUL INFORMATICA

LUCRARE DE LABORATOR
NR.1
LA DISCIPLINA : INTELIGENTA ARTIFICIALA

Tema: Fapte, reguli si interogari in limbajul


PROLOG

A elaborat _________ I21

A verificat:_________________________

Chisinau 2016
Conditia: Sa se construiasca un arbore genealogic arbitrar care sa contina cel putin 4 nivele
(generatii). Sa se descrie arborele in limbajul PROLOG cu ajutorul urmatoarelor relatii:
parinte(X,Y). /* X este parintele lui Y */
barbat(X). /* X este barbat */
femeie(X). /*X este femeie */

Sa se descrie regulile pentru diverse relatii de rudenie, utilizand numai cele trei relatii descrise
mai sus:
1. mama(X,Y) /* X este mama lui Y */
2. tata(X,Y)
3. frate(X,Y)
4. sora(X,Y)
5. copil(X,Y)
6. fiica(X,Y)
7. fecior(X,Y) /*X este fecior lui Y */
8. bunel(X,Y)
9. bunica(X,Y)
10. unchi(X,Y)
11. nepot(X,Y)
12. stramos(X,Y) /* X este stramos pentru Y regula recursiva */
13. urmas(X,Y)
14. var(X,Y)
15. vara(X,Y)
16. areCopii(X)
17. esteBunel(X)
18. esteBunica(X) /* X este Bunica */
19. areFrati(X)
20. areVeri(X)
21. esteSora(X)
22. mos(X,Y)
23. areSotie(X)
24. areMos(X)
25. areMatusa_1(X)
26. areStramos(X)
27. areUnchi(X)
28. esteNepot_2(X)
29. sot(X,Y)
30. sotie(X,Y)
31. casatorit(X,Y)
32. strabunica(X,Y)
33. nepoti_1(X,Y)
34. nepoata_2(X,Y)
35. nepotB(X,Y) /* X este nepotB p/u Y */

Sa se formulize diferite interogari asupra programului.

Programul:

Domains /*cuvant cheie */


nume=symbol /* declararea variabilelor*/
2
predicates /*cuvant cheie */
barbat(nume) /*declararea predicatelor */
femeie(nume)
parinte(nume,nume)
mama(nume,nume)
tata(nume,nume)
copil(nume,nume)
frate(nume,nume)
sora(nume,nume)
vara_1(nume,nume)
var_1(nume,nume)
fecior(nume,nume)
fiica(nume,nume)
bunel(nume,nume)
bunica(nume,nume)
nepotB(nume,nume)
nepoataB(nume,nume)
unchi(nume,nume)
nepoata(nume,nume)
nepoti_1(nume,nume)
nepot_2(nume,nume)
nepoata_2(nume,nume)
stramos(nume,nume)
urmas(nume,nume)
strabunica(nume,nume)
strabunel(nume,nume)
stranepoata(nume,nume)
sot(nume,nume)
sotie(nume,nume)
suntFrate_sora(nume,nume)
esteSotie(nume)
esteSot(nume)
esteMatusa_1(nume)
esteNepot_2(nume)
esteBunel(nume)
esteBunica(nume)
areCopii(nume)
areFrati(nume)
areSotie(nume)
areMatusa_1(nume)
areMos(nume)
areUnchi(nume)
areVeri(nume)
areStramos(nume)
mos(nume,nume)
matusa_2(nume,nume)
matusa_1(nume,nume)
casatorit(nume,nume)

clauses /*definirea bazei de date */


barbat(vasile). /*Vasile este barbat*/
barbat(omar).
barbat(maxim).
barbat(anatoli).
3
barbat(tudor).
barbat(vilaiat).
barbat(dumitru).
barbat(nariman).
barbat(constantin).
barbat(alexandru).
barbat(nicolae).
barbat(teimur).
barbat(onur).
barbat(danis).
barbat(sava).

femeie(anastasia). /*Anastasia este femeie*/


femeie(laila).
femeie(valentina).
femeie(ana).
femeie(elena).
femeie(maria).
femeie(natasa).
femeie(nadea).
femeie(lilea).
femeie(angela).
femeie(olga).
femeie(nastea).
femeie(violeta).
femeie(iana).

parinte(anastasia,tudor). /*Anastasia este parinte pentru tudor*/


parinte(anastasia,maria).
parinte(anastasia,elena).
parinte(vasile,tudor).
parinte(vasile,maria).
parinte(vasile,elena).
parinte(omar,vilaiat).
parinte(laila,vilaiat).
parinte(valentina,natasa).
parinte(maxim,natasa). /*Maxim este parinte pentru natasa*/
parinte(anatoli,dumitru).
parinte(ana,dumitru).
parinte(maria,angela).
parinte(maria,lilea).
parinte(maria,nariman).
parinte(vilaiat,angela).
parinte(vilaiat,lilea).
parinte(vilaiat,nariman).
parinte(natasa,nicolae).
parinte(natasa,alexandru).
parinte(dumitru,nicolae).
parinte(dumitru,alexandru).
parinte(nariman,teimur).
parinte(nariman,onur).
parinte(nadea,teimur).
parinte(nadea,onur).
parinte(lilea,danis).
parinte(lilea,nastea).
parinte(constantin,danis).
4
parinte(constantin,nastea).
parinte(angela,iana).
parinte(angela,sava).
parinte(alexandru,iana).
parinte(alexandru,sava).
parinte(nicolae,violeta).
parinte(olga,violeta).

casatorit(anastasia,vasile).
casatorit(laila,omar). /*Laila este casatorita cu
omar*/
casatorit(valentina,maxim).
casatorit(ana,anatoli).
casatorit(maria,vilaiat).
casatorit(natasa,dumitru).
casatorit(nadea,nariman).
casatorit(lilea,constantin).
casatorit(angela,alexandru).
casatorit(olga,nicolae).

mama(X,Y) :- parinte(X,Y),femeie(X). /*X este mama lui Y, daca X este


parintele lui Y si X este femeie */
tata(X,Y) :- barbat(X),parinte(X,Y).
copil(X,Y) :- parinte(Y,X). /*X este copilul lui Y, daca Y este parintele lui X */
frate(X,Y) :- barbat(X),parinte(Z,X),mama(Z,Y),X<>Y.
sora(X,Y) :- femeie(X),parinte(Z,X),mama(Z,Y),X<>Y. /* X este sora lui Y,
daca Z este parintele lui X, si Z este mama lui Y, si X este femeie si X este diferit de Y */
vara_1(X,Y) :- nepoti_1(X,Z),parinte(Z,Y),femeie(X),X<>Y.
var_1(X,Y) :- nepoti_1(X,Z),parinte(Z,Y),barbat(X),X<>Y. /*X var_1 p/u Y,
daca X este nepoti_1 p/u Z, si Z este parinte p/u Y si X este barbat, X este diferit de Y*/
fecior(X,Y) :- barbat(X),parinte(Y,X).
fiica(X,Y) :- parinte(Y,X),femeie(X). /*X este fiica lui Y, daca X este femeie si Y este
parintele lui X */
bunel(X,Y) :- barbat(X),parinte(X,Z),parinte(Z,Y).
bunica(X,Y) :- femeie(X),parinte(X,Z),parinte(Z,Y). /*X este bunica lui Y,
daca X este parintele lui Z, si Z este parintele lui Y si X este femeie */
nepotB(X,Y) :- bunel(Y,X);bunica(Y,X),barbat(X).
nepoataB(X,Y) :- bunel(Y,X);bunica(Y,X),femeie(X).
stranepoata(X,Y) :- strabunica(Y,X);strabunel(Y,X).
nepoata(X,Y) :- vara_1(X,Z),parinte(Y,Z),X<>Y. /*X este nepoata p/u Y,
daca X este vara_1 p/u Z si Y este parinte p/u Z, si X este diferit de Y*/
nepoti_1(X,Y) :- matusa_1(Y,X);mos(Y,X),X<>Y.
nepot_2(X,Y) :- barbat(X),matusa_2(Y,X);unchi(Y,X).
nepoata_2(X,Y) :- matusa_2(Y,X);unchi(Y,X),femeie(X).
strabunica(X,Y) :- bunica(X,A),parinte(A,Y),X<>Y.
strabunel(X,Y) :- bunel(X,A),parinte(A,Y),X<>Y. /*X este strabunel p/u Y, daca
X este bunel p/u A si A este parinte p/u Y, si X este diferit de Y*/
stramos(X,Y) :- parinte(X,Y). /* 1 */
stramos(X,Y) :- parinte(X,Z),stramos(Z,Y).
urmas(X,Y):-parinte(Y,X).
sot(X,Y) :- barbat(X),casatorit(Y,X),X<>Y. /*X este sotu lui Y, daca X este barbat,
si Y este casatorit cu X*/
sotie(X,Y) :- femeie(X),casatorit(X,Y),X<>Y.
unchi(X,Y):- barbat(X), casatorit(Z,X), sora(Z,A), parinte(A,Y).

5
mos(X,Y) :- frate(X,Z),parinte(Z,Y),barbat(X),X<>Y. /*X mosu lui Y, daca X
este frate p/u Z, si Z este parinte p/u Y, si X este barbat*/
matusa_1(X,Y) :-sora(X,Z),parinte(Z,Y),femeie(X),X<>Y.
matusa_2(X,Y) :- sotie(X,Z),mos(Z,Y),femeie(X),X<>Y. /*X este matusa_2
p/u Y, daca X este sotie p/u Z, si Z este mos p/u Y, si X este femeie, si X sa fie diferit de Y*/
suntFrate_sora(X,Y) :- barbat(X),femeie(Y),parinte(Z,X),parinte(Z,Y).
esteBunel(X) :- copil(Y,Z),parinte(X,Z),barbat(X),X<>Y.
esteBunica(X) :- copil(Y,Z),parinte(X,Z),femeie(X),X<>Y.
esteSotie(X) :- casatorit(X,_),femeie(X). /*X este sotie, daca X este casatorita si
X este femeie*/
esteSot(X) :- casatorit(_,X),barbat(X).
esteMatusa_1(X) :- sora(X,Z),parinte(Z,Y),femeie(X),X<>Y.
esteNepot_2(X) :- barbat(X), nepot_2(X,Y),X<>Y.
areStramos(X) :- parinte(_,X).
areCopii(X) :- parinte(X,_). /*X are copii, daca X este parinte*/
areSotie(X) :- casatorit(_,X), barbat(X).
areMatusa_1(X) :- matusa_1(_,X).
areMos(X) :- mos(_,X). /*X are mos, daca oricine este mos p/u X*/
areUnchi(X) :- unchi(_,X).
areVeri(X):- var_1(_,X);vara_1(_,X).
areFrati(X) :- frate(_,X);sora(_,X). /*X are frati, daca oricine este frate p/u X , sau
oricine este sora p/u X */

/*Pentru a defini relatia stramos prin recursivitate avem nevoie de o metoda car garanteaza
terminarea executiei unuei proceduri recursive. O astfel de metoda poate fi implementata
folosind o clauza care enunta condiitile de margine in care o relatie este valida. Pentru arborele
meu genealogic aceasta conditie este relatia parinte, care are sensul ca o relatie de
stramos intre doua persoane este valida la margine, cand una dintre persoane este parintele
celeilalte. De aceea trebuie sa adaugam in baza de reguli o clauza noua, clauza 1. Ea
actioneaza ca o conditie de margine a relatiei definite. (PROLOG admite recursivitatea in sensul
ca acelasi nume de predicat poate aparea si in capul unei reguli si in corpul ei.) */

6
Concluzii:

Executnd programul prin limbajul Prolog, am aflat cum s definesc regurile. Este alctuit din
sintaxa simpl, m-am antrenat prin aplicarea interogarilor. Am neeles cum lucreaz el, deci are
logica sa si este destul de clar. Relaiile sau explicat cu suficien n aa mod sa opinut
rezultatul corect. In program s-a folosit recursivitatea. Mi-a prut bine folosirea acestui limbaj.

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