You are on page 1of 35

7

NICOLETA LIVIANA TUDOR

PROGRAMARE LOGIC I
SISTEME EXPERT
Aplicaii Visual Prolog i Exsys

2012

Referent tiinific
Conf. Univ. Dr. Marin VLADA
Universitatea din Bucureti

Tehnoredactare computerizat
Lect. Univ. Dr. Nicoleta Liviana TUDOR
Universitatea Petrol-Gaze Ploieti
tudorlivia@yahoo.com

Prefa

Una dintre cele mai frumoase metode de programare este programarea


logic, cunoscut i sub denumirea de programare declarativ.
Programarea logic opereaz cu termeni precum baz de cunotine,
clauze Horn, inferen, backtracking, nlntuire, unificare, etc. Instruciunile
sunt formulate ntr-o form logic specific, fiind reprezentate de regulile
care vor fi aplicate n anumite situaii, pentru atingerea scopului problemei.
Inferena este o metod de procesare a cunotinelor codificate prin
clauze Horn i const n generarea de raionamente care vor trata toate
cazurile posibile ale unei probleme.
Abilitatea acestor sisteme declarative de a nva i de a lua decizii
constituie un motiv, pentru care programarea logic este caracteristic
domeniului inteligenei artificiale.
De asemenea, sistemele expert sunt produse ale inteligenei artificiale,
ele furniznd sfaturi i recomandri, bazndu-se pe cunotine ale experilor
umani.
Sistemele expert sunt sisteme bazate pe cunotine achiziionate din mai
multe domenii de expertiz, cu aplicabilitate n medicin, finante, vnzri,
sisteme industriale, comerciale, de evaluare, etc.
n funcie de domeniile pentru care sunt create, sistemele expert sunt
considerate similare sistemelor de asistare a deciziei, ntr-o manier
discutabil. Se pot enumera cteva tipuri de sisteme expert, des ntlnite:
- de diagnoz
- interpretare
- predicie
- instruire.
Cu convingerea c programarea logic este interesant i util, iar
sistemele expert au aplicabilitate n multe domenii IT, business i
nvmnt, aceast carte a fost proiectat i finalizat de autoare, pentru
studenii de la specializarea Informatic, Calculatoare, Informatic
Economic, pentru specialiti IT, dar i pentru toi cei pasionai de
programare.
10

Cartea PROGRAMARE LOGIC I SISTEME EXPERT este structurat


n ase capitole astfel:
Capitolul 1 - Programare logic n Visual Prolog, care prezint
conceptele de baz ale programrii declarative i metodele de realizare a
controlului programelor.
Capitolul 2 - Mediul IDE (Integrated Development Environment), cu
principalele noiuni necesare programrii vizuale n Prolog (acest capitol
necesit cunotine de programare orientat pe obiecte).
Capitolul 3 - Recursivitate. Liste i arbori, capitol care descrie detaliat
metoda de programare recursiv, oferit de limbajul Prolog. Sunt
implementate recursiv structurile de date de tip list i arbore.
Capitolul 4 - Baze de date, capitol care prezint bazele de date interne
i externe Prolog. Se ofer o nou abordare a conceptului tradiional de baze
de date.
Capitolul 5 - Sisteme expert, n care se descriu detaliat arhitectura i
etapele de creare a unui sistem expert, cu aplicaii n Visual Prolog.
Capitolul 6 - Generatorul de sisteme expert ExSys, capitol n care este
prezentat instrumentul software ExSys Corvid, pentru dezvoltarea automat
a sistemelor expert.
Acest material a fost elaborat n conformitate cu programa analitic a
cursului de Sisteme expert, predat de Lect. Dr. Liviana TUDOR, studenilor
de la specializarea Informatic, din cadrul Universitii Petrol i Gaze din
Ploieti.
Doresc s le mulumesc domnilor profesori:
- Prof. Dr. Ing. Mihaela OPREA (Universitatea Petrol i Gaze, Ploieti,
Departamentul de Automatic, Calculatoare i Electronic) i
- Conf. Univ. Dr. Marin VLADA (Universitatea din Bucureti,
Departamentul de Matematic Aplicat i Informatic),
pentru sfaturile i ndrumrile colegiale i materialele de studiu oferite,
pentru studiu i documentare.
De asemenea, apreciez foarte mult i i adresez mulumiri domnului
Conf. Univ. Dr. Marin VLADA (Universitatea din Bucureti), pentru citirea
atent a manuscrisului i recomandrile fcute pentru imbuntirea lucrrii.
Liviana TUDOR
8 VI - 2012

11

CUPRINS

PROGRAMARE LOGIC
I SISTEME EXPERT
Aplicaii Visual Prolog i Exsys

Capitolul 1.

Capitolul 2.

Programare logic n Visual Prolog ....

1.1. Introducere n Visual Prolog 7.3 ......

1.2. Concepte de baz ..

13

1.2.1. Clauze logice Horn .................

13

1.2.2. Baze de cunotine ......

15

1.2.3. PIE (Prolog Inference Engine) .

16

1.3. Controlul programelor ...

17

1.3.1. Interogarea bazei de cunostinte ........

18

1.3.2. Arborele de procesare asociat unui scop

19

1.3.3. Opiunile Fail i Backtracking ..

21

1.4. Exerciii i probleme .......

25

Mediul IDE (Integrated Development


Environment) ......

29

2.1. Formulare. Controale .....

31

12

Capitolul 3.

Capitolul 4.

Capitolul 5.

2.2. Evenimente de mouse ....

34

2.3. Ferestre de dialog

34

2.4. Controale: casete de editare, butoane ................

38

2.5. Exerciii i probleme ...........

40

Recursivitate. Liste i arbori .....

55

3.1. Recursivitate

55

3.2. Liste

68

3.2.1. Predicate recursive pentru liste ....

71

3.2.2. Predicate predefinite pentru liste ..

80

3.3. Arbori ..

81

3.3.1. Reprezentarea unui arbore .

82

3.3.2. Parcurgerea unui arbore binar

84

3.4. Exerciii i probleme ...

87

Baze de date ......

91

4.1. Baze de date interne ...

91

4.1.1. Proiect GUI cu baze de date interne .

93

4.1.2. Operaii cu baze de date interne

99

4.2. Baze de date externe ..

104

