Sunteți pe pagina 1din 37

Prolog

1. Elaborarea programelor in Prolog. Sintaxa


2. Raţionamente în Prolog – versiunea simplificată
3. Folosirea operatorilor
4. Folosirea listelor
5. Reguli recurente
Prolog

1. Elaborarea programelor in Prolog. Sintaxa Prolog


- Reguli de scriere a bazei de cunoştinţe şi a
întrebărilor
- Diferența dintre limbaje imperative și descriptive
2. Raţionamente în Prolog – versiunea simplificată
3. Folosirea operatorilor
4. Folosirea listelor
5. Reguli recurente
Elaborarea programelor in Prolog. Sintaxa Prolog

Programul include clauze


o fapte parent(fred, greta).
predicat_de_baza(constante). %fred parinte pentru greta

o reguli parent(greta, henry).


cap: - corp.
predicat
predicate separate
prin virgula pentru SI grandparent(X,Z):-
parent(X, Y), parent(Y, Z).
/*X bunic pentru Z*/
După compilare se transmit întrebări pentru interpretor:
o întrebare ? – predicat1, predicat2.

Comentarii –
incep cu %
sau sunt incadrate intre /*si */
Elaborarea programelor in Prolog

Cum stabilesc faptele și regulile?


Pas. 1. Definesc predicatele pentru fapte si scriu faptele.
Pas. 2. Definesc predicatele pentru reguli si se scriu regulile.
Pas 3. Scriu întrebările
Pas 4 Verific raționamentul (folosind eventual Trace, spy
etc.) pe cazuri de test diferite, relevante
Elaborarea programelor in Prolog

Cum stabilesc faptele și regulile?


Pas. 1. Predicate pentru fapte.
o Ce cunosc?

- faptele indică informaţii pe care le cunoaştem, nu le


deducem

– la argumentele predicatelor vom folosi constante, nu


variabile.
Elaborarea programelor in Prolog

Cum stabilesc faptele și regulile?


Pas. 1. Predicate pentru fapte.
o Stabilește prototipul predicatului, valorile permise pentru
constante si apoi scrie faptele (înlocuind variabilele cu
constante)

o Să poți spune TOATE informațiile, cazurile particulare știute

Poți organiza întâi informațiile într-un tabel – vezi exemple la


laborator
Elaborarea programelor in Prolog

Cum stabilesc faptele și regulile?


Pas. 1. Se găsesc predicate care să permită introducerea
faptelor.
Exemple

• Cărtile dintr-o biblioteca:


carte(Titlu, AnAparitie, Autor, ISBN, NrExemplare, Raft) – Raft:r1,r2,...

carte(joculLuiEnder, 1994, orsonScottCard, 9735690497, 20,r1)


carte(floriPentruAlgernon, 1959, danielKeyes, 9780151315109,10,r2)
Titlu An aparitie Autor ISBN Nr exemplare Raft
Numele cărții fara Numar natural prenumeNume Codul numeric Numar r1, r2,
spatii fara spatii sau - natural r3
Elaborarea programelor in Prolog

Cum stabilesc faptele și regulile?


Pas. 1. Se găsesc predicate care să permită introducerea
faptelor.
Exemple

• Medicii dintr-o clinica si orarul consultațiilor


medic(Nume,Grad,Specialitate)
cabinet(Specialitate, Zi, OraStart, OraStop,Medic)
medic(ionIonescu,primar,orl).
cabinet(orl,luni,10,14,ionIonescu).
Nume, Medic Grad Specialitate Zi Ora start/ stop
prenumeNume primar, specialist, oftalmologie, luni, marti, Numar natural
rezident orl etc.
.
Elaborarea programelor in Prolog

Cum stabilesc faptele și regulile?


Pas. 1. Se găsesc predicate care să permită introducerea
faptelor.
Exemple

• Flori – recomandari de ingrijire


floare(Nume,CondițiiLumina,CondițiiSol,ConditiiUmiditate)

