Descărcați ca doc, pdf sau txt
Descărcați ca doc, pdf sau txt
Sunteți pe pagina 1din 15

Lucrare de laborator nr.2.

Tema: Bazele programrii n Prolog .

Scopul lucrrii: studierea structurii programelor Prolog; elaborarea programelor cu utilizarea


faptelor i regulilor; organizarea ntrebrilor ctre program.

Informaii de referin succint.

1. Noiuni generale

Prolog este un limbaj de programare, utilizat pentru rezolvarea problemelor ce se refer ctre
obiecte i relaiile existente ntre ele. Programarea n limbajul Prolog include:
1. Declararea unor fapte despre obiecte i relaiile existente ntre ele;
2. Definirea regulilor;
3. Organizarea ntrebrilor (numite i scopuri) adresate bazei de date creat anterior.

Predicate.
Numele relaiilor dintre obiecte este predicatul. n rezultatul declarrii predicatului, se anun
la ce tipuri se refer argumentele acestui predicat.
De exemplu: are(symbol,symbol).
Numele relaiei are. Numele este precedat de paranteze rotunde. Tipul datelor sunt incluse n
paranteze. n exemplul nostru acesta este symbol.
Toat nregistrarea de tipul name(O1,O2,..,O3) se numete o structur predicat.
Fapte.
n Turbo-Prolog relaia dintre obiecte este numit fapt (afirmarea care este ntotdeauna
adevr). Faptul nu se definete prin alte predicate sau el nsui.
De exemplu:
Propoziia n limbajul natural - Doina are automobil.
n limbajul Prolog - are (doina, automobil).
La descrierea faptelor urmeaz s inem cont de o succesiune de reguli:
1. Pe prima poziie se nscrie numele relaiei, apoi n paranteze rotunde urmeaz lista cu numele
obiectelor (argumente). Obiectele sunt separate prin virgul;

1
2. Numele tuturor obiectelor trebuie s nceap cu liter minuscul (cu liter majuscul se ncep
variabilele);
3. Descrierea faptului se finiseaz cu punct.

Reguli.
Regula - este predicatul, definit prin alte predicate sau el nsui. n Turbo-Prolog regula
const din capul i corpul regulii, unite cu simbolul special (:-), care se citete dac. Regula, ca i
faptul se finiseaz cu punct.
Capul este unul din predicatele descrise anterior.
Corpul regulii descrie scopurile, care trebuie s fie consecutiv acordate cu fapte. Dac toate
scopurile n regul sunt acordate, atunci regula este adevrat (are soluie). Predicatele utilizate n
corpul regulii se separ prin virgul (n loc de virgul poate fi utilizat - and) sau punct i virgul (n
loc de (;) poate fi utilizat - or).
Exemplu de regul : Regula susine, c X este sora lui Y, dac X este femeie i X i Y au prini
comuni.
nregistrarea n limbajul Prolog:
sora(X,Y) :- femeie(), parinte(Z, ), parinte(Z, ).

sora(X,Y) - capul regulii .


femeie(), parinte(Z, ), parinte(Z, ) corpul regulii.

Variabile.
n Prolog variabilele permit s nscriem fapte comune, reguli i ntrebri comune. Numele
variabilelor n Prolog trebuie s se nceap cu liter majuscul (sau cu simbolul de subliniere), care
poate fi urmat orice volum de litere (minuscule sau majuscule), cifre sau simbolul de subliniere.
Exemplu de variabile: X, My, My_first.
Lucrul cu variabilele n Prolog se deosebete de lucrul cu variabilele n alte
limbaje de programare. n Prolog variabila primete o oarecare valoare n
procesul de cutare a soluiei i pierde aceast valoare, atunci cnd se ncepe
cutarea unei noi soluii. Modificarea valorii variabilei, care deja are o valoare,
cu ajutorul operatorului de atribuire nu este posibil.

2
Variabila ce nu are valoare, este numit liber. Variabila ce conine o
valoare instaniat(legat). n Prolog nu exist operatorul de atribuire, aceast
funcie n unele cazuri este ndeplinit de ctre operatorul de egalitate= .
S examinm urmtoarele exemple de programe:
1) Dac o oarecare variabil nu conine nici o valoare (cu alte cuvinte este liber), atunci operatorul
de egalitate = lucreaz ca operatorul de atribuire. n programul prezentat mai
jos, X la nceput nu are nici o valoare, n continuare cu ajutorul operatorului =
X primete valoarea 7. Y, la fel, este o variabil liber, astfel expresia Y=X indic operaia de
atribuire. Y primete valoarea lui X.

