Sunteți pe pagina 1din 8

Laborator 2 – Logică computaţională

Structura programelor în Prolog .


Rationament
Obiective
 Înţelegerea rolului pe care îl au faptele şi regulile
 Înţelegerea diferenţei dintre variabile şi constante
 Realizarea unor programe simple şi urmărirea raţionamentelor în ECLiPSe
pentru reguli.

Structura programelor în limbajul Prolog

În acest subcapitol vor fi discutate câteva aspecte legate de structura programelor în Prolog.
Pornim, pentru simplitate, de la programul folosit în referatul precedent, pe care îl vom analiza
mai în detaliu. Apoi vom considera şi alte exemple.

Exerciţiu:

Editaţi un fişier ex1L2.ecl care să includă instrucţiunile următoare. Compilaţi ex1L2.

bursa(alina). %alina are bursa


fapte
bursa(corina).
bursa(mihai).

student(ac,corina).
student(ac,alina). %alina este student la AC
student(ac,marius).
student(istorie,gabriela).
student(teatru,mihai).

locuitor(iasi,alina).% alina este un locuitor din iasi.


locuitor(timisoara,marius).

invitatieInternship(Y,X):-bursa(X),student(Y,X).
reguli %invitatie pentru internship
% - trimisa bursierilor X care studiaza la Y.

invitatiePrezentare(Z,Y,X):-locuitor(Y,X), student(Z,X).
%invitatie la conferinta de prezentare a unei companii:
% - trimisa studentilor X care studiaza la Y si
% locuiesc in Z.

Program Prolog ex1L2.ecl include clauze care definesc baza de cunoştinţe – fapte şi reguli.
Prin compilare, baza de cunoştinţe este încărcată în contextul de lucru. Execuţia va avea loc
când se va cere răspunsul la o întrebare. Răspunsul va fi obţinut de Prolog prin raţionament,
Laborator 2 – Logică computaţională

folosind baza de cunoştinţe existentă în contextul de lucru. De aceea, recomandarea este să se


şteargă contextul de lucru înainte de compilare (File/ClearTopLevel- vezi referatul
precedent).

.
Se observă în acest fişier că fiecare enunţ (clauză) se termină cu semnul (punct), iar
comentariile încep cu %. În fişier au fost indicate cele două tipuri de enunţuri ce pot fi utilizate
pentru formalizarea cunoştinţelor în programele Prolog: fapte şi reguli.

Aceste cunoştinţe sunt exprimate folosind predicate: bursa(X), student(X),


locuitor(X,Z).Predicatul P(X) este un enunţ care poate fi adevărat pentru anumite valori
ale lui X şi fals pentru alte valori ale lui X. Dacă X este cunoscut, atunci valoarea de adevăr a lui
P(X) este cunoscută. De exemplu, predicatul „X este bursier” (notat bursa(X)) devine
adevărat pentru X= alina. X este denumită variabilă – pentru ca i se permit valori diferite pe
durata raţionamentului.

ATENTIE:
În Prolog variabilele se deosebesc de ceilalţi termeni (constante, nume predicate) prin
faptul că numele lor începe cu litera mare sau _.

Faptele sunt propoziţii adevărate obţinute din predicate pentru cazuri particulare. De
exemplu:
 bursa(alina) se obţine din predicatul bursa(X), pentru X= alina;
 student(ac,corina) se obţine cu predicatul student(X,Y) pentru X= ac, Y=corina.
Cu alte cuvinte, prin fapte vom indica în ce situaţii ştim că un predicat devine
adevărat.
Aici, alina şi corina sunt constante. Spre deosebire de variabile, valoarea
acestora NU se va modifica pe parcursul execuţiei (raţionamentului).

Regulile sunt enunţuri care stabilesc legături între predicate. Sunt scrise conform sintaxei:

cap:-corp.

