Sunteți pe pagina 1din 8

Ministerul Educaţiei al Republicii Moldova

Universitatea Tehnică a Moldovei


Facultatea Calculatoare, Informatică şi Microelectronică

Raport
Lucrarea de laborator nr. 2
La disciplina Programarea logica si inteligenta artificiala
Tema: Mecanismele specifice limbajului Prolog pentru controlul procesului de backtracking: cut şi
fail. Prelucrarea listelor în Prolog.

A efectuat st. gr. FAF-141 Dariev Alexei


A verificat lect.supr. L. Luchianov

Chişinău 2017
Scopul lucrării
Însuşirea ideilor despre mecanismele specifice limbajului Prolog pentru controlul procesului de
backtracking: cut şi fail. Prelucrarea listelor în Prolog.
Sarcina lucrării
1. Citiţi breviarul teoretic. Se atrage atenţia asupra faptului că toate cunoştinţele din această lucrare
vor fi necesare şi în derularea celorlalte lucrări.
2. Lansaţi la executare programul elaborat în lucrarea 1 şi cercetaţi schimbările semanticii
procedurale:
 prin schimbarea ordinii propoziţiilor fapte;
 prin schimbarea ordinii propoziţiilor reguli; (două variante)
 prin schimbarea ordinii propoziţiilor fapte; (două variante)
 Faceţi concluzii.
3. Rezolvaţi următoarele probleme propuse şi se va urmări execuţia lor corectă.
3.1 Elaboraţi şi testaţi un program pentru determinarea unei valori minime din două numere (X şi
Y), fără utilizarea predicatului cut.
3.2 Elaboraţi şi testaţi un program pentru determinarea unei valori minime din două numere (X
şi Y), utilizînd predicatul cut roşu şi cut verde.
3.3 Care vor fi răspunsurile programului

р( 1).
р( 2) :- !.
р( 3).
La întrebările formulate în lista de scopuri ce urmează:
? р( X).
? р( X), p(Y).
? р( X), !, p(Y).
faceţi o analiză comparativă între utilizarea predicatelor cut în spaţiul bazei de cunoştinţe şi
spaţiul scopurilor.
3.4 Doi copii pot juca un meci într-un turneu de tenis dacă au aceeaşi vârstă. Fie
următorii copii şi vârstele lor: copil(peter,9). copil(paul,10). copil(chris,9). copil(susan,9).