4.3. Exerciii i probleme ..

107

Sisteme expert .

111

5.1. Reprezentarea cunotinelor

114

5.2. Arhitectura unui sistem expert ..

117

5.3. Metodologia de creare a unui sistem expert .

118

5.3.1. Construirea bazei de cunotine

119

5.3.2. Crearea motorului de inferen ..

120

5.3.2.1. Structura motorului de inferen

121

13

5.3.2.2. Ciclul de inferen

122

5.3.2.3. Algoritmii Rete i Markov .

122

5.3.2.4. Metodele de activare a regulilor

123

5.3.3. Interfaa sistemului expert .

125

5.3.4. Modulul de achiziie a cunotinelor

126

5.3.4.1. Ingineria cunoaterii .

126

5.3.4.2. Etapele achiziiei cunotinelor .

126

5.3.5. Modulul de nvare

127

5.3.6. Modulul de explicare ..

129

5.4. Studiu de caz - Sistem expert de evaluare


didactic ....

131

5.5. Exerciii i probleme ..

139

Generatorul de sisteme expert ExSys

147

6.1. Reprezentarea cunotinelor i inferena

150

6.2. Configurare fiiere, variabile i interogri .

153

6.3. Studiu de caz .........

154

Anexa 1

159

Anexa 2

169

Bibliografie

177

Capitolul 6.

14

15

Capitolul 1

PROGRAMARE DECLARATIV N
VISUAL PROLOG

Programarea declarativ (logic) a aprut n jurul anilor 60, ca o


altermativ la reprezentarea procedural a cunotinelor n Inteligena
Artificial.
Limbajele de programare declarativ au la baz logica predicatelor, care
s-a conturat din dorina de formalizare a gndirii umane, raionale.
Numeroase lucrri au studiat semantica logicii predicatelor, din
perspectiva unui limbaj de programare [26], [53], [3].
Hayes i Kowalski (Universitatea Edinburgh, Scoia) au ncercat s
combine reprezentarea declarativ a cunotinelor, bazat pe logic, cu
abordarea procedural.
Kowalski n colaborare cu Colmerauer (Marseille) au dezvoltat i
publicat ideile de proiectare i implementare a limbajului de programare
Prolog.
Din limbajul Prolog, au fost derivate cteva versiuni de limbaje de
programare logic concurent, cum sunt: ALF, Gdel, Mercury, Oz, Visual
Prolog [47].
Kowalski i Colmerauer au dat implicaiei (dac - atunci) o interpretare
dual, declarativ / procedural, care a devenit ulterior o notaie consacrat n
limbajul Prolog [48]:
H :- B1, . . ., Bn.
unde B1, . . ., Bn sunt predicate. Astfel de formalizri au fost folosite
exclusiv pentru definirea clauzelor Horn.
Interpretarea unei clauze Horn se efectueaz prin nlnuirea
raionamentelor napoi [49]:
H if B1 and and Bn

16

Primul compilator Prolog a fost creat n 1980, pentru Turbo Prolog.


Centrul de dezvoltare Prolog a mbuntit permanent compilatorul Prolog,
realiznd compilatorul Visual Prolog.
Visual Prolog este un mediu de programare complet, coninnd:
- interfa grafic IDE (Graphical Integrated Development Environment)
- compilator creeaz fiiere obiect, fiiere executabile, biblioteci, valideaz
predicatele, verific tipurile de date, iniializrile, etc.
- linkeditor utilizeaz fiiere *.LIB i creeaz fiiere *.EXE i *.DLL
- debugger (depanator) pentru execuie pas cu pas a programului, depistarea
erorilor, afiarea obiectelor i a claselor, a componentelor acestora,
vizualizarea memoriei, a variabilelor i a stivei.
n continuare, va fi prezentat ultima versiune a mediului vizual de
programare logic Prolog, din 2010, n care vor fi scrise i verificate toate
aplicaiile din aceast carte: Visual Prolog 7.3. Personal Edition.

1.1. Introducere n Visual Prolog 7.3


Versiunea Visual Prolog 7.3. Personal Edition a aprut n octombrie 2010 i
este un soft free. O adres pentru download din reeaua Internet este:
http://www.visual-prolog.com/
Se pot meniona cteva caracteristici ale limbajului Visual Prolog:
- este o extensie orientat pe obiecte a limbajului Prolog
- folosete concepte de programare logic (clauze Horn, backtracking)
- folosete tipuri de date algebrice
- suport soluii avansate client-server i three-tier (multi-strat)
- realizeaz gestiunea automat a memoriei
- conine interpretorul PIE, care permite scrierea programelor clasice Prolog
(fr componente vizuale, fr obiecte, clase, tipuri, etc.)
- PIE (Prolog Interpretation Engine) este o aplicaie, un exemplu instalat
implicit de Visual Prolog
Sintaxa i semantica limbajului de programare Visual Prolog vor fi
prezentate succint n continuare. Pentru detalii, se recomand consultarea
Anexei 1, de la sfritul crii i a documentaiei electronice [54].
Un program Visual Prolog conine:
- o teorie (o mulime de fapte adevrate i reguli) i
17

- un goal (un scop urmrit de compilator sau o ntrebare, la care se caut


rspunsuri n teorie).
Teoria dintr-un program Visual Prolog este format din declaraii i
implementri de clase sau alte tipuri de entiti Prolog, cum ar fi [17]:
- domenii
- constante
- variabile
- predicate
- proprieti de obiecte i clase
- baz de fapte.
Domenii
n Prolog, un domeniu reprezint echivalentul tipului de date i
definete mulimea de valori posibile. Domeniile definite n scopul curent
(interfee, clase) pot include tipuri de expresii, constante, variabile, fapte,
predicate, tipuri de date universale, etc.
Regul : numele de domenii ncep cu liter mic.
Exemple:
domains
x = [1..10].
p = persoana(string A, string B).
Domeniile includ tipurile de date (Anexa 1). Exemple uzuale de tipuri
de date Visual Prolog sunt:
- tipul char memorat pe 2 octei (bytes)
- string folosit pentru secvene de caractere terminate cu zero
- symbol folosit pentru secvene de caractere terminate cu zero
- integer reprezint numere ntregi cu semn
- real pentru numere reale
- pointer, tip de date ce folosete 4 octei, pentru adresarea memoriei.
Constante
n Visual Prolog, seciunea definiiilor de constante conine:
- numele constantei se accept numai identificatori care ncep cu litere
mici
- tipul i valoarea constantei trebuie s corespund cu tipul domeniului de
care aparine
- constantele booleene 1 (true) i 0 (false) sunt b_true, b_false.
18

