Lucrarea 3 –Programare in Prolog
Tema: Mai multe despre modul de utilizare a predicatelor
1. Breviar teoretic
Noţiunea de predicat a fost introdusa pentru a oferi suport reprezentarii cunostintelor în aplicaţiile Prolog. Din viaţa de toate zilele se ştie ca omul operează cu două tipuri de cunoştinţe:
-
Fapte simple
-
Reguli de manipulare a faptelor (inferenţe).
Faptele simple permit relationarea primara a obiectelor dintr-un anumit domeniu de expertiza.
Dacă, de exemplu, suntem preocupaţi de realizarea unei baze de cunoştinţe referitoare la angajaţii unei firme, am putea sa vedem lucrurile astfel:
La nivel primar:
Fiecare angajat are: date personale, studii, experienta profesionala, abilitati de folosire a limbilor straine, etc.
Fiecare dintre caracteristicile enumerate mai sus poate fi descrisa cu ajutorul unui set specific de date.
De exemplu, datele personale ar putea fi reprezentate de maniera:
Date personale:
-Matricol;
-Nume;
-Prenume;
-Adresa;
-TelefonFix;
-TelefonMobil;
-E_mail;
-Etc.
Tipurile de date rezonabile pentru memorarea unor astfel de date sunt:
-Matricol: integer;
-Nume, Prenume, Adresa, TelefonFix, TelefonMobil, E-Mail: string
Astfel ca am putea defini predicatul Prolog:
predicates
datepers(integer,string,string,string,string,string,string)
Analog se va proceda cu predicatele asociate caracteristicilor compozite referitoare la:
-Studii;
-Experienta profesionala;
-Abilitatile de folosire a limbilor straine.
Fireste, aceste predicate au fost specificate pentru a reprezenta ceea ce mai sus am numit fapte simple. Ceea ce inseamna ca in sectiunea clauses vom avea fapte de tipul:
clauses
datepers(111,”Ionescu”,”Vasile”,”Morilor 32”,0268121212,0742121212,ionescu@gmail.com).
Am putea sune ca predicatul este un fel de tip de data structurat. In contextul Prolog el este, insa, mult mai mult decat asa ceva.
Pe de alta parte, avand aceste date despre angajati, ne putem pune intrebari de tipul urmator:
As dori sa stiu daca avem un angajat care vorbeste engleza bine si se descurca cu folosirea calculatorului. O astfel de informatie o putem obtine interogand baza de fapte. Evident, calitatea raspunsului depinde de acuratetea bazei de fapte. Daca baza de fapte este saraca, raspunsul s-ar putea sa fie dezamagitor.
Intrebarea de mai sus ar putea fi reprezentata, aproximativ, astfel:
Angajat_LS_Comp(Matricol):
CunoasteLS(Matricol,engleza,Bine),
CunoasteCOMP(Matricol,Bine).
Ceea ce este mai degraba o modalitate de a face inferenta. Aceasta modalitate spune ceva de genul: Angajat_LS_Comp() este adevarata daca exista un angajat care, simultan, stie engleza bine si se pricepe la utilizarea calculatoarelor.
Ca predicat Prolog o astfel de regula de inferenta se specifica astfel:
predicates
angajat_LS_Comp(integer):-
cunoasteLS(integer,symbol,symbol),
cunoasteCOMP(integer,symbol).
2. Exemplu comentat
domains
%Tipuri de date folsite
Nume,Prenume,Adresa,TelFix,TelMob,E_Mail=string
Matr=integer
Institutia,Specializarea=string
LocDeMunca,Post=string
predicates
% Predicate
datepers(Matr,Nume,Prenume,Adresa,TelFix,TelMob,E_Mail)
are_studii(Matr,Institutia,Specializarea)
are_experienta(Matr,LocDeMunca,Post)
cunoasteLS(Matr,symbol,symbol)
cunoasteCOMP(Matr,symbol)
angajat_LS_COMP(Matr,symbol,symbol,symbol)
clauses
datepers(111,"Ionescu","Vasile","Morilor 14", "0268121212", "0741122112",
"ionescu@gmail.com").
are_studii(111,"Universitatea Transilvania din Brasov","Tehnologia informatiei").
are_experienta(111,"Shortcut Computers","Vanzator").
cunoasteLS(111,engleza,bine).
cunoasteLS(111,germana,foarteBine).
cunoasteCOMP(111,bine).
angajat_LS_COMP(Matr,Limba,Nivelul,NivelUC):-
cunoasteLS(Matr,Limba,Nivelul),
cunoasteCOMP(Matr,NivelUC).
goal
clearwindow,
%Cautare angajat care vorbeste engleza bine si cunoaste calculatoarele bine
angajat_LS_COMP(Matricol,engleza,bine,bine),
%Odata gazita matricola angajatului se cauta si numele si prenumele aferent
datepers(Matricol,Nume,Prenume,_,_,_,_),
%Afisare nume si prenume la consola output
write("O solutie posibila este:",Nume, " ",Prenume),
%Temporizare
readchar(_).
3. Trucuri Prolog
//Utilizarea functorilor
domains
%Lista de persoane
Lista=pers*
%Functorul care grupeaza datele unei persoane
pers=per(symbol,string,string,string)
predicates
%Afisare lista de persoane
disp(Lista)
%Definire relatii intre datele unei persoane
persoana(pers)
clauses
%Oprire autoapel
disp([]).
%Afisare recursiva date persoana
disp([per(N,S,L,J)|T]):-
write(N," ",S," "),write(L," "),write(J),nl,
disp(T).
%Baza de fapte interne
persoana(per(calimente,"Merilor","Brasov","Brasov")).
persoana(per(bibanu,"Saturn","Cluj","Cluj")).
goal
%Generare lista cu datele de contact ale tuturor persoanelor din baza de fapte
%Utilizare findall
findall(Per,persoana(Per),LPer),
clearwindow,
disp(LPer),
readchar(_).
Dostları ilə paylaş: |