Le interpretăm în felul următor: capul este adevărat (regula este îndeplinită) dacă
ipoteza/ corpul are valoarea de adevăr „adevărat”. Corpul poate include mai multe
enunţuri conectate prin operatorii logici SI (notat ,) SAU (notat ;).

Exemplu:

cap corp

invitatieInternship(Y,X):-bursa(X) ,student(Y,X).
%invitatie pentru internship trimisa bursierilor X care
%studiaza la Y

Citim această regulă astfel:


Laborator 2 – Logică computaţională

invitatieInternship(Y,X) este adevărat pentru orice X care asigură că


bursa(X)este adevărat SI student(Y,X) este adevărat.

Aşa cum ne aşteptăm, regulile trebuie să aibă un caracter general, de aceea folosesc variabile.

Prin întrebare, cerem Prolog-ului să ne spună în ce condiţii un enunţ este adevărat.


 Dacă enunţul nu conţine variabile, atunci răspunsul este Yes sau No - ni se spune dacă
propoziţia din întrebare este adevărată sau nu pentru baza de cunoştinţe disponibilă –
există fapte şi reguli care o confirmă (este explicit inclusă ca faptă sau poate fi dedusă
din faptele şi regulile existente).

?-bursa(alina)
Yes (există o faptă)

?-invitatieInternship(ac,alina)
Yes (rezultat dedus din reguli şi fapte)

?-bursa(jack)
No (rezultatul nu poate fi dedus din regulile şi faptele disponibile)

 Dacă întrebarea foloseşte variabile, vom afla pentru ce valori enunţul din întrebare este
adevărat. Prolog afişează implicit doar primul caz găsit. Apoi, cu more, putem obţine pe
rând alte alternativel. Dacă nu găseşte nici un caz, răspunsul este No.

?-student(ac,X)
X= corina more
X= alina more
X= marius more
No

?-student(sport,X)
No

Exerciţii:

Verificaţi răspunsul la întrebările:


?-bursa(mihai).
?-bursa(Mihai).
Explicaţi.

Modul de execuţie a raţionamentelor în Prolog

Raţionamentele se efectuează parcurgând enunţurile de sus în jos, de la stânga la dreapta. Se


caută potriviri care să asigure că enunţul din întrebare este adevărat. Dacă nu se găseşte nicio
potrivire, răspunsul este No – care înseamnă că enunţul din întrebare nu este confirmat ca
Laborator 2 – Logică computaţională

adevărat în baza de cunoştinţe existentă. Dacă există potriviri, Prolog o afişează pe prima.
Următoarele potriviri pot fi obţinute cu more.

În laboratorul precedent am ilustrat raţionamente simple pentru întrebări care puteau fi


rezolvate investigând doar fapte. În continuare vom ilustra şi raţionamente care investighează
reguli. Cheia stă în faptul că enunţul din capul regulii este adevărat dacă este adevărat corpul.
Predicatele din corpul regulii se rezolvă de la stânga la dreapta.

Regulile folosite de Prolog la potrivire sunt enumerate mai jos. Raţionamentul va fi riguros
analizat în următoarele laboratoare, după ce vor fi explicate elementele teoretice necesare.
Aici oferim doar o descriere simplificată, mai intuitivă:

 Enunţurile sunt citite de sus în jos, de la stânga la dreapta. Dacă dintr-un punct se poate
continua cu mai multe variante, aceste variante sunt parcurse în ordinea sus în jos, de la
stânga la dreapta. În caz de eşec pentru una din variante, se revine (prin backtracking)
la precedenta potrivire (parţială) şi se investighează alternativele rămase.

 Potrivirile pot avea loc astfel:

o Două predicate se potrivesc dacă au acelaşi nume, acelaşi număr de argumente şi


argumentele lor se potrivesc – respectându-le poziţia
student(X,Y) se potriveşte cu student(ac, alina) dacă X=ac şi
Y=alina
student(X,Y) se potriveşte cu student(ac, X) dacă X=ac şi Y=X
(atenţie la ordinea argumentelor)!!
student(X) nu se poate potrivi cu bursa(X) sau student(X,Y)