predicates
scop
clauses
scop :- X=5+2, Y=X, write("Y=",Y),nl.
goal
scop
Raspuns :
Y=7
Yes

2) Dac o oarecare variabil conine valoare (legat), atunci operatorul de egalitate =


lucreaz ca operatorul de comparaie. n exemplul dat avem primul subscop -
X=5+2 i al doilea subscop - Z=1+6 (are loc operaia de atribuire), aa cum X i Z sunt variabile
legate ( X=7 i Z=7). Subscopul trei X=Z comparaie. Astfel, 7=7 este un subscop adevr. Dac
toate subscopurile scopului sunt adevrate rspunsul Prologului Yes(adevr).

predicates
scop
clauses
scop:-X=5+2,Z=1+6,X=Z.
goal
scop

3
Raspuns :
Yes
Dac s modificm regula scop:- X=5+2, Z=1+5, X=Z atunci al treilea subscop X=Z va lua
valoarea fals, aa cum X nu este egal cu Z( X=7,Z=6) i Prolog va rspunde No.

Scopul este privit, ca o comparaie sau ca o atribuire n dependen, dac variabila a primit
o oarecare valoare n momentul demonstraiei scopului.

Dac este nevoie de o anumit informaie din baza de date, pot fi utilizate variabilele
anonime pentru ignorarea valorilor inutile. n Prolog variabilele anonime sunt marcate cu semnul de
subliniere ( _ ). Variabilei anonime niciodat nu i se atribuie valoare.
De exemplu: Este necesar s aflm care oameni sunt prini.
goal
parinte (P, _ ).

Scopul.
Scopul (ntrebare) - este formularea problemei, pe care programul urmeaz s-o soluioneze.
ntrebarea este foarte asemntoare cu faptul. Turbo-Prolog ntotdeauna caut rspuns la ntrebare,
pornind de la nceputul bazei de fapte. Dac se ntlnete un fapt cu un simbol predicativ identic cu
cel al scopului, variabilele din scop se instaniaz conform algoritmului de unificare i valorile
variabilelor astfel obinute sunt afiate ca rspuns la satisfacerea acestui scop.
Scopurile pot fi simple sau complexe (scopul format din dou sau mai multe subscopuri).
Scopul complex se acord, dac se acord toate subscopurile componente. Subscop este un
predicat, care este necesar s fie acordat cu baza de date, pentru a executa acordarea predicatului-
scop. Subscopurile scopului se demonstreaz de la stnga la dreapta consecutiv.

Exemplu: scop simplu - Ce iubete Vica?


iubeste(vica, Ce).
scop complex - Cine iubete pisici i caini?
iubeste(Person, pisici), likes(Person, caini).
La formarea ntrebrilor ctre programul n Prolog deseori sunt utilizate variabilele.

4
Scopurile pot fi interne sau externe. Scopul intern se indic n seciunea Goal. Cel extern se
introduce n fereastra de dialog ( Dialog). Dac scopul este intern, atunci la ndeplinirea
programului Prolog se caut prima soluie i se finiseaz lucrul, dac scopul este extern Prolog caut
toate soluiile.
Programul n Prolog const dintr-o mulime de fapte i reguli. Totalitatea de fapte i reguli n
Prolog este numit baz de date. Prolog-ul permite s utilizm calculatorul ca un depozit de fapte i
reguli, i ofer un mecanism de a face concluzii trecnd de la un fapt la altele.

2. Tipuri de date standarde.


Prolog are 6 tipuri standarde (tabelul 1.). Domeniul definete mulimea valorilor, pe care le
poate primi obiectul ce-i aparine

Tabelul 1.
Tipuri de date Cuvinte cheie Exemple
1. caracter char ''
2. numr ntreg integer 8;-14
3. numr real real 0,25;-5,36
4. ir de caractre string mama
5. nume simbol symbol Mary,mary
6. fiiere file Menu.txt