Nume ConditiiLumina CondițiiSol ConditiiUmiditate


ficus, orhidee, umbra, soare, nisipos, argila, turba, crescuta, medie, scazuta
oleandru, etc. moderat universal
Orhidee- sol turba, soare, umiditate crescută
Ficus- sol universal, soare, umiditate medie
Oleandru – sol universal, soare, umiditate ridicata
Elaborarea programelor in Prolog

Cum stabilesc faptele și regulile?


Pas. 2. Se găsesc predicate pentru reguli si se scriu regulile.
o Regulile indică legături între predicate.

cum interpretez?

m(X):- p(X), r(X), z(x). m(X):- p(X);r(X).

dacă p(X) adevărat si r(X) adevărat și dacă p(X) adevărat sau r(X) adevărat,
z(x) adevărat, atunci m(X) adevărat atunci m(X) adevărat

p(X), r(X) si z(X) sunt predicate folosite la definirea faptelor


sau definite prin alte reguli.
Elaborarea programelor in Prolog

Cum stabilesc faptele și regulile?


Pas. 2. Se găsesc predicate pentru reguli si se scriu regulile
cum interpretez? m(X):- p(X),r(X),z(x).
la întrebarea ?-m(X) vom primi pe rând toate posibilele potriviri –
adică toate valorile X pentru care pot găsi simultan adevărat p(X),
z(x) și r(X).

potrivirea se caută in ordine pentru subscopuri, de la


stânga la dreapta (întâi p(X), apoi r(X) etc.)
Elaborarea programelor in Prolog

Cum stabilesc faptele și regulile?


Pas. 2. Se găsesc predicate pentru reguli si se scriu regulile
cum interpretez? m(X):- p(X); r(X).
la întrebarea ?-m(X) vom primi pe rând toate posibilele potriviri –
adică toate valorile X pentru care pot găsi adevărat p(X), apoi toate
valorile X pentru care pot găsi adevărat r(X)

potrivirea se caută in ordine pentru subscopuri, de la


stânga la dreapta (întâi p(X), apoi r(X))
Elaborarea programelor in Prolog

Cum stabilesc faptele și regulile?


Pas. 2. Se găsesc predicate pentru reguli si se scriu regulile
Capul unei reguli - un singur predicat

o variabilele să permită:
 pasarea tuturor informațiilor de intrare necesare
 obținerea răspunsurilor sau a unor informații intermediare
 scrierea flexibilă a unor întrebări simple
forme cât mai generale – se folosesc cât mai puține
predicat_Cap(VarIn1,
constante
VarIn2, VarOut, VarAux)
Elaborarea programelor in Prolog

Cum stabilesc faptele și regulile?


Pas. 2. Se găsesc predicate pentru reguli si se scriu regulile
- zilele în care există medic primar la oftalmologie
aflaZi(Zi):- medic(Nume,primar,oftalmologie), Zi – pentru rezultat

cabinet(ofltalmologie, Zi, OraStart, OraStop,Nume).

aflaZi(Zi, Grad,Specialitate):- medic(Nume,Grad, Specialitate),

cabinet(Specialitate, Zi, OraStart, OraStop,Nume).

aflaZi(Zi, Grad,Specialitate):- medic(Nume,Grad, Specialitate),

cabinet(Specialitate, Zi, _, _,Nume).

medic(Nume,Grad,Specialitate)
cabinet(Specialitate, Zi, OraStart, OraStop,Medic)
Elaborarea programelor in Prolog

Cum stabilesc faptele și regulile?


Pas. 2. Se găsesc predicate pentru reguli si se scriu regulile
- orarul pentru medici primari la oftalmologie

aflaOrar(Zi, OraStart, OraStop, Nume, Grad, Specialitate):-

medic(Nume,Grad,Specialitate),

cabinet(Specialitate, Zi, OraStart, OraStop,Nume).

