top.gif

pllab1.gif

Fundamentele Prolog-ului (fapte, reguli)
Un program Prolog este o colectie de clauze. Acestea pot fi de doua tipuri: fapte sau reguli.

Fapte Prolog
Un fapt precizeaza o proprietate a unui obiect sau exprima o relatie dintre mai multe obiecte. De exemplu proprietatea florilor de a fi frumoase se poate exprima in Prolog prin urmatorul fapt:
frumoase(flori).
iar preferinta pe care o are Dan pentru Maria se poate exprima prin:
place(dan,maria).
Forma generala prin care pot fi descrise faptele este:
relatie(obiect_1,obiect_2,...,obiect_n).
unde 'relatie' reprezinta un nume pentru relatia dintre obiectele 'obiect_1,...,obiect_n'. Programatorul este cel care stabileste numele relatiei, precum si semnificatia ei. Astfel faptul ca Dan o place pe Maria se poate exprima si prin
place(maria,dan).

Mai facem observatia ca faptele introduse in program sunt considerate a fi adevarate, adica informatia pe care o furnizeaza este cunoscuta de sistem, fara ca acesta sa verifice daca este o relatie reala. De exemplu, faptul
verde(zapada).
este corect din punct de vedere sintactic, dar nu exprima o proprietate reala a zapezii.

Numele pentru relatii si obiecte trebuie sa satisfaca urmatoarele reguli:

a) numele de relatie trebuie sa inceapa cu o litera urmata de orice combinatie de litere cifre sau _. Este recomandat ca primul simbol sa fie litera mica, iar numele sa fie ales astfel incat sa sugereze relatia reprezentata;

b) numele de obiecte trebuie sa inceapa cu litera mica, urmata de oricate caractere.

Colectia de fapte se mai numeste baza de date(database).

Exemple:

Pentru reprezentarea proprietatilor si relatiilor de mai jos
Iarba este verde.
Ioana este studenta.
Dan are masina.
Ionut este fiul lui Dan si al Mariei.
se pot declara urmatoarele fapte:
verde(iarba).
student(ioana).
are(dan,masina).
fiu(ionut,dan,maria).

Reguli Prolog
O regula Prolog exprima o relatie de dependenta intre fapte si permite obtinerea unor informatii noi pe baza celor deja cunoscute.

Forma generala prin care poate fi descrisa o regula este:
Capul_regulii if Corpul_regulii
sau
relatie(obiect,obiect,...,obiect) if
relatie(obiect,obiect,...,obiect) and
....
relatie(obiect,obiect,...,obiect).

semnificatia fiind ca daca toate relatiile din corpul regulii sunt adevarate atunci este adevarata si relatia din capul regulii.

De exemplu cunoscand ca Maria le place pe Elena si pe Ioana, iar lui Dan ii place tot ce-i place si Mariei, atunci putem scrie faptele:
place(maria,elena).
place(maria,ioana).

si urmatoarea regula:
place(dan,Cineva) if place(maria,Cineva).
In corpul regulii putem avea si relatii legate prin disjunctie (or) cu semnificatia ca relatia din capul regulii este adevarata daca este adevarata una din relatiile din corpul regulii.

De exemplu fraza: 'Lui Dan ii plac lucrurile scumpe sau ii place tot ce-i place Mariei' se poate exprima prin
place(dan,Ceva) if scump(Ceva) or place(maria,Ceva).

Regula de mai sus se mai poate scrie si astfel
place(dan,Ceva) if scump(Ceva).
place(dan,Ceva) if place(maria,Ceva).

Observatie
Urmatoarele simboluri sunt echivalente:
if :-
and ,
or ;

Variabile, variabile anonime
In TP numele de variabile trebuie sa inceapa cu majuscula sau _, urmate de oricate litere, cifre sau _. De exemplu: Cineva, PERSOANA, Un_om, X.

O variabila care nu are valoare se numeste libera; valoarea o poate primi prin unificare, devenind variabila legata (ATENTIE: variabilele nu pot fi folosite pentru stocarea informatiei!).

Variabila anomima (reprezentata prin _) se foloseste atunci cand valoarea la care se leaga nu este folosita.

Constante
In TP sunt constante numele de obiecte si numerele (intregi sau reale). Exemplu: maria, dacia, 13, 18.5.

Interogarea bazei de date
Faptele si regulile contin informatii despre relatiile dintre obiecte. Intrebarile pe care le punem sistemului se numesc 'goals' (= scopuri).