Definiţi un predicat din care rezultă toate perechile de copii care pot juca un meci într- un
turneu de tenis.
3.5 Să se scrie predicatele Prolog, care ar realiza următoarele funcţii recursive:
𝑏dacă𝑎 = 0
𝑏 + 2dacă𝑎 = 1
Varianta 12. 𝑏 + 1dacă𝑎 = 2 Realizarea lucrării
𝑓(𝑎 − 3, 𝑏)dacă𝑎 > 2
𝑓(𝑎, 𝑏) = { { {

3.1. Fără predicatul CUT.


min(X,Y):-X=<Y,write('min = '),write(X).
min(X,Y):-X>Y, write('min = '),write(Y).
%?- min(6,7).
min = 6 true .

3.2. Utilizînd predicatul cut RED şi cut GREEN.


%“green” cut
min1(X,Y,Y):-X>Y,!.
min1(X,Y,X):-X<Y.
%“red” cut
min2(X,Y,X):-X<Y,!.
min2(X,Y,X).

3.3. Răspunsurile programului р( 1). р( 2) :- !. р( 3).


?- p(X). X = 1 ; X = 2.
?- p(X),p(Y). X = Y, Y = 1 ; X = 1, Y = 2 ; X = 2, Y = 1 ; X = Y, Y = 2.
?- p(X),!,p(Y). X = Y, Y = 1 ; X = 1, Y = 2.

3.4. Definirea predicatului.


% BC
copil(peter, 9).
copil(paul, 10).
copil(chris, 9).
copil(susan, 9).
joaca(X, Y) :- copil(X,Z),!,copil(Y,Z),X\=Y.
% Scopurile
27 ?- joaca(C,J).
C = peter, J = chris ;
C = peter, J = susan.

𝑏dacă𝑎 = 0
𝑏 + 2dacă𝑎 = 1
3.5. Realizarea funcţiilor recursive. 𝑏 + 1dacă𝑎 = 2
𝑓(𝑎 − 3, 𝑏)dacă𝑎 > 2
𝑓(𝑎, 𝑏) = { { {

f(B,0):- write("B"=B).
f(B,1):-B1 is B+2,write(b=B1).
f(B,2):-B1 is B+1,write(b=B1).
f(B,A):- A1>2, A1 is A-3, write(b=B),f(B,A1).
% Scopurile
?- f(5,9). ?- f(5,1).
b=5 b=7
true. true .
?- f(5,0). ?- f(5,2).
B=5 b=6
true . true

4. Probleme propuse pentru liste.


Varianta 12
a) Să se scrie un program Prolog care să sorteze descrescător numerele unei liste.
sortez([], []).
sortez([P|Rest], Lrez):-selectez(P, Rest, Mici, Mari), sortez(Mici, MiciSort),
sortez(Mari, MariSort), append(MiciSort, [P|MariSort], Lrez).

selectez(_, [], [], []).

selectez(P, [P1|Rest], [P1|Mici], Mari):-P1 < P, selectez(P, Rest, Mici, Mari).

selectez(P, [P1|Rest], Mici, [P1|Mari]):- selectez(P, Rest, Mici, Mari).


Fig.4.1 Rezulatatul Programului de sortare descrescătoare a listei.

b) Sa se scrie predicatul substituție(X, Y, L1, L2), unde L2 este rezultatul substituirii tuturor
apariţiilor lui X din lista L1 cu Y. Ex: substituție(a, x, [a, [b,a,] c], L2) va produce: L2 = [x, [b, x], c].

replace([], _OldValue, _NewValue, []):-!.


replace([OldValue|Tail], OldValue, NewValue, [NewValue|ReplacedTail]):-
!, replace(Tail, OldValue, NewValue, ReplacedTail).
replace([Head|Tail], OldValue, NewValue, [Head|ReplacedTail]):-
replace(Tail, OldValue, NewValue, ReplacedTail).

Fig.4.2 Rezulatatul programului de susbstituire a valorii intr-o lista


Baza de cunoștințe al arborelui genealogic

/*Faptele*/
femeie(ludmila).
femeie(lucia).
femeie(olga).
femeie(ana).
femeie(irina).
femeie(violeta).

barbat(nicolai).
barbat(mihail).
barbat(vasilie).
barbat(grigorie).
barbat(eugen).

parinti(lucia,olga).
parinti(nicolai,olga).
parinti(nicolai,ana).

parinti(mihail,irina).
parinti(mihail,violeta).
parinti(irina,eugen).

parinti(vasilie,lucia).
parinti(vasilie,mihail).
parinti(andriana,lucia).
parinti(andriana, mihail).

parinti(grigorie,nicolai).
parinti(ludmila,nicolai).

/*Regulile*/

tata(X,Z):-parinti(X,Z),barbat(X).
mama(Y,Z):-parinti(Y,Z),femeie(Y).
bunel(X,Z):-parinti(X,Y),(parinti(Y,Z);parinti(Y,Z)).
bunica(X,Z):-parinti(X,Y),(parinti(Y,Z);parinti(Y,Z)).

frate(X,Y):-parinti(Z,X),parinti(Z,Y),barbat(X),not(X=Y).
sora(X,Y):-parinti(Z,X),parinti(Z,Y),femeie(X),not(X=Y).

unchi(X,Y):-parinti(Z,Y),(frate(X,Z);sora(X,Z)),barbat(X).
matusa(X,Y):-parinti(Z,Y),(frate(X,Z);sora(X,Z)),sora(X,Z),femeie(X).

verisori(X,Y):-parinti(Z,X),parinti(W,Y),(frate(Z,W);sora(Z,W)),not(X=Y).

pereche(X,Y):-femeie(X),barbat(Y),parinti(X,W),parinti(Y,W).
nora(X,Y):-parinti(Y,W),pereche(X,W),femeie(X).
ginere(X,Y):-parinti(Y,W),pereche(X,W),barbat(X).
*Scopuri*/
1 ?- tata(X,Y).
X = nicolai,
Y = olga .

2 ?- mama(X,Y).
X = lucia,
Y = olga ;
X = irina,
Y = eugen ;
X = andriana,
Y = lucia ;
X = andriana,
Y = mihail ;
X = ludmila,
Y = nicolai.

3 ?- bunel(vasilie,X).
X = olga ;
X = olga ;
X = irina ;
X = violeta ;
X = irina ;
X = violeta.

3 ?- bunel(vasilie,X).
X = olga ;
X = olga ;
X = irina ;
X = violeta ;
X = irina ;
X = violeta.

4 ?- sora(irina,X).
X = violeta.

5 ?- verisori(X,Y).
X = olga,
Y = irina ;
X = olga,
Y = irina ;
X = olga,
Y = violeta ;
X = olga,
Y = violeta ;
X = irina,
Y = olga ;
X = irina,
Y = olga ;
X = violeta,
Y = olga ;
X = violeta,
Y = olga ;
false.

6 ?- unchi(mihail,Y).
Y = olga ;
Y = olga ;
false.

7 ?- pereche(Y,X).
Y = andriana,
X = vasilie ;
Y = andriana,
X = vasilie ;
Y = ludmila,
X = grigorie ;
Y = lucia,
X = nicolai ;
false.

8 ?- nora(lucia,G).
G = grigorie

Concluzie

Prolog este un limbaj potrivit pentru a puteamodela un sistem inteligent artificial. În urma elaborării
acestui laborator am înțeles mai bine crearea programelor in prolog și anume notiunele sale de baza cum sunt
faptele, regulile si scopurile prin intermediul carora se creeaza baza de cunostinta care este in cazul primului
laborator arborele genealogic.