Exemple:
constants
x = '5'.
y : boolean = true.
fisierBinar = "fisier.cl".
Variabilele, n Visual Prolog, trebuie s nceap cu liter mare sau
liniua de subliniere _. Variabilele notate prin _ sunt anonime, simboliznd
faptul c valoarea lor nu intereseaz.
Predicate
O definiie matematic a noiunii de predicat, care se nva la orele de
algebr, n clasa a IX-a, este [31]:
Un predicat (sau o propoziie cu variabile) este un enun care depinde
de una sau mai multe variabile i are proprietatea c pentru orice valori date
variabilelor, corespunde o propoziie adevrat sau fals.
Deci un predicat este o funcie p : D B, unde D este un domeniu dat,
iar B este un domeniu de valori logice.
Predicatele Prolog se folosesc pentru reprezentarea faptelor, regulilor i
a scopurilor i pot fi:
- predicate de tip obiect sau
- predicate de tip clas.
Numele predicatelor trebuie s nceap cu liter mic sau caracterul
underscore (_).
Aritatea unui predicat este definit de numrul de argumente. Astfel, un
predicat cu 2 argumente este un predicat binar.
Exemple:
inscris_in_grupa ("Monica", 4227).
tata("Ioan", "Mihaela").
Tipurile de predicate existente n Prolog sunt [37]:
- definite de preogramator
- predefinite
Dac exemplificm pentru Visual Prolog, se pot folosi predicate
predefinite precum:
- getText(), readchar(), getReadOnly(), read(), readstring()
- write(), writef(), nl, save()
- bound() verific dac o variabil este legat de o valoare
19

- free/1, predicat cu un argument, care verific dac o variabil este


liber
- compare/2 este un predicat cu dou argumente, care returneaz
rezultatul comparrii a dou variabile
- fail/0 invoc backtracking
- not/1 neag rezultatul unui subscop
- predicatele fail i cut(!) pot intra n componena unor reguli.
n biblioteca standard Prolog exist proceduri cu acelai nume i
argumente diferite (suprancrcare Programare Orientat pe Obiecte).
Proprieti de obiecte i clase
Seciunile de declaraii de proprieti reprezint mulimi de proprieti
ale obiectelor i claselor.
Exemple:
properties
student : string.
varsta : integer.
bursier : boolean.
Baz de fapte
Faptele reprezint propoziii adevrate i se pot grupa ntr-o baz de
fapte sau ntr-o baz de cunotine.
Baza de cunotine conine fapte i reguli, ambele fiind considerate
clauze Horn.
Faptele sunt reprezentate prin predicate; ambele sunt denumite clauze
Horn.
Numele faptelor trebuie s nceap cu liter mic.
n programe simple Prolog/Visual Prolog, fr componente vizuale i
obiectuale (fr clase, etc.), nu exist seciunea facts, iar faptele fac parte
dintr-o baz de cunotine/fapte.
Seciunea facts poate fi inclus numai n declaraii/implementri de
clase.
Semnele de punctuaie acceptate de compilatorul Visual Prolog [54]
sunt urmtoarele :
; ! , . # [ ] | ( ) :- : :: /* */
Comentariile pe o linie ncep cu %, iar cele scrise pe linii multiple se
ncadreaz ntre semnele /* */. Comentariile sunt ignorate de compilator.
20

Simbolul # este utilizat pentru declararea directivei include i a


fisierelor de tip header, clas, interfa, etc.
Operatori
Operatorii folosii n Visual Prolog se clasific n mai multe categorii:
aritmetici, logici, de comparaie.
Enumerm cteva exemple de operatori, ns informaii detaliate se
gsesc n documentaia Help Visual Prolog [57], [54]:
+ - / * ^ = div mod rem
< > <> <= >= :=
Exemple de operatori binari aritmetici:
- mod returneaz restul mpririi a dou numere ntregi:
7 mod 3 = 1.
True
1 Solution
7 mod 3 = 2.
No solutions

- div returneaz partea ntreag a ctului a dou numere ntregi:


7 div 5 =2.
No solutions
7 div 5 = 1.
True
1 Solution

- operatorul de asignare := asigneaz unei variabile o valoare


%program format dintr-o regula
afisare(Value) :X := Value,
write("A fost folosit operatorul de asignare"),
nl,
write(" numarul = ", X),
write("\n ").
n fereastra Dialog, se folosete clauza afisare(48)astfel:
afisare(48).
A fost folosit operatorul de asignare
numarul = 48
True, 1 Solution

- operatorul relaional = are aceeai semnificatie ca n versiunea Turbo


Prolog [35]:
a) verific dac o variabil legat are valoarea unei variabile legate sau a
unei entiti
21

b) dac o variabil este nelegat, iar cellalt membru este o entitate sau un
obiect, atunci variabila este legat la obiect
c) dac un membru este variabil liber (nelegat), iar cellalt membru este
variabil legat, atunci operatorul leag variabila liber de obiectul asociat
variabilei legate.

1.2. Concepte de baz


Visual Prolog i alte versiuni de limbaje Prolog sunt bazate pe clauze logice
Horn, care vor fi descrise i exemplificate n seciunile urmtoare.
1.2.1. Clauze logice Horn
Clauza logic Horn = un sistem formal de raionament despre lucruri i
despre modul de relaionare a acestora.
Exemplu. n limbajul natural, un fapt se poate formula astfel:
Gheorghe este tatal lui Bogdan.
Ion este tatal lui George.
Lucrurile (persoanele)  Gheorghe, Bogdan
Relaia dintre ele  unul este tatal celuilalt
Formalizarea unui fapt adevrat, folosind o clauz logic Horn, se poate
efectua printr-un predicat:
tata("Gheorghe", "Bogdan").
tata(Ion, George).
tata  este un predicat cu 2 argumente
(primul argument = tatal celui de-al doilea argument)
Exemplu. n limbajul natural, se poate formula regula:
X este bunicul lui Z daca
X este tatal lui Y i Y este tatal lui Z
unde X, Y, Z sunt persoane
Formalizarea, folosind o clauz logic Horn, este urmtoarea:
bunic(X, Z):- tata(X, Y), tata(Y, Z).
22

