Lucrarea 3 –Programare in Prolog Tema: Mai multe despre modul de utilizare a predicatelor Breviar teoretic



Yüklə 23,41 Kb.
tarix02.11.2017
ölçüsü23,41 Kb.
#28045

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(_).
Yüklə 23,41 Kb.

Dostları ilə paylaş:




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©muhaz.org 2024
rəhbərliyinə müraciət

gir | qeydiyyatdan keç
    Ana səhifə


yükləyin