char este codul semnelor ASCII pe 8-bii, inclus n apostrof (mrimea - 1 octet).
integer definete domeniul numerelor ntregi din diapazonul [-32768,+32767](mrimea 2 octei).
real definete domeniul numerelor reale (+/-): din diapazonul [1-30,1+30] (mrimea 8 octei)
string consecutivitatea de caractere de tipul char, care este inclus n ghilimele.
symbol consecutivitatea de litere din alfabetul latin, cifre i semnul de subliniere, care ncepe cu o
cifr minuscul sau este inclus n ghilimele. Datele de tipul symbol spre deosebire de datele de
tipul string sunt memorizate n tabela simbolurilor. Tabla simbolurilor este amplasat n memoria
operativ, de aceea utilizarea ei asigur o cutare mai rapid.
file variabil fiier, ea valoarea: keyboard, screen, printer; com1.

3. Structura programului n Prolog.

Oricare program scris n Prolog, include cinci seciuni:

5
- seciunea domains conine definirea domeniilor, care se descriu n diferite clase de obiecte utilizate
n program.
- seciunea database conine baza de date confirmat, care sunt predicatele bazei de date. Dac
programul nu necesit o astfel de baz de date, atunci aceast seciune poate fi omis.
- seciunea predicates servete pentru descrierea predicatelor utilizate n program.
- n seciunea clauses se includ faptele i regulile. Despre coninutul acestei seciuni se poate de
vorbit precum de datele necesare pentru lucrul programului.
- n seciunea goal n limbajul Turbo-Prolog se formuleaz destinaia programului creat.
Seciunea scopurilor nu este obligator. Dac el lipsete, programul va lucra numai sub
comanda sistemului, i scopul va fi solicitat n fereastra de dialog.

Exemple de programe cu utilizarea faptelor i regulilor.

Exemplu 1.
n Figura. 1 este prezentat structura organizaional a ntreprinderii Star. Mai jos este
prezentat nformaia despre colaboratori: numele integral, postul ocupat, secia i anul naterii. Toi
colaboratorii se supun directorului. Unii din ei se supun numai directorului, iar alii din ei au eful
lor. Alctuii un program dup faptele cunoscute. Pe baza faptelor deducei regulile ce ar permite s
determinm:
1. colaboratorii, ce afl n subordonarea nemijlocit a directorului;
2. efii seciilor i respectiv colaboratorii lor;
3. vrsta inginerilor n anul 2009;
Punei urmtoare ntrebri ctre program:
1. cine este directorul firmei;
2. lista colaboratorilor i posturile ocupate de ei;
3. anul de natere pentru colaboratorii seciei tehnice;
4. subalternii colaboratorului Gorea.

6
Figura. 1
Lista colaboratorilor ntreprinderii Star.
1. Rusu Ion - directorul ntreprinderii, 1970.
2. Neagu Larisa manager pe vnzarea calculatoarelor, 1980.
3. Negru Valeriu director comercial, 1972.
4. Gorea Vitalii inginer ef, 1971.
5. Grigor Ala contabil ef, 1975.
6. Neculcea Olesea contabil, 1980.
7. Rusu Valentina contabil, 1982.
8. Docu Natalia laborantin, 1985.
9. Grosu Ion inginer n secia de deservire tehnic, 1975.
10. Grosu Iurii inginer n secia de deservire tehnic, 1978.
11. Topciu Mihai inginer n secia de deservire tehnic, 1952.
12. Albu Sergiu inginer n secia de deservire tehnic, 1959.
13. Florea Denis inginer n secia de deservire tehnic, 1956.
14. Florea Viorel programator 1, 1974.
15. Cristea Aurelia programator Consultant-Plus, 1985.
16. Cusnir Aurel programator pe ntrebri comune, 1978.

ncepem soluionarea problemei cu definirea predicatului angajat i determinarea


argumentelor predicatului (conform datelor) :