o Două constante se potrivesc doar dacă sunt egale


alina se potriveşte cu alina
alina nu se potriveşte cu corina

o O variabilă se potriveşte cu o constantă, altă variabilă sau un predicat care nu


depinde de ea
X se potriveşte cu Z
X se potriveşte cu bursa(Z) şi nu se potriveşte cu bursa(X)
X se potriveşte cu alina

Considerăm ca exemplu întrebarea invitatieInternship(ac,Y).


Se observă ca prima potrivire este în linia invitatieInternship(Y,X):-
bursa(X),student(Y,X). pentru Y=ac şi X=Y. Regula este adevărată dacă este
adevărat corpul. Rezolvăm corpul de la stânga la dreapta, considerând ce potriviri am
obţinut deja, adică Y=ac şi X=Y. Înseamnă că trebuie să rezolvam bursa(Y) si apoi
student(ac,Y).
Pentru bursa(Y) se obţin, pe rând potrivirile (citind instrucţiunile de sus in jos):
Y=alina, cu această potrivire verific student(ac,alina) DA
Y= corina; cu această potrivire verific student(ac,corina) DA
Y=mihai, cu această potrivire verific student(ac,mihai) NU
Laborator 2 – Logică computaţională

invitatieInternship(Y, X) :-bursa(X),student(Y,X)
invitatieInternship(ac,Y)
:- bursa(Y),student(ac,Y)

bursa(Y)
bursa(alina) cu
verific student(ac,Y) cu Y=alina
gasesc student(ac,alina) DA

more
bursa(Y)
bursa(corina) cu
verific student(ac,Y) cu Y=corina
gasesc student(ac,corina) DA

more
bursa(Y)
bursa(mihai) cu
verific student(ac,Y) cu Y=mihai
gasesc student(ac,mihai) NU

Exerciţiu:

Explicaţi analitic şi verificaţi apoi (cu trace) în ECLiPSe răspunsul la întrebările:


invitatieInternship(istorie,X)
invitatiePrezentare(iasi,X,Z)
invitatiePrezentare(iasi,ac,X)
Adăugaţi fapte care să asigure mai multe răspunsuri posibile şi reluaţi.
Indicaţi o întrebare care foloseşte una din reguli şi are răspunsul No

Probleme propuse

1. Scrieţi un program în Prolog care să indice câteva relaţii de rudenie, completând


exemplul discutat la curs.

parent(fred, greta).
parent(greta, henry).
grandparent(X, Z):- parent(X, Y), parent(Y, Z)

Adăugaţi:
Laborator 2 – Logică computaţională

- o regulă care să indice sora/fratele lui X: o persoană diferită de X, care are un


părinte comun cu X.
- o regulă care să indice mătuşa/unchiul lui X: o persoană care este sora/fratele
unui părinte a lui X.
- o regulă care să indice un verişor pentru X: părintele verişorului este
mătuşă/unchi pentru X.

Adăugaţi câteva fapte suplimentare şi verificaţi prin întrebări.


Urmăriţi raţionamentul analitic şi cu trace.

2. Scrieţi un program în Prolog care să permită identificarea tipului de conifer, pe baza


caracteristicilor de mai jos. De asemenea, introduceţi clauze care să specifice cum poate
fi utilizat lemnul acestora.

brad molid pin zadă


Frunze Forma latite cu muchii
Lungime sub 3 cm peste 3 cm peste 3 cm sub 3 cm
Dispunere in plan circular cate doua în pâlc
Culoare au doua dungi verde uniform verde-albastrui verzi, toamna
albicioase sau verde devin gălbui
cenusiu
Duritate dure, dar nu dure şi inteapa dure, înteapa foarte moi, nu
inteapa înţeapă
Pastrate iarna da da da nu
Utilizare Mobila da da
lemn Constructii da da
Instrumente da
muzicale
Chimie da da
Celuloza da