medic(Nume,Grad,Specialitate)
cabinet(Specialitate, Zi, OraStart, OraStop,Medic)
Elaborarea programelor in Prolog

Dacă sunt folosite mai multe variabile


pentru capul regulii, aceeași regulă
Cum verific? permite multe întrebări
• această caracteristică este unul din
Pas. 3. Pun întrebările avantajele majore ale Prologului

Să surprindă cazurile de interes

– pentru capul regulii se particularizează anumite variabile:

?-aflaOrar(Zi, OraStart, OraStop, Nume, primar, orl).

?-aflaOrar(Zi, OraStart, OraStop, Nume, primar, oftalmologie).

?-aflaOrar(luni, OraStart, OraStop, Nume, primar, oftalmologie).

?-aflaOrar(luni, OraStart, OraStop, ionIonescu, Grad, Specialitate).


Elaborarea programelor in Prolog

Cum verific?
Pas. 4. Verific/monitorizez raționamentul
Cu Trace pe pot urmări toate potrivirile – util pentru depanarea
programelor mai complexe (”Creep”- pas cu pas)

Cu Spy – pot pune breakpoint pentru potriviri cu anumite


predicate (continuare cu ”Leap”)
Recomandare: scrie pe o
aflaZi(Zi, Grad,Specialitate):- linie un singur predicat
pentru urmărire simplă
medic(Nume,Grad, Specialitate), in Trace

cabinet(Specialitate, Zi, _, _,Nume).


Elaborarea programelor in Prolog

Cum verific?
Pas. 4. Verific/monitorizez raționamentul
Elaborarea programelor in Prolog

Cum verific? Pas. 4. Monitorizare – Trace & Creep


Elaborarea programelor in Prolog

Cum verific? Pas. 4. Monitorizez raționamentul – Spy & Leap


Elaborarea programelor in Prolog

Exerciții
Călătorii https://europa.eu/european-union/about-eu/countries_en

Indicăm tari care fac parte din UE


Indicăm tari care fac parte din Schengen
Indicăm acorduri de călătorie stabilite de UE: - cu ce țara, cu ce tip de act se
călătorește (fără, CI sau pașaport, doar pașaport), dacă este necesară viza (da-
luată anterior, da- luată la graniță, nu- dar cu formular de autorizare acces, nu).
Indicăm acorduri suplimentare stabilite individual de anumite tari
Pentru un cetățean al unei tari indicam cum poate calatori in alat tara
Elaborarea programelor in Prolog

Exerciții
Medicamente
Indicam compoziția unor medicamente, contraindicații. Pentru o anumita boala
indicam ce substanțe active sunt indicate. Pentru un pacient cu afecțiuni
cunoscute alegem medicamente potrivite.
COLDREX: paracetamol, fenilfedrina, vitamina_C. Contraindicatii HTA, diabet
FERVEX: paracetamol, feniramina, vitamina_C. Contraindicatii
NUROFEN RACEALA SI GRIPA: ibuprofen, pseudoefedrina. Contraindicatii: astm,
boli_hepatice, boli_renale.
MODAFEN: ibuprofen, pseudoeedrina. Contraindicatii: astm, boli_hepatice,
boli_renale, HTA, diabet.
Elaborarea programelor in Prolog

Exerciții
Reciclare deșeuri
Pentru mai multe articole indicam materialul din care sunt fabricate.
Indicam culorile pentru recipientele stocare a deșeurilor (albastru – hârtie,
galben- plastic, roșu-metal, verde-sticlă, gri-menajer)
Indicam reguli pentru alegerea culorii recipientului de stocare a deșeurilor
Elaborarea programelor in Prolog

Diferenţa faţă de limbaje imperative Limbaj imperative (C, etc.)