Observaii:
- predicatele sunt: bunic, tata
- predicatele Prolog ncep numai cu liter mic
- variabilele n Prolog/ Visual Prolog ncep numai cu majuscul (exemple:
X, Y, Z, "Bogdan")
Operatorii Prolog utilizai n mod frecvent sunt urmtorii:
- simbolul :- este if
- operatorii logici , (and), ; (sau)
O comparaie ntre clauzele Horn i instruciunile din logica boolean
(cu dou valori de adevr: true i false) poate fi exprimat astfel (Tabel 1.1.):
Logica IF THEN
IF p AND q THEN r

Clauze Horn n Prolog


r :- p, q.
(unde p, q, r sunt
predicate/fapte)

Tabel 1.1. Interpretarea unei clauze Horn.

Observaie: Fcnd o paralel cu logica boolean, logica fuzzy este


bazat pe valori multiple, cuprinse ntre true (1) i false (0). Teoria
mulimilor fuzzy folosete logica multi-valoare i opereaz cu entiti
incerte, insuficient cunoscute.
O regul/clauz Prolog are forma general:
concluzie :premiza1,
premiza2,
...,
premizaN.
O teorie este o colecie de clauze (fapte i reguli).
Scopul unei teorii (goal clauses) este de a rspunde la ntrebri precum:
Cine este tatl lui Y?
Este W bunicul lui Y?
W este tatal lui Q?
tata(W, Q).
Soluia (rspunsul) poate fi: X, Da, NU, sau pot fi mai multe rspunsuri:
23

1.
2.

W
W

= "Gheorghe", Q = "Bogdan".
= "Ion", Q = "George".

Clauzele logice Horn pot fi:


predicate (fapte) = clauze
reguli = clauze
goals (scopuri) urmrite de motorul de inferen construit n Prolog
1.2.2. Baze de cunotine
Baza de cunotine dintr-un program Prolog este format din mulimea
regulilor i faptelor coninute de acesta [37].
Exemplu de program Prolog. Teoria colegilor de grup: (baza de
cunotine include 3 fapte, 1 regul). Comentariile ncep cu simbolul %.
% 3 fapte
inscris_in_grupa ("Alina", 2134).
inscris_in_grupa ("Stefan", 2134).
inscris_in_grupa ("Oana", 2135).
% 1 regula
colegi_grupa (X, Y):inscris_in_grupa (X, Z),
inscris_in_grupa (Y, Z).
% scopuri (intrebari)
% ?- colegi_grupa ("Alina","Stefan" ).
% ?- colegi_grupa ("Oana", "Stefan").
% ?- colegi_grupa ("Maria", "Radu").
% ?- inscris_in_grupa (X, 2134).
1.2.3. PIE (Prolog Inference Engine)
Se instaleaz aplicaia PIE din pachetul Visual Prolog:
C:\Program Files\Visual Prolog 7.3 PE\Visual Prolog Examples Setup
Se deschide aplicaia PIE, se compileaz ntregul proiect i se execut.
Folosire PIE (Prolog Inference Engine)
- este un interpretor Prolog execut fiecare comand, dup apsarea tastei
<ENTER>
- deschiderea editorului de programe Prolog: File (din aplicaia PIE) / New
24

- salvarea programului File (PIE) / Save as


- ncrcarea programului n motorul de inferen: Engine/Reconsult (F9)
- la fiecare modificare a programului, se salveaz i se ncarc n motorul de
inferen (Engine/Reconsult), dup care se scriu scopurile (ntrebrile) n
fereastra Dialog
- scopurile din fereastra Dialog sunt interpretate de motorul de inferen
Prolog PIE, la apsarea tastei <ENTER> (Figura 1.1)

Figura 1.1. Interpretorul PIE

Exemplu. Teoria relaiilor de familie:


S se defineasc predicatele tata, mama i regulile referitoare la
printe, bunica i bunic. Folosii predicate cu unul sau dou
argumente.
% fapte
tata("Ioan", "Liliana").
mama("Elena", "Liliana").
mama("Liliana", "Anda").
mama("Ana", "Elena").
25

tata("Vasile", "Ioan").
tata("George", "Mihai").
mama("Corina", "Mihai").
mama("Elisabeta","Corina").
tata("Dumitru", "George").
%reguli
parinte(X):tata(X, _); mama(X, _).
bunica(X,Y):mama(X, Z), mama(Z, Y);
mama(X, Z), tata(Z, Y).
bunic(X, Y):tata(X,Z), tata(Z,Y);
ma(Z, Y).

tata(X,Z), ma

Exemple de scopuri (ntrebri) din fereastra Dialog pot fi:


bunic(X,Y).
X
Y
X
Y
X
Y
3

= "Vasile".
= "Liliana".
= "Dumitru".
= "Mihai".
= "Ioan".
= "Anda".
Solutions

bunica(X,Y).
X = "Elena".
Y = "Anda".
X = "Ana".
Y = "Liliana".
X = "Elisabeta".
Y = "Mihai".
3 Solutions

parinte(X).
X
X
X
X
X
X
X
X
X
9

= "Ioan".
= "Vasile".
= "George".
= "Dumitru".
= "Elena".
= "Liliana".
= "Ana".
= "Corina".
= "Elisabeta".
Solutions
26

Tem: Dezvoltai teoria relaiilor de rudenie, definind predicatul frate()


n seciunea de fapte i predicatul familie(), n seciunea de reguli.

1.3. Controlul programelor


Visual Prolog este un limbaj de programare care:
- folosete clauze logice Horn
- se comport ca un sistem expert (trateaz fapte i reguli i ncearc s
rezolve scopuri) [11].
1.3.1. Interogarea bazei de cunotinte
Baza de cunotine a unui program Visual Prolog este format din
clauze Horn (fapte i reguli).
Compilatorul Visual Prolog urmrete un scop (o ntrebare, o
interogare), ncercnd s rspund la ntrebare, s proceseze interogarea
bazei de cunotine. Vor fi dou posibiliti:
- fail
- backtracking.
Exemplu. irul lui Fibonacci:
S se creeze o baz de cunotine Visual Prolog care s determine i s
afieze al n-lea numr din irul Fibonacci.
Formula de recuren pentru al n-lea termen al irului lui Fibonacci
este: xn = xn-1 + xn-2, unde n >= 3, x1 = 1 i x2 = 1.
Mulimea termenilor este { 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, . . }.
% irul lui Fibonacci
% fapte
fibo(1, 1). % x1 = 1
fibo(2, 1). % x2 = 1
% reguli
fibo(N, C):% xn = xn-1 + xn-2, n >= 3
N >= 3,
fibo(N-1, A),
fibo(N-2, B),
27