7
angajat(numele, prenumele, postul, nivelul subordonrii, secia, anul naterii)
i tipul argumentelor date:
angajat(symbol,symbol,symbol,integer,integer, integer).
Valoarea argumentului nivelul subordonrii l introducem conform des.1.: nivelul
superior 0, al doilea nivel (subalternii nemijlocii directorului) -1 i nivelul trei angajaii seciei
tehnice i contabilitii.
Pentru argumentul secia includem urmtoarele mrimi: secia tehnic 1 i contabilittea - 2
nscriem faptele n limbjul Prolog:
angajat("Rusu","Ion",director,0,0,1970).
angajat("Neagu","Larisa",manager_teh,1,0,1980).
angajat("Negru","Valeriu", director_comercial,1,0,1972).
angajat("Gorea","Vitalii",sef_inginer,1,1,1971).
angajat("Grigor","Ala",sef_contabil,1,2,1975).
angajat("Neculcea","Olesea",contabil,2,2,1980).
angajat("Rusu","Valentina",contabil,2,2,1982).
angajat("Docu","Natalia",laborantina,1,0,1985).
angajat("Grosu","Ion",inginer,2,1,1975).
angajat("Grosu","Iurii",inginer,2,1,1978).
angajat("Topciu","Mihai",inginer,2,1,1952).
angajat("Albu","Sergiu",inginer,2,1,1959).
angajat("Florea","Denis",inginer,2,1,1956).
angajat("Florea","Viorel",programator,2,0,1974).
angajat("Cristea","Aurelia",programator,2,0,1985).
angajat("Cusnir","Aurel",programator,2,0,1978).

n continuare indicm predicatele pentru reguli:

Prima regul : colaboratorii, ce se afl n subordonare direct directorului.


Definim predicatul director_subord(numele subalternului, numele subalternului) i tipul
datelor pentru argmente director_subord(symbol,symbol).
Deducerea logic: colaboratorii ce se afl n subordonare direct directorului, sunt
colaboratori nivelului de subordonare 1. ntruct regula se deduce pe baza predicatului angajat, care
are 6 argumente. Argumentele ce nu ne intereseaz, pot fi nlocuite cu variabile anonime.
8
director_subord(X,Y) if angajat(X,Y,_,1,_,_).

A doua regul va afia numele efilor de secii i respectiv numele subalternilor lor. Definim
predicatul: sef_subordonat(numele efului, numele subalternului) i tipul datelor pentru argumente
sef_subordonat(symbol,symbol).
Deducerea logic: eful seciei este colaboratorul, nivelul subordonrii cruia, este mai
inferior dect nivelul subordonaiei altui colaborator (S1<S2) din aceiai secie (D1=D2). Pentru
regula dat urmeaz s excludem directoul din lista rezultant, indicnd nivelul subordonaiei diferit
de 0 (D1<>0).
sef_subordonat(X,Y) if angajat(X,_,_,S1,D1,_),angajat(Y,_,_,S2,D2,_),
S1<S2,D1=D2,D1<>0.

A treia regul permite s obinem numele, prenumele i vrsta inginerilor n anul 2008. Definim
predicatul virsta_ingineri(nume, prenume, vrsta) i tipul datelor pentru argumente
virsta_ingineri(symbol,symbol,integer)
Deducerea logic: iginerii colaboratorii ce ocup postul de inginer
virsta_ingineri(X,Y,R) if angajat(X,Y,inginer,_,_,Z),R=2008-Z,nl.
sau colaboratorii seciei tehnice 1.
virsta_ingineri(X,Y,R) if angajat(X,Y,_ ,_,1,Z),R=2008-Z,nl.
Pentru determinarea vrstei inginerilor includem variabila R ; R=2008 Z (Z anul naterii
colaboratorului). n program este inclus prima variant a regulii.
Intrai n fereastra de redactare (apsai Alt-E sau selectai din meniul principal punctul Edit) i
introducei textul programului:
predicates
angajat(symbol,symbol,symbol,integer,integer,integer)
virsta_ingineri(symbol,symbol,integer)
sef_subordonat(symbol,symbol)
director_subord(symbol,symbol)
clauses
angajat("Rusu","Ion",director,0,0,1970).
angajat("Neagu","Larisa",manager_teh,1,0,1980).
angajat("Negru","Valeriu", director_comercial,1,0,1972).
9
angajat("Gorea","Vitalii",sef_inginer,1,1,1971).
angajat("Grigor","Ala",sef_contabil,1,2,1975).
angajat("Neculcea","Olesea",contabil,2,2,1980).
angajat("Rusu","Valentina",contabil,2,2,1982).
angajat("Docu","Natalia",laborantina,1,0,1985).
angajat("Grosu","Ion",inginer,2,1,1975).
angajat("Grosu","Iurii",inginer,2,1,1978).
angajat("Topciu","Mihai",inginer,2,1,1952).
angajat("Albu","Sergiu",inginer,2,1,1959).
angajat("Florea","Denis",inginer,2,1,1956).
angajat("Florea","Viorel",programator,2,0,1974).
angajat("Cristea","Aurelia",programator,2,0,1985).
angajat("Cusnir","Aurel",programator,2,0,1978).
virsta_ingineri(X,Y,R) if angajat(X,Y,inginer,_,_,Z),R=2008-Z,nl.
sef_subordonat(X,Y) if angajat(X,_,_,S1,D1,_),
angajat(Y,_,_,S2,D2,_),S1<S2,D1=D2,D1<>0.
director_subord(X,Y) if angajat(X,Y,_,1,_,_).