Initializez :
Limbaj descriptive - Prolog tari[N] tablou cu tarile
oras(ro, cluj). orase[M] tablou cu orasele
oras(ro, iasi).
om[K] tablou cu persoanele
oras(uk, londra).
oras(fr, paris).
oras(fr, lyon). Stabilesc legaturi intre tablouri:
orasTara[M]:orasTara[i]=j - oras[i] este din
locuitorOras(iasi, ana).
locuitorOras(iasi, mihai).
tara[j]
locuitorOras(cluj, marius). locOras[K]: locOras[i]=j - om[i] este din
oras[j]
locuitorTara(X,Y):-
locuitorOras(Z,Y),
oras(X,Z). Pentru i=0:K-1
Daca om[i] == numele cautat
afla oras: j= locOras[i], afiseaza oras[j]
?- locuitorTara(Y,ana). afla tara: p=orasTara[j], afiseaza tara[p]
?- oras(fr,X).
Pentru i=0:N-1,
Daca tari[i]== numele cautat
Pentru j=0:M-1
Daca orasTara[j]==i, raspuns!
oras[j]
Elaborarea programelor in Prolog
Diferenţa faţă de limbajele imperative
Comparatie Limbaj descriptiv [Prolog] Limbaj imperativ [C, C++]

Clauze care prezintă ce se Instrucţiuni care modifică


ştie despre problema: fapte si direct conţinutul variabilelor şi
Conținut
reguli indică explicit cum să fie
rezolvată problema

Programe
+ -
Compactitate
Fiecare întrebare rezolvată
separat cu instrucțiuni in plus
Simplitate în - +
elaborare
Uneori greu de găsit regulile Multe exemple
Elaborarea programelor in Prolog
Diferenţa faţă de limbajele imperative
Comparaţie Limbaj descriptiv [Prolog] Limbaj imperativ [C, C++]

Încărcare faptelor şi regulilor în Transformarea instrucţiunilor în


Compilare
memoria de lucru a Prolog cod obiect (fișier *.obj)

Interpretor. După linkeditare


Răspunsul se obţine folosind
Se execută un fişier executabil care
Prolog.
poate fi executat de sine-stătător.
Execuţie Răspuns la întrebări –prin potriviri Se urmăreşte secvenţa de paşi
– raţionament specific uman rezultată din instrucţiuni fără alt
raţionament
Dificultăți la parcurgerea unui
număr mare de fapte şi reguli
Sintaxa Prolog - Tipuri de termeni permişi
Exemple:
Atomi:
aAb124_5 logic
. şir de caractere litere, cifre şi _, care începe cu o litera
curs1 anul_I_AC
mică
SAU
. şir de caractere speciale + - * = < > : =< >=
SAU
. şir de caractere litere, cifre, semne de punctuatie şi _, ‘Acesta este cursul de
plasat intre ‘ ‘ LC.’
SAU
. numere (uneori considerate un tip de termen distinct) –
nu in EcliPseProlog 190 -123
 de obicei există implementare DOAR pentru
numere întregi
Sintaxa Prolog - Tipuri de termeni permişi

Exemple:
Variabile AAb124_5 Logic Curs1

. sir de caractere litere, cifre şi _, care începe cu o litera _anul_I_AC

mare sau _ in clauza grandparent(X,Y)


X Y sunt variabile

. exista variabila de tip anonim _ carte(miculPrint,exupery,100).


(care poate acceptă orice substituţie, valoarea ei nu %nume carte, autor, nr exemplare

contează)
tara(franta,exupery).
%tara origine, scriitor

refT(X,Y):-
carte(X,Z,_), tara(Y,Z).
%tara Y pentru autorul cartii X
Sintaxa Prolog - Tipuri de termeni permişi

