Sunteți pe pagina 1din 13

Facultatea de Stiinte

Informatica , an 1

Logica computationala

Baze de date in
Prolog

student
Idu
Stefan Andrei

Cuprins
1.Abstract2
2.Cuvinte cheie..... 3
3. Despre Prolog si bazele de date..4

4.Operatii cu baze de date..5


4.1 Functia assert.....................................................5
4.2 Functia retract...................................................6
4.3 Functii de memorare.7
4.3.1 Exemplu Turnurile din Hanoi...8
4.4 Predicatul repeat 10

5.Bibliografie.13

1. Abstract
In aceasta lucrare sunt prezentate operatiile
principale cu bazele de date in Prolog ,exemplele
prezentate fiind : assert , retract ,functii de
memorare ,repeat.

2.
Fapte
Reguli
Assert

Cuvinte cheie:

Predicat
Retract
Legatura
Retim
Consult
Relatie

3.Despre Prolog si bazele de date

Prolog este un limbaj specific inteligenei


artificiale ( Prolog - Programming in Logic ) Originea
lui aparine lui Alain Calmaureur de la Universitatea din
Marsilia, Frana. Iniial a fost conceput pentru analiza
lexical. Azi in mod curent exista mai multe
implementri att open source ct i proprietare. Printre
cele mai bune implementari open source existente azi se
numara swi-prolog

O baz de date, uneori numit i banc de


date (abreviat BD), reprezint o modalitate de stocare a
unor informaii i date pe un suport extern (un dispozitiv
de stocare), cu posibilitatea extinderii uoare i a
regsirii rapide a acestora
Este evident faptul ca un program Prolog este o
baz de date ce conine predicate. Prologul ne ofer ns
posibilitatea s manevrm baza de date n mod direct i
ne ofer predicate predefinite care fac acest lucru

4.Operatii cu baze de date


4.1 Functia assert(adaugare clauze)

Forma in Swi Prolog

assert(X)

asserta(X)

Rezultat

adaug clauza X ca
ultima clauz a
predicatului din care
face parte
clauza X este adugat
ca prima clauz a

predicatului
assertz(X)

acelai efect cu assert(X)

Exemplu(cu explicatii):
Presupunem c avem urmtoarele fapte ntr-un
fiier Prolog:
copil(ionut).
copil(marian).
copil(simona).
Presupunem c ei sunt introdui n ordinea
vrstei lor. Cu un apel de forma:
6/61? - copil(C).
Obinem, evident: C = ionut.
Pentru: ? - copil(C), write(C), nl, fail.
vor fi afiai toi copiii gsii.

Dac se ivete un nou copil, i anume, Iulia, trebuie


s avem n vedere faptul c ea este cea mai mic.
7/61
Avem nevoie de un apel de forma:
? asserta(copil(iulia)).
Putem verifica acum faptul c Iulia a fost inserat n
baza de date dinamic folosind una din cele dou
apelri de mai sus, pentru afiarea primului copil,
respectiv pentru afiarea tuturor copiilor:
? - copil(C), write(C), nl, fail.

4.2 Functia retract (retrage clauze)


Forma in Swi Prolog
retract(X)
retractall(X)

Rezultat
scoate clauza X din baza
de date
sunt eliminate toate faptele
sau regulile din baza de
date pentru care capul
clauzei este unificat cu X

Exemplu(cu explicatii):
Pentru acest exemplu folosim aceiasi baza de date
care am avut-o si la assert.S lum n continuare cazul
n care Simona a trecut de vrsta la care mai poate fi
numit copil.
8/61Pentru a o elimina din baza de date, apelm:
? retract(copil(simona)).
Din nou putem verifica dac a fost eliminat,
afind toi copiii:
? - copil(C), write(C), nl, fail.
4.3 Functii de memorare
O functie de memorare salveaza rezultatele unor

subcalcule pentru a putea fi folosite direct, in apelari


viitoare, fara a mai fi recalculate.
Prototipul unei astfel de functii este
retin(deductie(arg1, , argn))
Implementarea se realizeaza astfel:
retin(deductie(arg1, , argn)):-deductie(arg1, ,
argn), asserta(deductie(arg1, , argn)).
Se verifica veridicitatea faptului respectiv si, in caz
afirmativ, se introduce in memoria Prolog-ului.
retin(deductie(arg1, , argn)):-deductie(arg1, ,
argn), asserta(deductie(arg1, , argn)).
Data urmatoare cand se doreste atingerea scopului
(afirmatia din capul clauzei), solutia va fi gasita
Direct in memorie, fara a repeta calculele.
Exemplu (cu explicatii)
Turnurile din Hanoi
Enunt: Se dau N discuri si 3 cuie: A, B, C. Se cere sa
se mute toate discurile de pe cuiul A pe cuiul B,
folosindu-se drept cui intermediar C. Discurile sunt
intotdeauna asezate unul peste altul in ordinea
crescatoare a marimii.
Solutie: Problema se rezolva recursiv. Se muta N 1
discuri de pe cuiul A pe cuiul C. Se muta apoi cele N 1
discuri de pe C pe B. In final, se aseaza cuiul 1 de pe A
pe B. Cand avem 1 disc, se muta de pe A pe B.
In Prolog:

hanoi1(N):-hanoi1(N, a, b, c, L), afis(L).


hanoi1(N,A,B,_C,[(A,B)]):-N = 1.
hanoi1(N,A,B,C,M):-N > 1, N1 is N - 1,
hanoi1(N1,A,C,B,M1),
hanoi1(N1,C,B,A,M2),append(M1, [(A, B)|M2],
M).
afis([]).
afis([X|Rest]):-writeln(X), afis(Rest).
%(partea cu functia de memorare)
:-dynamic(hanoi/5).26/61
hanoi(N):-hanoi(N, a, b, c, L), afis(L).
hanoi(N,A,B,_C,[(A,B)]):-N = 1.
hanoi(N,A,B,C,M):-N > 1, N1 is N - 1,
retin(hanoi(N1,A,C,B,M1)),
hanoi(N1,C,B,A,M2),append(M1, [(A, B)|M2], M).
retin(P):-P, asserta(P).
Se utilizeaza functiile memorare pentru a
imbunatati performanta programului initial. Solutia
acestei probleme, cand sunt N discuri necesita 2^N 1
mutari. Modul de solutionare al problemei rezolva in
modrepetat subprobleme prin mutarea unui numar
identic de discuri.
O functie de memorare poate fi folosita pentru a
retine mutarile facute pentru fiecare subproblema
cu un numar mai mic de discuri.Cand se ajunge la
reapelarea unui fapt care a fost deja calculat, se poate

folosi secventa de mutari deja retinuta in memorie, in


loc de a le recalcula.
Se memoreaza prima clauza recursiva, de muta N
1 discuri, a predicatului hanoi si poate fi folosita
de a doua apelare recursiva a sa pentru N 1
discuri.
Rulare:

4.4 Predicatul REPEAT


Dac o anumit clauz trebuie satisfcut de mai
multe ori, facem apel la predicatul fail care face ca
Prologul s ncerce s gseasc toate soluiile
(presupunnd c nu folosim tietura). Totui, n unele
situaii, este necesar s repetm numai o anumit parte
de program, nainte de a continua procesul cu restul
clauzei. Acest gen de situaii apar atunci cnd vrem s
realizm operaii iterative, precum citirea dintrun
fiier ori la realizarea unui meniu.
n general, predicatul repeat este folosit n construcii
de
forma:61
nume_predicat :- repeat, % ncep bucla

afisez_meniu, % afiez meniul pentru utilizator


citesc_optiunea(N),% citesc data introdus de ctre
utilizator
validez_optiunea(N), % verific dac exist n cadrul
meniului
execut_cerinta(N), % realizez ce era specificat n
meniu pentru N
verific_oprirea(N), % verific dac este condiia de
terminare
Exemplu:
Urmtorul predicat citesc/0 face citirea de la
tastatur a unor valori pe care le afieaz apoi
utilizatorului. Procesul se termin atunci cnd
utilizatorul introduce gata.
In Prolog:
citesc :- repeat, meniu, read(X), write('Am citit '),
write(X), write('!'), nl, X == gata, !.
meniu :- nl, write('---------'), nl, write('Exemplu
banal!'), nl, write('Orice introduceti, afisam!'), nl,
write('Pentru oprirea repeat-ului, tastati gata.'), nl,
write('---------'), nl, nl.

Bibliografie
http://web.info.uvt.ro/~mmarin/lectures/LP/curs-11.pdf

http://inf.ucv.ro/~rstoean/courses/pnp/c6.pdf

http://ro.wikipedia.org/wiki/Prolog_
%28limbaj_de_programare%29

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