Documente Academic
Documente Profesional
Documente Cultură
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)
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)
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:-
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,
readchar(_),menu.
process(2):-clearwindow,nl,
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 :"),
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 : "),
readln(Catedra),tel(Catedra,_),
retract(tel(Catedra,_)),readchar(_).
/*predicatele BD interne */
predicates
process(integer)
start
schimb
menu
afisare
clauses
menu:-
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).
afisare if tel(Catedra,Num),nl,
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: