Sunteți pe pagina 1din 27

SISTEME EXPERT

Universitatea din Oradea


Anul universitar 2016-2017

Prof. Dr. Cornelia Győrödi

Sisteme Expert - (cgyorodi@uoradea.ro) 1


Curs 10

Predicate predefinite pentru baze de date interne


Baza de date externe
Predicatele predefinite pentru bazele de date
externe

prof. dr. ing. Cornelia Gyorodi 2


Predicatele predefinite pentru baza de date

a) assert(clauza) - adaugă o înregistrare (un fapt) la


baza de date
Exemplu:
class predicates
fillDatabase : () procedure.

clauses
fillDatabase() :-
assert(person("1", "John", "85", "185", "110")),
assert(person("2", "Thomas", "75", "190", "150")),
assert(person("3","Anna", "65", "175", "123")),
assert(person("4", "Lidy", "55", "160", "135")),
stdIO::write("Baza de date a fost incarcata"), stdIO::nl.

prof. dr. ing. Cornelia Gyorodi 3


Predicatele predefinite pentru baza de date
(continuare)
b) clauseChain::asserta/1 (predicatul asserta din clasa
clauseChain) - adaugã o clauzã de tip fapt la începutul unui
tabel și are sintaxa :
asserta(clause Clauza).
c) clauseChain::assertz/1 - adaugã la sfârșitul unui tabel o
clauză
assertz(clause Clauza).
d) file::save/2 - salvează faptele din baza de date, într-un
fisier text
save(string Nume_Fisier,factDB Fapt).
e) clauseChain::retract/1 - șterge o clauză din tabelul curent
retract(clause Clauza) determ.
prof. dr. ing. Cornelia Gyorodi 4
Predicatele predefinite pentru baza de date
(continuare)

f) pie::retractAll/0 - șterge toate clauzele din


interpretorul PIE
retractAll().
g) inputStream::consult/1 - citește fapte dintr-un
fisier
consult(factDB Fapt).
h) file::consult/2 – citește fapte dintr-un fișier și le
adaugă la sfârșitul bazei de date specificate:
consult(string Nume_Fisier, factDB Fapt).

prof. dr. ing. Cornelia Gyorodi 5


Operații cu baze de date interne
Bazele de date interne prezintă dezavantajul că, după
închiderea programului, datele (înregistrările) inserate în
bază se pierd.
Aceste date pot fi totuși salvate pe disc, într-un fisier și la o
nouă execuție a programului, fisierul poate fi consultat.
Pentru salvarea unei baze de date într-un fisier, ea trebuie
declarată, în secțiunea class facts, astfel:

class facts - personDB


person : (string ID, string Name, string Weight, string Length, string IQ).

prof. dr. ing. Cornelia Gyorodi 6


Salvarea unei baze de date interne
Pentru salvarea unei baze de date interne într-un
fișier pe disc, se folosește predicatul predefinit
save/2 din clasa file:
file::save("persoanaDB.txt", persoanaDB).
Exemplu:
class facts - personDB
person : (string ID, string Name, string Weight, string Length,
string IQ).
class predicates
saveDatabase:() procedure.

prof. dr. ing. Cornelia Gyorodi 7


Salvarea unei baze de date interne
clauses
saveDatabase() :-
file::existFile("personDB.txt"), !,
file::delete("personDB.txt"),
file::save("personDB.txt", personDB),
stdIO::write("Baza de date a fost salvata in fisierul personDB.txt"), stdIO::nl.

saveDatabase() :-
file::save("personDB.txt", personDB),
stdIO::write("Baza de date a fost salvata in fisierul personDB.txt"), stdIO::nl.

prof. dr. ing. Cornelia Gyorodi 8


Consultarea unei baze de date

Predicatul care consultă fișierul și încarcă baza de


date este predicatul predefinit consult/2 din clasa
file:
file::consult("persoanaDB.txt", persoanaDB)
Exemplu:

class predicates
consultDatabase : () procedure.

prof. dr. ing. Cornelia Gyorodi 9


Consultarea unei baze de date

clauses
consultDatabase() :-
file::consult("personDB.txt", personDB),
stdIO::write("Inregistrarile au fost adaugate din fisierul perso
nDB.txt"), stdIO::nl.

prof. dr. ing. Cornelia Gyorodi 10


Ștergerea unei înregistrări dintr-o bază de date
internă
Predicatul predefinit care șterge o înregistrare
dintr-o bază de date este: retract/1.
retract(clause Clauza).
Pentru modificarea valorilor dintr-o înregistrare,
se pot folosi două preficate predefinite : retract/1
și assertz/1.
Se va șterge mai întâi linia cu vechile valori, după
care se inserează o linie (o înregistrare cu noile
valori).

prof. dr. ing. Cornelia Gyorodi 11


Exemplu

Un program scris în Visual Prolog care operează


asupra unei baze de date interne, adaugă axiome
(fapte noi), afișează conținutul baze de date și
salvează conținutul bazei de date într-un fișier
specificat.

prof. dr. ing. Cornelia Gyorodi 12


Exemplu (continuare)
implement main
open core, stdIO, list

class facts - personDB


person : (string ID, string Name, string Weight, string Length, string IQ).

class predicates
fillDatabase : () procedure.

clauses
fillDatabase() :-
assert(person("1", "John", "85", "185", "110")),
assert(person("2", "Thomas", "75", "190", "150")),
assert(person("3","Anna", "65", "175", "123")),
assert(person("4", "Lidy", "55", "160", "135")),
stdIO::write("Baza de date a fost incarcata"), stdIO::nl.
prof. dr. ing. Cornelia Gyorodi 13
Exemplu (continuare)
class predicates
listDatabase : () procedure.

clauses
listDatabase() :-
person(ID, Name, Weight, Length, IQ),
stdIO::write("ID: ", ID, ", Name: ", Name, ", Weight: ", We
ight, ", Length: ", Length, ", IQ: ", IQ),
stdIO::nl,
fail.
listDatabase().

prof. dr. ing. Cornelia Gyorodi 14


Exemplu (continuare)
class predicates
addPerson : (string Name, string Weight, string Length, string
IQ) procedure.

clauses
addPerson(Name, Weight, Length, IQ) :-
findAll(ID, person(ID, _, _, _, _), IDList),
NewID = toString(toTerm(maximum(IDList)) + 1),
assertz(person(NewID, Name, Weight, Length, IQ)),
stdIO::write("Persoana ", Name, " a fost adaugata cu ID: ",
NewID), stdIO::nl.

prof. dr. ing. Cornelia Gyorodi 15


Exemplu (continuare)
class predicates
saveDatabase:() procedure.

clauses
saveDatabase() :-
file::existFile("personDB.txt"), !,
file::delete("personDB.txt"),
file::save("personDB.txt", personDB),
stdIO::write("Baza de date a fost salvata in fisierul personD
B.txt"), stdIO::nl.
saveDatabase() :-
file::save("personDB.txt", personDB),
stdIO::write("Baza de date a fost salvata in fisierul personD
B.txt"), stdIO::nl.
prof. dr. ing. Cornelia Gyorodi 16
Exemplu (continuare)

class predicates
consultDatabase : () procedure.

clauses
consultDatabase() :-
file::consult("personDB.txt", personDB),
stdIO::write("Inregistrarile au fost adaugate din fisier
ul personDB.txt"), stdIO::nl.

prof. dr. ing. Cornelia Gyorodi 17


Exemplu (continuare)
clauses
run():-
console::init(),
fillDatabase(),
stdIO::write("Numele:"),
X = stdIO::readLine(),
stdIO::write("Weight:"),
X1 = stdIO::readLine(),
stdIO::write("Lenght:"),
X2 = stdIO::readLine(),
stdIO::write("IQ:"),
X3 = stdIO::readLine(),
addPerson(X, X1, X2, X3),
listDatabase(),
saveDatabase(),
consultDatabase().
end implement main
goal
console::runUtf8(main::run). 18
Modalităţi de a introduce axiome

Există trei modalităţi de a introduce axiome într-o


bază de date internă:
a) Axiomele să facă parte din secţiunea „clauses“.
b) În timpul execuției, folosind predicatele
predefinite din PROLOG asserta şi assertz .
c) Prin încărcarea axiomelor dintr-un fişier de tip
bază de date internă, folosind predicatul predefinit
consult.

prof. dr. ing. Cornelia Gyorodi 19


Baze de date externe în Visual Prolog

Clasa chainDB, din pachetul chainDB (interface


chainDB), conține predicate pentru lucrul cu baze
de date externe.
Operațiile de creare și deschidere a unei baze de
date externe utilizează constructorul clasei
chainDB, care returnează un obiect pentru
accesarea bazei de date.
Pot fi create mai multe baze de date externe (un
număr nelimitat) care pot fi accesate simultan.

prof. dr. ing. Cornelia Gyorodi 20


Predicate predefinite pentru baze externe
Visual Prolog

a) Pentru crearea unei baze de date externe, se folosește


predicatul chainDB::db_create/2, cu sintaxa:

db_create:(string Name, place Place).


Se creează o bază de date externă goală, cu numele
fisierului Name. Baza de date se creează într-un fișier sau
în memorie, în funcție de valoarea argumentului al doilea
astfel:
place = in_memory(); % baza de date se crează în memorie
in_file(). % baza de date se crează în fișier

prof. dr. ing. Cornelia Gyorodi 21


Predicate predefinite pentru baze externe
Visual Prolog

Predicatul db_create genereazã eroare dacă al doilea


argument este in_file și nu este posibilã crearea
fișierului specificat.
b) Deschiderea unei baze de date externe pentru
citire și scriere se realizează cu predicatul
chainDB::db_open/2, cu sintaxa:
db_open:(string Name, place Place).
Baza de date se deschide într-un fisier sau în
memorie, în funcție de valoarea celui de-al doilea
argument astfel: in_memory sau in_file.
prof. dr. ing. Cornelia Gyorodi 22
Predicate predefinite pentru baze externe
Visual Prolog

c ) Pentru ștergerea unei baze de date externe, se


foloseste predicatul chainDB::db_delete/2, cu
sintaxa:
db_delete:(string Name, place Place).
Dacă baza de date externă este deschisă, se
generează eroare. Dacă baza de date este situată în
memorie, predicatul db_delete eliberează memoria
ocupată. Dacă baza este stocată pe disc, într-un
fișier, se șterge fișierul.

prof. dr. ing. Cornelia Gyorodi 23


Predicate predefinite pentru baze externe
Visual Prolog

d) Încărcarea unei baze de date externe dintr-un


fișier de pe disc, se realizează cu predicatul
chainDB::cdb_load/2, cu sintaxa:
db_load:(string File, string Name).

Predicatul db_load copiază baza de date din fișierul


File, în baza Name creată în memorie.

prof. dr. ing. Cornelia Gyorodi 24


Exemplu
Un program scris în Visual Prolog care operează asupra unei baze
de date: șterge informațiile dintr-o bază de date specificată, încarcă
informații dintr-un fișier specificat în baza de date și afișează
conținutul bazei de date.
implement main
open core

class facts - persoanaDB


persoana : ( string Nume, string Adresa, integer Virsta, char Sex).
class predicates
getData : () procedure.
clauses
getData() :-
stdIO::write("Doriti stergerea inregistrarilor inainte de consultarea baze de date?"),
Answer = stdIO::readLine(),
Answer = "Yes", !,
retractFactDB(persoanaDB),
file::consult("persoanaDB.txt", persoanaDB),
stdIO::write("Inregistrarea a fost stearsa \nNoi inregistrari au fost adaugate din persoanaDB.txt")
, stdIO::nl.

prof. dr. ing. Cornelia Gyorodi 25


Exemplu (continuare)
getData() :-
file::consult("persoanaDB.txt", persoanaDB),
stdIO::write("Noi inregistrari au fost adaugate din persoa
naDB.txt"), stdIO::nl.
class predicates
consultDatabase : () procedure.
clauses
consultDatabase() :-
file::existFile("persoanaDB.txt"), !,
getData().
consultDatabase() :-
stdIO::write("Nu exista fisierul persoanaDB.txt ").
class predicates
listDatabase : () procedure.
prof. dr. ing. Cornelia Gyorodi 26
Exemplu (continuare)
clauses
listDatabase() :-
persoana(Nume, Adresa, Virsta, Sex),
stdIO::write("Nume: ", Nume, ", Adresa: ", Adresa, ", Virsta: ", Virsta, ", Sex:
", Sex),
stdIO::nl,
fail.
listDatabase().
clauses
run():-
console::init(),
consultDatabase(),
listDatabase(),
consultDatabase(),
listDatabase().
end implement main
goal
console::runUtf8(main::run).
27

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