Convingeiv, c textul programului este introdus corect i apsai Alt-R pentru lansare.
La invitaia sistemului Goal : n fereastra Dialog introducei consecutivitatea scopurilor externe:
1. cine este directorul ntreprinderii?
angajat(X,Y,director,_,_,_)
Prolog va rspunde :
X=Rusu, Y=Ion.
1 Solution
2. lista colaboratorilor i posturile ocupate de ei.
angajat(X,Y,Z,_,_,_)
Prolog va rspunde
X=Rusu, Y=Ion, Z= director
X=Neagu, Y=Larisa,Z=manager_teh
X=Negru, Y=Valeriu, Z=director_comercial
X=Gorea, Y=Vitalii, Z=sef_inginer
X=Grigor, Y=Ala, Z=sef_contabil
10
X=Neculcea, Y=Olesea, Z=contabil
X=Rusu, Y=Valentina, Z=contabil
X=Docu, Y=Natalia, Z=laborantina
X=Grosu, Y=Ion, Z=inginer
X="Grosu, Y=Iurii, Z=inginer
X= Topciu, Y=Mihai, Z=inginer
X=Albu, Y=Sergiu, Z=inginer
X=Florea, Y=Denis, Z=inginer
X="Florea, Y=Viorel, Z=programator
X=Cristea, Y=Aurelia, Z=programator
X=Cusnir,Y=Aurel, Z=programator
16 Solutions
3. anul de natere a colaboratorilor seciei tehnice
angajat(X,Y,_,_,1,Z)
Prolog va rspunde :
X=Gorea, Y=Vitalii, Z=1971
X=Grosu, Y=Ion, Z=1975
X="Grosu, Y=Iurii, Z=1978
X= Topciu, Y=Mihai, Z=1952
X=Albu, Y=Sergiu, Z=1959
X=Florea, Y=Denis, Z=1956
6 Solutions
4. subalternii colaboratorului Gorea.
angajat(X,Y,_,2 ,1,_) ; angajat(X,Y,_,2,0,_)
Prolog va rspunde :
X=Grosu, Y=Ion
X=Grosu, Y=Iurii
X= Topciu, Y=Mihai
X=Albu, Y=Sergiu
X=Florea, Y=Denis
X=Florea, Y=Viorel
X=Cristea, Y=Aurelia
X=Cusnir,Y=Aurel
11
8 Solutions

Salvai programul pe disc sub numele ANGAJAT.PRO.

Exemplu 2. Determinai profesia.

n secia Casei de Economii lucreaz: un casier, un controlor i un administrator. Numele


lor: Borisov, Ivanov i Sidorov. Casierul nu are frai, nici surori i este cel mai mic de statur.
Sidorov este cstorit cu sora lui Borisov i este de o nlime mai mare dect controlorul.
Determinai numele casierului, controlorului i administratorului.

Pentru soluionarea problemei date definim dou predicate. Primul predicat nume(symbol)
pentru introducerea numelor colaboratorilor n baza de date.
Predicatul doi rez(symbol,symbol,symbol) l introducem pentru a gsi rspunsul la ntrebarea
problemei. Predicatul rez va fi regul. Determinm variabilele pentru regul K-casier,
controlor, S- administrator.