C = A + B,
write("fibo(", N, ") = ", C),
nl.
f(N):fibo(N, C), write("fibo(", N, ",", C, ") \n").
% exemple de scopuri
f(3).
f(4).
fibo(4, C).
fibo(5, C).
fibo(6, C).
fibo(7, C).
n fereastra Dialog, la interogrile (scopurile) exemplificate anterior, se
obin rezultatele urmtoare (Tabelul 2.1):
F(3).
1
1
fibo(3,2)

f(4).

fibo(4,
C).
1
fibo(3,2)
1
fibo(4,3)
fibo(3,2) C = 3.
fibo(4,3)

fibo(5,
C).
fibo(3,2)
fibo(4,3)
fibo(3,2)
fibo(5,5)
C = 5.

fibo(6,
C).
fibo(3,2)
fibo(4,3)
fibo(3,2)
fibo(5,5)
fibo(3,2)
fibo(4,3)
fibo(6,8)
C = 8.

1.3.2. Arborele de procesare asociat unui scop


Teoria rezolvrii unui scop
Motorul de inferen ncearc s rezolve un scop astfel [11]:
- un scop se descompune n subscopuri care, pentru a fi rezolvate, se
proceseaz n ordine de la stnga la dreapta, se urmresc n baza de
cunotine, considerndu-se cele dou cazuri:
- scopuri de tip fapte i
- scopuri de tip reguli.
- dac scopul este un fapt simplu, atunci se caut n baza de cunotine a
programului i returneaz True sau No solution
28

- dac scopul este o regul, atunci regula se nlocuiete cu faptele


corespunztoare, se caut n baza de fapte, se nlocuiesc variabilele i
returneaz rezultatul.
Dac la descompunerea unui scop n subscopuri, cel mai din stnga
subscop nu se rezolv, atunci nu se mai cerceteaz celelalte subscopuri i nu
se returneaz nicio soluie la problem.
Dac toate subscopurile returneaz True, atunci scopul iniial este True.
Arborele de execuie asociat unui scop
Se repet procedeul, descompunnd la fiecare pas un scop n subscopuri
pn se ajunge la scopuri de tip fapte simple, la a cror interogare, exit
rspuns n baza de fapte a programului.
Astfel, la execuia unei interogri a bazei de cunotine, se creeaz un
arbore de procesare, care are drept vrfuri, subscopurile ce compun scopul
urmrit spre rezolvare.
Compilatorul Prolog urmrete rezolvarea scopului i afiarea
rezultatelor, prin parcurgerea n Postordine a vrfurilor diferite de frunze
(parcurgerea nodurilor neterminale) a arborelui de procesare a scopului
iniial.
Exemplu
Pentru irul lui Fibonacci, arborii asociai interogrilor fibo(5,C) i
fibo(4,C) sunt arborii binari urmtori (prin reunirea rezultatelor, se obine
fibo(6,C)) (Figura 1.2):
fibo(5,C), C=5

fibo(4,3)

fibo(3,2)

fibo(3,2)

fibo(4,C), C=3

fibo(3,2)

fibo(6,C), C =8

fibo(5,5) fibo(4,3)

1
Fig. 1.2. Arbori asociai interogrilor f(5), f(4)

Se observ c:
29

fibo(5, C) se obine din: fibo(3,2), fibo(4,3), fibo(3,2), fibo(5,5)


fibo(4, C) se obine din: fibo(3,2), fibo(4,3)
fibo(6, C) se obine din:
fibo(5, 5) i fibo(4, 3) <==>
<==> (fibo(3,2), fibo(4,3), fibo(3,2), fibo(5,5)) i (fibo(3,2),
fibo(4,3), fibo(6,8))
Prin parcurgerea n Postordine a vrfurilor neterminale ale arborelui
asociat scopului fibo(6, C), obinem:
fibo(3), fibo(4), fibo(3), fibo(5), (fibo(3), fibo(4), fibo(6)
Comparaie ntre funcii, proceduri i predicate
- o funcie returneaz o singur valoare
- o procedur returneaz o valoare pentru fiecare parametru de ieire
- un predicat poate s returneze mai multe soluii, la un singur apel sau poate
s eueze (fail) [11].
1.3.3. Opiunile Fail i Backtracking
Fail
Un predicat poate s eueze atunci cnd nu exist niciun fapt sau regul
care s ajute la execuia lui [11].
Un scop poate s eueze atunci cnd nu exist nicio soluie n teoria
format din fapte i reguli.
Backtracking
Motorul de inferen PROLOG caut soluiile unei probleme, folosind
un algoritm de tip Backtracking i parcurgerea n adncime (DF - depth
first) a arborilor de execuie asociat scopului. Metoda Backtracking
realizeaz legatura dintre programarea procedural si programarea delarativ
[61].
Motorul de inferen ncearc s rezolve un scop, efectund cutarea
faptelor i regulilor de la stnga la dreapta i de sus n jos.
Motorul de inferen creeaz un pointer, un punct de Backtracking i l
poziioneaz pe al doilea fapt din baza de cunotine, apoi ncepe
compararea scopului cu faptele [11].
Exemplu. Fie teoria relaiilor de familie exprimat simplificat astfel:
30

mama("Eliana", "Dana").
tata("Petre", "Dana").
mama("Ioana", "Eliana").
bunic(X, Z):tata(X, Y),
tata(Y, Z);
tata(X, Y),
mama(Y, Z).
Simularea execuiei scopurilor
a) mama("Ioana", "Eliana").
- motorul de inferen creeaz un pointer de Backtracking i l poziioneaz
pe al doilea fapt,
- motorul de inferen ncepe compararea scopului cu primul fapt  nu se
potrivete cu scopul;
- pointerul de Backtracking se seteaz la al treilea fapt
- motorul de inferen compar scopul cu al doilea fapt i gsete
nepotrivire;
- motorul de inferen nu mai poate seta un alt pointer de Backtracking, ns
compar scopul cu ultimul fapt i gsete asemnare  returneaz Yes
b) mama("Ioana", X).
- motorul de inferen creeaz un pointer de Backtracking i l poziioneaz
pe al doilea fapt, ncepe compararea scopului cu primul fapt --> nu se
potrivete primul argument al faptului cu cel al scopului;
- pointerul de Backtracking se seteaz la al treilea fapt, compar scopul cu al
doilea fapt i gsete nepotrivire;
- motorul de inferen nu mai poate seta un alt pointer de Backtracking, ns
compar scopul cu ultimul fapt i leag (bound) variabila X de valoarea
"Eliana" i returneaz soluia X = Eliana
- cnd se gsete o soluie, motorul de inferen continu s caute i alte
soluii
c) considerm un scop format din 2 subscopuri:
mama(AA, BB), bunic(CC, BB).
- motorul de inferen creeaz un pointer de Backtracking i l poziioneaz
pe al doilea subscop bunic(CC, BB).
- motorul de inferen ncepe procesarea primului subscop, crend un al
doilea pointer de Backtracking activ pe faptul 2 al programului;
31