Exemple:
Funcţii (termeni compuşi)
. funcţie („functor”) cu argumente, separate prin virgule, grandparent(X,Z)
dar fără spaţiu înainte de ( student(ac, X)

. argumentele pot fi orice atom, variabilă, funcţie f(X, h(X, _),1)


'numeStudent'(alina)

student este atom


student(ac,X) este termen compus
Sintaxa Prolog – Sintaxa predicatelor

Exemple:
Predicate
o formate cu termeni compuşi, atomi parent(greta, fredy).

house.

friend(greta, X).

Predicate fără variabile = predicate de bază („ground term”) parent(greta, fredy).


house

Aritate = număr argumente

Notatie: parent/2, friend/2, house/0


Sintaxa Prolog – Sintaxa predicatelor
Exista şi predicate predefinite (vezi în Predicates /Imported)

. numele lor nu trebuie folosit!


. depind de implementarea de Prolog folosită (uzual sunt puţine, noţiunile
trebuie definite de programator!!)

Exemple

fail/0 false/0, true/0

write/1 – afişează mesaje in fereastra de ieşire ?-write(‘Sunt student la AC.’).

nl - – trecere la o noua linie in fereastra de iesire ?-atom(student).


?-atom(Student).
?-var(Student).
atom/1, compound/1, var/1 – verifica dacă tipul
termenului este corect

=/2 permite scrierea X = Y în loc de =(X,Y) brother(X,Y):-


parent(Z,X),
\= /2diferit parent(Z,Y),
male(X),
X \= Y.
Sintaxa Prolog
Predicate predefinite in

Tools/Predicate Browser Predicates/Imported


Sintaxa Prolog – Exemplu

oras(ro, iasi).
oras(uk, londra). ECLiPSe cere ca toate clauzele
oras(fr, paris). corespunzătoare aceluiasi predicat
sa fie in linii succesive
oras(fr, lyon).
oras(ro, cluj).
locuitorOras(iasi, ana).
locuitorOras(iasi, mihai).
locuitorOras(cluj, marius).
locuitorTara(X,Y):-locuitorOras(Z,Y), oras(X,Z).

?- locuitorTara(Y,ana).
?- oras(fr,X).
Sintaxa Prolog – Exerciţii

o Care din variantele de mai jos indică atomi valizi în Prolog?


y
friends(mary, adam)
Adam
_curs1
'Ok'
sunt_bucuros

o Care din variantele de mai jos indică variabile admise în Prolog?


B
Ana
P
'Ok'
grupa_1101
_
_an1
Sintaxa Prolog
Exerciţii
Magazin mașini
Indicăm pentru anumite mașini caracteristicile
o valori acceptate mic/medie/mare: volum portbagaj,
consum, interval de timp pentru accelerare până la
100km/h, înălțime față de sol
o valori acceptate da/nu: opționale - climă, ACC, multimedia,
o alte tipuri de valori acceptate: tip combustibil
(benzina/motorina/electric/hibrid)
Indicăm reguli pentru categorii de mașini – cu grad redus de
poluare, sport, utilizare frecventă la drumuri lungi, familie, teren
etc.
Alegem mașini pe baza unor categorii: urban și familie, etc.
Sintaxa Prolog

Exerciţii
Cod ținuta
Indicăm tipurile de coduri vestimentare: black_tie, smart_casual,
casual, sport
Indicăm pentru anumite evenimente (dineu ambasada, nunta,
curs, fitness, plimbare parc, conferința) codul vestimentar potrivit.
Indicăm descrieri pentru fiecare cod vestimentar (dacă un articol
e potrivit pentru acel cod) – pentru masculin/feminin
Indicăm pentru o anumită persoana ce articole ar fi potrivite când
merge la un anumit eveniment.
Elaborarea programelor Prolog. Sintaxa
Repetă
Cum definesc faptele și regulile?

Cum monitorizez efectuarea raționamentului?


RECAPITULARE

Reguli de scriere pentru atomi, variabile, termeni compuși

Reguli de scriere pentru fapte, reguli, întrebări, comentarii

Întrebări şi exerciţii:

Cum deosebim atomii de variabile?

Ce înseamnă variabila _ ?

Care este terminatorul pentru instrucţiuni? Cum este interpretat % ?

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