Forma generala a unui scop este:
relatie(obiect,obiect,...,obiect) and
....
relatie(obiect,obiect,...,obiect).
Scopurile pot fi interne sau externe. Un scop intern se declara in sectiunea care incepe cu 'goal', iar unul extern se introduce in fereastra de dialog, dupa rularea programului.

Exemple
Exemplul 1



/*********
Preferinte
***********/


predicates
place(symbol,symbol) % primul il place pe al doilea

clauses
place(elena, tenis).
place(maria, inot).
place(maria,volei).
place(ion, fotbal).
place(mihai, baschet).
Exemplul 2



/******************
Program cu parintii
*******************/


predicates
masc(symbol)
fem(symbol)
parinte(symbol, symbol) % primul este parinte pentru al doilea

clauses
masc(vasile).
masc(alex).


fem(elena).
fem(mariuta).


parinte(vasile, alex).
parinte(elena, alex).
parinte(alex, mariuta).
Exemplul 3



/*****************************************************************************
Autovehicule pentru care stiu: marca, kilometrajul, vechimea, culoarea, pretul
*****************************************************************************/


predicates
masina(symbol,real,integer,symbol,integer)
camion(symbol,real,integer,symbol,integer)


clauses
masina(chrysler, 130000, 3, rosu, 48).
masina(ford, 90000, 4, gri, 100).
masina(datsun, 8000, 1, rosu, 120).


camion(ford, 80000, 6, bleu, 32).
camion(datsun, 50000, 5, galben, 80).
camion(toyota, 25000, 2, negru, 100).
Exemplul 4



/*********************************
Program cu parinti, mame si bunici
**********************************/


predicates
masc(symbol)
fem(symbol)
parinte(symbol, symbol) % primul este parinte ptr al doilea
mama(symbol,symbol) % mama celui de al doilea
bunica(symbol,symbol) % bunica celui de al doilea


clauses
masc(vasile).
masc(alex).


fem(elena).
fem(mariuta).


parinte(vasile, alex).
parinte(elena, alex).
parinte(alex, mariuta).


mama(Persoana,Copil) if parinte(Persoana,Copil) and fem(Persoana).


bunica(Bunica,Nepot) if parinte(Persoana,Nepot) and mama(Bunica,Persoana).
Exemplul 5



/**************************
Cum iti poti cumpara masina
**************************/


predicates
cumpara(symbol, symbol) % primul il cumpara pe al doilea
persoana(symbol)
masina(symbol)
place(symbol, symbol) % primul il place pe al doilea
de_vanzare(symbol)


clauses
cumpara(X, Y) :-
persoana(X),
masina(Y),
place(X, Y),
de_vanzare(Y).


persoana(maria).
persoana(iulia).


masina(dacia).
masina(oltcit).
masina(lastun).


place(maria, dacia).
place(iulia, pizza).
place(iulia, fiat).


de_vanzare(pizza).
de_vanzare(dacia).
de_vanzare(oltcit).

Probleme
1. Se dau urmatoarele predicate:
	tata(X,Y)	/* X este tatal lui Y */

mama(X,Y) /* X este mama lui Y */
masc(X) /* X este de sex masculin */
fem(X) /* X este de sex feminin */
Sa se scrie reguli Prolog pentru urmatoarele relatii:
	parinte(X,Y)    /* X este un parinte al lui Y */.

este_mama(X) /* X este mama */
este_tata(X) /* X este tata */
este fiu(X) /* X este fiu */
sora(X,Y) /* X este sora lui Y */
bunic(X,Y) /* X este bunicul lui Y */
matusa(X,Y) /* x este matusa lui Y */
2. Se da o baza de date pentru reprezentarea cunostintelor despre carti, editurile care le publica si magazinele care vand carti, cu fapte de tipul:
	vinde(Mag,Edit)  /* magazinul Mag vinde carti ale editurii Edit */

carte(Tit,Edit) /* titlul Tit este editat de editura Edit */
deschis(Mag) /* daca magazinul Mag este deschis */
inchis(Mag) /* daca magazinul Mag este inchis */
Sa se obtina raspunsuri la intrebari de tipul:
	- Cine publica "Mara"?

- Ce magazine vand carti de la Nemira?
- De unde pot cumpara "Fratii Jderi"?
- Exista vreun editor care a publicat atat "Fratii Jderi" cat si "Mara"?
- Exista doua magazine care vand atat "..." cat si "..."?
3. Modificati programul din 'Exemplul 5' astfel incat cumpararea unei masini sa se faca numai daca pretul de vanzare nu depaseste economiile cumparatorului.

 

bar.gif

Main Page