- se compar primul subscop mama(AA, BB)cu primul fapt  se leag


variabilele AA de "Eliana" i BB de "Dana" i returneaz soluia
AA = Eliana, BB = Dana
- motorul de inferen se ntoarce la primul punct de Backtracking, la
subscopul bunic(CC, BB) care, dup substituia variabilei BB cu valoarea
asociat, devine bunic(CC, "Dana").
- scopul de tip regul bunic(CC, "Dana") se inlocuiete cu primul set de 2
premize/fapte (tata(CC, Y) i tata(Y, "Dana")), care se urmresc n ordine
de la stnga la dreapta.
- se creeaz al treilea pointer de Backtracking i l poziioneaz pe a doua
premiz tata(Y, "Dana"), unde se va intoarce dup rezolvarea primei premize
tata(CC, Y)
- se caut potrivire pentru prima premiz tata(CC, Y). Se compar cu
tata("Petre", "Dana"), se nlocuiesc variabilele CC i Y:
CC = Petre, Y = Dana
- se activeaz punctul 3 de Backtracking - premiza tata(Y, "Dana") i
nlocuiete Y = Dana  se obine tata("Dana", "Dana")  False .a.m.d
Oprirea procedurii Backtracking cut (!)
Se poate opri execuia programului, dup ce este gsit o soluie, prin
folosirea predicatului cut (semnul de exclamaie !) [11].
Predicatul cut se folosete dup un alt predicat, la care s-a stabilit un
pointer de Backtracking i la care nu se mai dorete ntoarcerea execuiei
programului.
Exemplu:
r1 :- a, b, c.
r1 :- a, b, !, c.
Dac exist o soluie, o afieaz i nu se mai ntoarce la niciun punct de
Backtracking, definit pentru subscopurile a sau b.
Exemplu. Fie un grup de 4 fapte care furnizeaz informaii despre 4
profesori (3 de Informatic i 1 de Matematic: nume, specialitatea i tariful
pentru realizarea unui proiect de licen).
a) S se caute toi profesorii de Informatic care cer tarife mai mici
dect o valoare dat de la tastatur.
b) S se caute un profesor de Informatic care cere tarife mai mici dect
o valoare dat de la tastatur.

32

a) scrierea programului fr Cut(!) permite afiarea tuturor profesorilor care


ndeplinesc condiia
profesor("Petre", "Matematica", 50).
profesor("Ion", "Informatica", 50).
profesor("Ana", "Informatica", 44).
profesor("Cristina", "Informatica", 40).
cauta(Valoare):profesor(Name,"Informatica", Pret),
Pret < Valoare,
write(Name).
% X =1, cauta(45).
Exemple de scopuri folosite n fereastra Dialog:
cauta(47).
Anna
True
1 Solution
X =1, cauta(46).
Ana X = 1.
Cristina X = 1.
True
2 Solutions
b) programul care folosete Cut (!) afieaz prima soluie care ndeplinete
condiia
profesor("Pete", "Matematica", 50).
profesor("Ion", "Informatica", 50).
profesor("Ana", "Informatica", 44).
profesor("Cristina", "Informatica", 40).
cauta(Valoare):profesor(Name,"Informatica", Pret),
Pret < Valoare,
!,
write(Name).
Exemple de scopuri folosite n fereastra Dialog:

33

cauta(47).
Anna True
1 Solution
X =1, cauta(46).
Ana
X = 1.
1 Solution
Observaie: Dup afiarea unei soluii, se oprete execuia programului,
deoarece se folosete Cut (!).

1.4. Exerciii i probleme


1.4.1. Teoria datoriilor la banc
S se elaboreze teoria datoriilor la banc, folosind un program Visual Prolog
care conine urmtoarele:
- 3 fapte
are_cont(Persoana, Banca)
datorii(Persoana, Suma)
suma_cont(Persoana,Suma)
- 2 reguli
are_datorii(Persoana, Banca) pentru cazul cnd
suma datorat este > dect suma din cont
are_datorii(Persoana, Banca) pentru cazul cand
suma datorat este < dect suma din cont, se va afia un mesaj
- ntrebrile (scopuri)
Dana are cont la BancPost?
Ce suma are in cont Dana?
Ce suma este datoare Dana?
Dana are datorii la BancPost?
Marilena are datorii la BancPost?
%fapte
are_cont("Dana", "BancPost").
datorii("Dana", 1200).
suma_cont("Dana", 1700).
%reguli
% se verifica daca o persoana are datorii la banca
are_datorii(X, Y):34

