Sunteți pe pagina 1din 8

Lucrarea de laborator nr.

9
Tema : Baze de date n Prolog.
Scopul lucrrii: studierea organizrii BD n Prolog, dobndirea deprinderilor practice n
elaborarea i ajustarea programelor ce lucreaz cu baza de date dinamic.
Informaii de referin succint.
Prolog posed predicate speciale pentru organizarea bazelor de date relaionale.
Predicatele BD se descriu n seciunea database , care este amplasat naintea seciunii
predicates. Toate afirmaiile cu predicate, descrise n seciunea database, constituie BD
dinamic.
Baza de date intern const din fapte, care pot fi dinamic, n procesul de execuie a
programului, adugate n baza de date i lichidate din ea, salvate n fiier, ncrcate din fiier n
baza de date.
Baza de date poate s conin numai fapte, dar nu reguli.faptele bazei de date nu pot
conine variabile libere.
Descriere :
database[ <numele bazei de date>]
<numele predicatului>(<tipul de date argument 1>,...,< tipul de date argumentului n>)
Dac seciunea de descriere a predicatelor bazei de date n program este numai una, atunci ea
poate s nu aib nume. n acest caz seciunea automat primete numele standard dbasedom. n
cazul existenei mai multor seciuni de descriere a predicatelor bazei de date numai una poate fi
fr nume. Toate celelalte trebuie s conin nume unicale, care se indic dup denumirea
seciunii database.
Predicatele destinate lucrului cu BD dinamic.
Pentru adugarea faptelor n baza de date intern poate fi utilizat unul din trei predicate (fiecare
din ei are 2 forme de nscriere:
1. assert predicatul este adugat pentru compatibilitate cu alte versiuni Prolog i lucreaz la fel
ca i assertz.
assert(fapt)
assert(fapt, numele bazei de date)
2. asserta- adaug faptul naintea altor fapte (la nceputul bazei de date interne),
asserta(fapt)

asserta(fapt, numele bazei de date)


3. assertz- adaug faptul dup alte fapte (la sfritul bazei de date).
assertz(fapt)
assertz(fapt, numele bazei de date)
4. retract lichideaz din baza de date intern primul de la nceput fapt, care poate fi identificat
cu primul parametru. Al doilea parametru care nu este obligator a acestui predicat este numele
bazei de date interne.
retract(fapt)
retract(fapt, numele bazei de date)
5. retractall lichideaz toate predicatele ce corespund primului argument. Dac al doilea
argument a acestui predicat indic numele bazei de date, atunci faptul este lichidat din baza de
date indicat. n caz c al doilea argument nu este indicat, faptele sunt lichidate din unica baz de
date fr nume.
retractall(fapt)
retractall(fapt, numele bazei de date)
6. save servete pentru salvarea bazei dinamice pe disc. BD este salvat n fiierul textual cu
nume, care este indicat n calitate de prim argument al predicatului. Dac al doilea parametru,
care nu este obligator, este omis are loc salvarea faptelor din unica baz de date intern fr
nume. Dac a fost indicat numele bazei de date interne, n fiier se vor salva faptele bazei de date
indicate
save(numele fiier)
save(numele fiierului, numele bazei de date)
7. consult

ncarc n memoria operativ faptele salvate n fiierul textual pe disc. Primul

parametru a acestui predicat indic numele fiierului textual, din care urmeaz a fi citite fatele.
Dac al doilea parametru este omis, faptele vor fi ncrcate n baza de date intern fr nume. n
caz contrar faptele sunt ncrcate n baza de date indicat.
consult(nume fiier)
consult(nume fiier, numele bazei de date)
Exemple de programe.
Exemplu 1. Elaborai un program, care ar permite utilizatorului s lucreze cu BD (numerelor de

telefoane a catedrelor) i realizai urmtoarele trei operaii: afiarea datelor la ecran, redactarea i
lichidarea datelor. Pentru comoditate organizai un meniu. Dup executarea fiecrei operaii
programul urmeaz s revin n meniu. Luai n consideraie erorile care pot fi efectuate de
utilizator la executarea operaiilor (introducei mesajele de eroare corespunztoare). Realizai
ncrcarea datelor n BD intern din program.
Amplasai cursorul n fereastra de redactare i introducei textul programului, salvai
programul atribuindu-i numele BD1.PRO.
database
tel(symbol,symbol)

/*predicatul BD interne*/

predicates
process(integer)

/* acest predicat realizeaz executarea punctului corespunztor din meniu */

tele(symbol,symbol)
assert_bd
menu
elim
afisare
clauses
tele(finante,"24-75").
tele(contabilitate,"24-76").
assert_bd if tele(X,Y),assert(tel(X,Y)),fail. /* ncarc faptele n BD intern */
assert_bd if !.
menu:-

/* pentru o finisare reuit a programului */


/* realizeaz afiarea meniului i prelucrarea operaiei selectate */

clearwindow,
write(" * * * * * *"),nl,
write(" * 1. Afisarea datelor"),nl,
write(" * 2. Schimbarea numarului de telefon"),nl,
write(" * 3. Stergerea datelor "),nl,
write(" * 4. Iesire din program "),nl,
write(" * * * * * * "),nl,
nl,
write(" Alegeti varianta : "),
readint(Choice),nl,

process(Choice).
process(1):- clearwindow, nl, afisare,

/*apelul predicatului afisare i revenirea n meniu*/

readchar(_),menu.
process(2):-clearwindow,nl,

/* citete denumirea catedrei i introduce un numr nou de


telefon n BD */

write("Catedra : "),
readln(Catedra),tel(Catedra,_),
write("Numar nou "),
readln(Num),
retract(tel(Catedra,_)),
assert(tel(Catedra,Num)),menu.
process(2) if !,write("nu sunt date in BD"), readchar(_),menu.
/* afi mesajul de eroare, dac denumirea catedrei a fost introdus greit sau nu sunt date despre
o astfel de catedr n BD */
process(3):-clearwindow, nl, elim,menu. /* apelul predicatelor elim i revenirea n meniu*/
process(4):-write("Iesire din program"),retractall(_),readchar(_).
/* realizeaz ieirea din program i lichideaz faptele din BD */
process(_):-menu. /* revenirea n meniu, n cazul tastrii greite de ctre utilizator a unei taste */
afisare if write("Catedra :"),

/* realizeaz afiarea datelor la ecran */

readln(Catedra),
tel(Catedra,Num),nl,
nl,write(" Catedra: ", Catedra),
write(" Telefon:", Num),nl.
afisare if write("nu sunt date in DB"),nl.
/* afi mesajul de eroare, dac denumirea catedrei a fost introdus greit sau nu sunt date despre
o astfel de catedr n BD */
elim if write("Catedra : "),

/* realizeaz lichidarea nregistrrilor din BD */

readln(Catedra),tel(Catedra,_),
retract(tel(Catedra,_)),readchar(_).

elim if !,write(" nu sunt date in baza"),readchar(_).


/* afi mesajul de eroare, dac denumirea catedrei a fost introdus greit sau nu sunt date despre
o astfel de catedr n BD */
goal
assert_bd,menu.
Exemplu 2. Elaborai un program, care ar permite utilizatorului s lucreze cu BD i s realizeze
urmtoarele patru operaii: afiarea la ecran a numrului de telefon a catedrei, redactarea,
pstrarea datelor n fiier i crearea copiilor de rezerv a BD (numele fiierului se introduce de la
tastatur). Pentru comoditate organizai un meniu. Dup executarea fiecrei operaii programul
urmeaz s revin n meniu. Luai n consideraie erorile care pot fi efectuate de utilizator la
executarea operaiilor (introducei mesajele de eroare corespunztoare). Realizai ncrcarea
datelor n BD intern dintr-un anumit fiier n care se pstreaz numerele de telefoane ale
catedrelor.
Pentru derularea corect a programului, n directoriul curent creai un fiier textual cu datele
indicate mai jos, astfel ca la lansarea programului s se solicite numele fiierului.
Coninutul fisierului textual :
tel("matematica","24-45").
tel("informatica","12-87").
tel("finante","12-00").
Introducei textul programului n fereastra de redactare i salvai programul atribuindu-i
numele BD2.PRO.
database
tel(symbol,symbol)

/*predicatele BD interne */

predicates
process(integer)
start
schimb
menu
afisare
clauses

/* acest predicat realizeaz executarea punctului corespunztor din meniu*/

menu:-

/* realizeaz afiarea meniului i prelucrarea operaiei selectate */

clearwindow,
write(" * * * * * *"),nl,
write(" * 1. Afisarea datelor"),nl,
write(" * 2. Schimbarea numarului de telefon"),nl,
write(" * 3. Salvarea datelor "),nl,
write(" * 4. Iesire din program "),nl,
write(" * 5. Inscrierea datelor in fisier "),nl,
write(" * * * * * * "),nl,
nl,
write(" Alegeti varianta : "),
readint(Choice),nl,
process(Choice).

process(1):- clearwindow, nl, afisare,readchar(_),menu.


/* apelul predicatului afisare i revenirea n meniu */
process(2):- clearwindow,schimb,menu.
/* afi mesajul de eroare, dac denumirea catedrei a fost introdus greit sau nu sunt date despre
o astfel de catedr n BD */
process(3):-save("tel.txt"),write("datele au fost salvate"), readchar(_),menu.
/* nscrierea datelor n fiierul textual tel.txt . */
process(4):-write("Iesire din program"), retractall(_),readchar(_).
/* realizeaz ieirea din program i lichideaz faptele din BD */

process(5):- clearwindow,write("introduceti numele fisierului :"),


readln(Numef),save(Numef),readchar(_),menu.
/*nscrierea datelor n fiierul cu numele indicat */
process(_):-menu.

/* revenirea n meniu, n cazul tastrii greite de ctre utilizator a unei taste */

afisare if tel(Catedra,Num),nl,

/* realizeaz afiarea fatelor la ecran */

nl,write(" Catedra: ", Catedra),


nl,write(" Telefon:", Num),nl,nl,fail.
afisare if !, readchar(_).
/* afi mesajul de eroare, dac denumirea catedrei a fost introdus greit sau nu sunt date despre
o astfel de catedr n BD */
start:write("introduceti numele fisierului :"),
readln(Numef),existfile(Numef),consult(Numef),menu.
/* dac fiierul dat exist, se ncarc faptele n BD intern */
start:- !,clearwindow,nl,
write("nu exista cu asa nume fisier :"),nl, readchar(_).
/*n caz contrar se afi mesajul de eroare */
schimb if

/* execut lichidarea numrului vechi i salveaz numrul nou n BD */

write("Catedra: "),
readln(Catedra),tel(Catedra,_),
write("Numar nou "),
readln(Num),
retract(tel(Catedra,_)),
assert(tel(Catedra,Num)),readchar(_).
schimb if !,write(" nu sunt date in baza"),readchar(_).
/* afi mesajul de eroare, dac denumirea catedrei a fost introdus greit sau nu sunt date despre
o astfel de catedr n BD */
goal
start.
Exerciii:

Elaborai un program dicionar englez-romn a terminilor economici, esena cruia const n


urmtoarele. Exist un set de cuvinte engleze i cuvinte romneti (cu tractare). Organizai un
meniu care ar permite executarea urmtoarelor aciuni:
1. Traducerea din englez n romn;
2. Traducerea din romn n englez;
3. Descrierea termenului romn;
4. Corectarea descrierii terminului romnesc;
5. Adugarea cuvintelor n dicionar.
BD completat urmeaz s fie salvat n fiier. La o nou lansarea a programului informaia din
fiier se ncarc n BD dinamic.
Realizai 2 variante programului dat (ncarcarea datelor din fiier i incarcarea datelor din
program).

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