Documente Academic
Documente Profesional
Documente Cultură
Î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:
student(ac,corina).
student(ac,alina). %alina este student la AC
student(ac,marius).
student(istorie,gabriela).
student(teatru,mihai).
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ă
.
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.
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
Aşa cum ne aşteptăm, regulile trebuie să aibă un caracter general, de aceea folosesc variabile.
?-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:
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.
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.
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:
Probleme propuse
parent(fred, greta).
parent(greta, henry).
grandparent(X, Z):- parent(X, Y), parent(Y, Z)
Adăugaţi:
Laborator 2 – Logică computaţională
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.
Indicaţii:
Scrierea faptelor
Plecând de la caracteristicile frunzelor, putem folosi un predicat
Laborator 2 – Logică computaţională
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.
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ă
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),