are_cont(X, Y),
datorii(X, S1),
suma_cont(X, S2),
S1 > S2.
%daca persoana nu are datorii, se afiseaza un mesaj
are_datorii(X, Y):are_cont(X, Y),
datorii(X, S1),
suma_cont(X, S2),
S1 < S2,
write(X, " nu are datorii ").
% scopuri (intrebari)
% are_cont("Dana", "BancPost").
% suma_cont("Dana", X).
% datorii("Dana", Y).
% are_datorii("Dana", "BancPost").
% are_datorii("Marilena", "BRD").
1.4.2. Rezolvarea ecuaiei de gradul I
S se rezolve ecuaia de gradul I: a*x + b = 0, unde a i b sunt numere
reale date. S se scrie un predicat ecuatie1(A, B) care s ia n considerare
toate cazurile (discuie dup coeficienii A i B).
ecuatie1(A, B):A = 0,
B = 0,
write("\n o infinitate de solutii \n ").
ecuatie1(A, B):A = 0,
write("\n nu exista solutii \n ").
ecuatie1(A, B):X = -B/A,
write("\n solutia x = ", X, " \n ").
executa(A, B):write("\n Rezolvare - ecuatia de gradul I"),
ecuatie1(A, B).
1.4.3. Teoria bursei studeneti
S se scrie un program folosind interpretorul PIE, care s memoreze
fapte privind examenele i notele obinute n sesiunea de iarn, de ctre
35

studenii de la specializarea Informatic, anul III. Se consider c n sesiunea


de iarn sunt 3 examene.
Elaborai reguli, conform crora se vor acorda burse de dou tipuri:
- burs mic (200 lei), pentru studenii a cror medie a notelor obinute n
sesiunea de iarn este cuprins ntre 7.5 i 8.8
- burs mare (340 lei), pentru studenii a cror medie a notelor obinute n
sesiunea de iarn este mai mare strict dect 8.8
- studenii a cror medie a notelor obinute n sesiunea de iarn este mai
mica dect 7.5, nu primesc burs.
Programul Prolog se ncarc in motorul de inferen (meniul Engine/
opiunea Reconsult):
medie (X, Y, Z, M):M = (X + Y + Z ) /3.
bursa (M, Valoare):M < 7.5,
!,
Valoare = 0.
bursa (M, Valoare):M < 8.8,
!,
Valoare = 200.
bursa (M, Valoare):Valoare = 340.
persoana(Nume, X, Y, Z):% X, Y si Z = notele de la examenele
% din sesiunea de iarna
medie( X, Y, Z, M),
write(Nume, " are media la cele 3 examene: ", M),
bursa( M, Valoare),
(Valoare > 0, write("\n Bursa = ", Valoare));
(Valoare = 0, write("\n Nu are bursa "),
nl.
Interogrile folosite n fereastra Dialog:
persoana("Mircea",8, 5, 6).
Mircea are media la cele 3 examene: 6.3333333
Bursa = 0
36

True
1 Solution
persoana("Tanase",9, 9, 10).
Tanase are media la cele 3 examene: 9.333333
Bursa = 340
True
1 Solution
persoana("Diana",8, 10, 6).
Diana are media la cele 3 examene: 8
Bursa = 200
True
1 Solution
1.4.4. Teoria agendei telefonice
S se creeze o baz de cunotine pentru memorarea datelor ntr-o
agend telefonic (nume, telefon). S se scrie o regul de cutare a
telefonului unei persoane n agend.
1.4.5. Program PIE
S se creeze un program pentru evaluare didactic.
1.4.6. Program PIE
S se creeze un program care prezint analiza activitilor hoteliere. S se
foloseasc interfaa grafic.
1.4.7. Problema celor 4 specialiti
James, Tom, Bob i Jim tiu fiecare cte un singur i diferit limbaj de
programare (HTML, C++, Java, respectiv Prolog) i sunt specializai n cte
un domeniu diferit (matematic, fizic, chimie, biologie).
Se stiu urmtoarele:
a) cel care programeaz n Java e specializat n biologie
b) Tom nu tie nici Prolog, nici HTML i nu e specializat n matematic
c) James nu tie nici Prolog, nici HTML i nu e specializat n matematic
d) cel care e specializat n chimie nu programeaz n HTML
e) Bob e specialzat n fizic i nu programeaz n Prolog.
Ce limbaj de programare tie fiecare i n ce domeniu e specializat?

37

Bibliografie

1. AnHai Doan, Feng Niu, Christopher R, Jude Shavlik, Tuffy: Scaling


up Statistical Inference in Markov Logic Networks using an RDBMS,
The 37th International Conference on Very Large Data Bases,
Washington, 2011
2. Arvidsson, F.; Flycht-Eriksson, A.., Ontologies I, 2008
3. Charles Forgy, PhD, Sparkling Logic. Social Logic (Decision
Management), http://my.sparklinglogic.com, 2012
4. Christel Kemke, Expert Systems, University of Manitoba, 2005
5. Clancey,W.J., Notes on "Epistemology of a Rule-based Expert
System", Artificial Intelligence, 59: p. 191-204, Artificial Intelligence
in Perspective, 1993
6. Clancey William J., KNOWLEDGE ACQUISITION FOR
CLASSIFICATION EXPERT SYSTEMS, Heuristic Programming
Project Stanford University, Proceedings acm'84 Annual Conference,
The Fifth Generation Challenge, 1984
7. CLIPS/R2, Production Systems Technologies, Pittsburgh, PA, 2003
8. Costa Eduardo, Visual Prolog 7.3 for Tyros, 2010
9. D. J. Hand, Mannila Heikki, Smyth Padhraic, Principles of Data
Mining, MIT Press, Massachusetts Institute of Technology, USA,
2001
10.e2g Reference, Introducing the e2gLite Expert System Shell,
www.expertise2go.com, 2009
11.Eduardo Costa, Visual Prolog 7.3 for Tyros, 2010
12.Exsys Corvid Knowledge Automation Expert System Development
Manual, USA, http://www.exsys.com, 2011
13.Feigenbaum Edward, Expert Systems: Principles and Programming,
Fourth Edition, Stanford University, 1998
14.Feigenbaum, Edward A.; McCorduck, Pamela, The fifth generation :
artificial intelligence and Japan's computer challenge to the world,
Addison-Wesley, 1983
15.Gruber, Thomas R., A translation approach to portable ontology
specifications, Knowledge Acquisition 5 (2), pp. 199220, 1993
38

16.Hayes-Roth F., D. A. Waterman, D. B. Lenat, Building Expert