Deducerea logic: dup condiiile sarcinii casierul nu are frai, surori i este cel mai scund.
De aici urmeaz, c casierul nu poate fi Borisov, ntruct nu are sor, la fel, nu poate fi nici Sidorov,
ntruct el este mai nalt dect controlorul, iar casierul este cel mai mic de statur. n Prolog condiia
o vom scrie n modul urmtor: K<>"borisov",K<>"sidorov".
nscriem condiia ce se refer ctre controlor: controlor nu poate fi Borisov sau Sidorov
(concluzia urmeaz din condiia cine nu este casier K<>"borisov",K<>"sidorov"). Dup condiiile
problemei Sidorov este mai nalt dect controlorul, nseamn, c controlorul este Borisov. Condiia
se nscrie astfel: C="borisov".
Regula :
rez(K,C,S) if nume(K),nume(C),nume(S),K<>C,K<>S,C<>S,
K<>"borisov",K<>"sidorov",C="borisov".
Fiecare din variabil trebuie s primeasc numai o valoare (nume), i pentru aceasta
introducem condiii adugtoare K<>C, K<>S, C<>S .

Intrai n fereastra de redactare i introducei textul programului.

12
predicates
nume(symbol)
rez(symbol,symbol,symbol)
clauses
nume(ivanov).
nume(sidorov).
nume(borisov).
rez(K,C,S) if c(K),c(C),c(S),K<>C,K<>S,C<>S,
K<>"borisov",K<>"sidorov",C="borisov".

Salvai programul pe disc sub numle ANGAJAT1.PRO. Lansai programul i n fereastra Dialog
introducei scopul extern rez(K,C,S).
Prolog va rspunde:
K= ivanov
C= borisov
S= sidorov
1 Solution.

Exerciii .

1. Programul de mai jos are urmtoare eroarea n faza de compilare :


420 WARNING: The variable is only used once
Modificai programul, n sensul eliminrii erorii, i explicai acest fenomen.

2. Executai programul de mai jos i explicai erorile care apar:

13
3. S se traduc n form de clauze Prolog baza de date reprezentat de tabelele de mai jos - se vor
defini predicatele: angajai(cod,nume,cod secie,telefon); proiecte(cod proiect,proiect); sarcina(cod,
cod proiect, cod sarcina). n momentul dat starea obiectelor se reflect prin urmtoarele fapte:
colaboratorul Ivanov, angajat n secia 1, execut n primul proiect "Cosmos" sarcina 1 i n
proiectul 2 "Clima" sarcina 1.
colaboratorul Petrov, angajat n secia 1, execut n primul proiect "Cosmos" sarcina 2.
colaboratorul Sidorov, angajat n secia 2, execut n primul proiect "Cosmos" sarcina 3 i n
proiectul doi "Clima" sarcina 2.

Tabelul 1. Tabelul 2.
Colaboratori Proiecte
Nr.- Nr.-
Cod Nume telefon Proiectul
seciei proiect
1 Ivanov 1 11-22-33 1 Cosmos
2 Petrov 1 11-22-33 2 Clima
3 Sidorov 2 33-22-11

Tabelul 3.
Sarcina
Cod Nr.-proiect Nr.-sarcin
1 1 1
1 2 1
2 1 2
3 1 3
3 2 2
Pe baza faptelor deducei regulile ce ar permite s determinm:
1. numrul telefonului dup numrul seciei;
2. Numele colaboratorilor dup denumirea proiectului.
Executai urmtoarele ntrebri ctre program:
1. cine lucreaz (numele) la proiectul Cosmos?

14
2. lista colaboratorilor din prima secie.
3. care din colaboratorii (numele) primei secii lucreaz la proiectul Cosmos?

4. Trei prieteni au ieit s plimbe cinele, pisica i hrciogul. Se cunoate, c Petru nu iubete
pisicile i locuiete la aceiai scar cu stpna hrciogului. Elena este prieten cu Tatiana, ce-i
primbl pisica. Determinai, ce animal plimba fiecare din copii.

5. Sunt indicat sistema de coordonate i un punct (x,y). Determinai, unde este amplasat punctul:

1. pe axa coordonatelor;
2. n primul cadran;

3. n al doilea cadran;

4. n al treilea cadran;

5. n cadranul patru.

15

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