Scrieţi
- o regulă care să indice că orice conifer diferit de zadă îşi păstrează acele pe toată
durata anului.
- o regulă care să indice că orice conifer folosit în chimie are scoarţa bogată în răşini.
- o regulă care să indice că orice conifer folosit pentru mobilă sau instrumente muzicale
are lemn preţios.

Verificaţi programul scriind întrebări pentru a afla:


- Ce tip de arbore poate fi folosit atât în chimie, cât şi în construcţii?
- Am în faţă o ramură cu ace lungi. Ce arbore poate fi?
- Ce arbori au ace foarte dure?
- Ce arbori au scoarţa bogată în răşini?
- Ce arbori au lemn preţios?
Etc.

Indicaţii:

 Scrierea faptelor
Plecând de la caracteristicile frunzelor, putem folosi un predicat
Laborator 2 – Logică computaţională

frunza(NumeCopac, Forma, Lungime,Dispunere,


CuloareSuplim, Duritate, Iarna)
care va permite introducerea faptelor considerând următoarele constante
acceptate:

NumeCopac Forma Lungime Dispunere CuloareSuplim Duritate Iarna

molid lat mare plan alb mare da


brad muchii mica circular cenusiu medie nu
pin simpla pereche albastrui mică
zadă grup galben
verde

Folosind mai multor fapte pentru acelaşi copac putem indica diferite instanţe
acceptate pentru acesta - de exemplu, la zadă faptul că frunzele pot fi verzi sau
gălbui.
frunza(zada, simpla, mica,grup, verde, mica, nu).
frunza(zada, simpla, mica,grup, galben, mica, nu).
Acest lucru este corect deoarece faptele vor fi în ordine verificate pentru
potrivire.
De asemenea, dacă este necesar, se poate indica faptul că o caracteristică este
irelevantă pentru un tip de copac (deşi poate fi relevantă pentru ceilalţi copaci),
folosind variabila anonimă _ care va permite orice substituţie la raţionament. De
exemplu, cu
frunza(zada, _, mica,grup, galben, mica, nu).
se acceptă orice formă pentru frunze.

Pentru a introduce faptele legate de utilitatea lemnului, putem folosi un predicat


utilizare(NumeCopac,Domeniu)
pentru care se pot folosi următoarele constante:
NumeCopac Domeniu

molid mobila
pin construcţii
brad chimie
zada celuloza
instrumente
Aşa cum a fost explicat pentru predicatul anterior, pentru un copac e pot
specifica multiple utilizări, folosind mai multe fapte:
utilizare(brad,mobila).
utilizare(brad,constructii).
utilizare(brad,chimie).

 Scrierea regulilor
Laborator 2 – Logică computaţională

cu_rasini(X): - X este folosit in chimie.


conifer(X) - X are frunze iarna sau X este zadă.
lemn_pretios(X) - X folosit la mobila sau X folosit la instrumente

 Scrierea întrebărilor
Dacă întrebările au clauze multiple, toate aceste clauze sunt rezolvate simultan
pentru răspuns. De exmplu,
utilizare(X,constructii), utilizare(X,chimie),
indică arborii care permit ambele utilizări - construcţii şi chimie.

Temă

Includeţi în programul de la problema 1 o regulă care să indice pentru cine X este nepot.

nepot(X,Y),

considerând ca X este nepot pentru bunici sau pentru unchi/mătuşi.

Reţine şi repetă pentru referatul următor

 Elaborarea unor programe în limbajul Prolog:


– structura programelor prolog: fapte şi reguli, constante şi variabile, predicate
 Raţionamente în limbajul Prolog:
– ordinea de parcurgere a clauzelor
– ce potriviri sunt permise: la predicate, variabile, constante.

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