Systems, Artificial Intelligence Journal, vol. 25, no. 1, pp. 101-104,
1985
17.http://wiki.visual-prolog.com/index.php?title=Language_Reference
18.Hutter M , On the existence and convergence of computable universal
priors, Algorithmic Learning Theory, Springer, 2003
19.IBM WebSphere ILOG JRules V7.1 Getting started, IBM Corp, USA,
2010
20.Jackson Peter, Introduction to Expert Systems. 3rd ed., AddisonWesley, 1999
21.Jain Sanjay, Daniel Osherson, James Royer, Arun Sharma, Systems
that Learn: An Introduction to Learning Theory, The MIT Press,
Cambridge, Massachusetts, 1999
22.Joseph Giarratano, Gary Riley, Expert Systems - Principles and
Programming. 4th ed., PWS Publishing, Boston, MA, 2004
23.Karan.L. Mcgraw, Karan Harbison-Briggs, Knowledge Acquisition,
Principles and Guidelines Prentice-Hall International Editions, Pag. 1
27, 1989
24.Kendal, S.L.; Creen, M., An introduction to knowledge engineering,
London: Springer, 2007
25.Kock D. E., Expert Systems and knowledge acquisition, University of
Pretoria, E, 2003
26.Kowalski Robert, PREDICATE LOGIC AS PROGRAMMING
LANGUAGE, INFORMATION PROCESSING 74 NORTHHOLLAND PUBLISHING COMPANY, 1974
27.Livovschi L., Georgescu H., Sinteza i analiza algoritmilor, Editura
tiinific i Enciclopedic, Bucureti, 1986
28.Maresca Joseph S., Knowledge Acquisition for Expert Systems by
Hart (Artificial Intelligence Series), Publisher: Mcgraw-Hill(Tx); 2
Sub edition, 1992
29.Matignon Carole-Ann, Rete Algorithm Demystified, Decision
Management System, http://techondec.wordpress.com, 2011
30.Murthy S, Automatic construction of decision trees from data: A
multidisciplinary survey, Data Mining and Knowledge Discovery,
1998
31.Nstsescu C., Ni C., Rizescu Gh., Matematic Algebr, Manual
pentru clasa a IX-a, Editura Didactic i Pedagogic, Bucureti, 1980
32.Negnevitsky, Michael, Artificial Intelligence: A Guide to Intelligent
Systems, Addison Wesley, ISBN 0-321-20466-2, 2005
39

33.Matthew Richardson, Pedro Domingos, Markov Logic Networks,


University of Washington, U.S.A., 2006
34.Oprea Mihaela, GENERAREA AUTOMATA A REGULILOR PRIN
NVATARE INDUCTIVA, Revista Romna de Informatica si
Automatica,vol. 11, nr. 3, 2001
35.Oprea Mihaela, INTELIGEN ARTIFICIAL. PROGRAMARE
LOGIC I SISTEME EXPERT, vol. II, Editura Universitii din
Ploieti, 1999
36.Oprea Mihaela, Sisteme bazate pe cunotine Ghid teoretic i
practic, Editura MATRIX ROM, Bucureti, 2002
37.Oprea Mihaela, SISTEME EXPERT DE GESTIUNE * NDRUMAR,
Editura Universal Cartfil, 1998
38.Owen, James, World's fastest rules engine. Business rule management
systems, InfoWorld, 2010
39.Pham D. T., Afify A. A., A Simple Rule Induction Algorithm for
Supporting Decision Making, IEEE 2005
40.Pham D.T., Afify A.A., Machine learning: Techniques and trends,
Proceedings of the 9th International Workshop on Systems, Signals
and Image Processing, Manchester, UK, 2002
41.PROIECT AICSYS, Sistem informatic de monitorizare si control a
statiilor de epurare a apelor uzate prin utilizarea sistemelor de
distributie multi-agent si a unor algoritmi avansati de reglare
automata, Contract INOVARE 30/2007
42. Bratko lvan, PROLOG PROGRAMMING FOR ARTIFICIAL
INTELLIGENCE, Kardelj University, Stefan Institute Yugoslavia,
Addison-Wesley Publishing Company, 1986
43. Quilian M., Semantic memory, Semantic Information Processing,
1968
44. Quinlan Ross J., Kaufmann Morgan, C4.5 Programs for Machine
Learning (Description of C4.5 and ID3), 1993
45. RETE2, Production Systems Technologies, 1980
46. Schmidhuber J., Hierarchies of generalized Kolmogorov complexities
and nonenumerable universal measures computable in the limit,
International Journal of Foundations of Computer Science 13 (4):
587612, 2002
47. Shapiro Ehud, Concurrent Prolog MIT Press. 1987
48. Shapiro Ehud, The family of concurrent logic programming
languages ACM Computing Surveys. September 1989
49. Tams Horvth, Akihiro Yamamoto, Inductive Logic Programming,
Lecture Notes in Computer Science, 2003
40

50.Thomas Linder Puls, Carsten Kehler Holst, Visual Prolog Object


System, Report APPSEM II Workshop, Prolog Development Center
A/S, 2005
51.Thomas W. de Boer, A Beginners' Guide to Visual Prolog Version
7.2, Groningen, 2009
52.Tudor L., Bazele programrii n limbajul C++, Editura MATRIX
ROM, Bucureti, 2010
53.Van Edem M., Kowalski Robert, The semantics of predicate logic as
programming language, D.C.L. Memo No 73, University of
Edinburgh, 1974
54.***, Visual Prolog 7.3 Language Reference 2010, Prolog
Development Center A/S, http://www.visual-prolog.com
55. Waterman Donald A., A Guide to Expert Systems, Expert Systems,
Vol. 3, No 1, pp. 16-19, 1986
56.***, EZY Prolog Reference, EDMGROUP Australia, 2003
57.***, Visual Prolog 7.3 Personal Edition Help
58.***, Visual Prolog Language Reference/Built-in entities
59.***, Exsys Corvid Quick-Start Guide - Fundamentals & Tutorials,
2007
60. ***, Exsys Corvid Knowledge Automation Expert System
Development Manual, 2011
61.Vlada Marin, Curs online de Inteligen Artificial, Universitatea
Bucureti, www.unibuc.ro/prof/vlada_m/Artificial_Intelligence.php,
2011
62. Vlada Marin, Curs online de Inteligen Artificial, Universitatea
Bucureti, www.unibuc.ro/prof/vlada_m/Artificial_Intelligence.php,
Proiecte, 2011

41