Sunteți pe pagina 1din 21

Lucrări de laborator

Inteligenţa artificială.
Lucrare de laborator Nr.1.
Fapte, reguli şi interogări în limbajul PROLOG.
Să construiască un arbore genealogic arbitrar care să conţină cel
puţin 4 nivele(generaţii). Să se descrie acest arbore în limbajul PROLOG
cu ajutorul următoarelor relaţii:
- parinte(X,Y). /* X este părintele lui Y */
- barbat(X). /* X este bărbat */
- femeie(X). /* X este femeie */
Să se descrie regulile pentru diverse relaţii de rudenie, utilizând
numai cele trei relaţii descrise mai sus:
1. mama(X,Y) /* X este mama lui Y */
2. tata(X,Y)
3. frate(X,Y)
4. sora(X,Y)
5. copil(X,Y) /* X este copilul lui Y */
6. fiica(X,Y)
7. fecior(X,Y)
8. bunel(X,Y)
9. bunica(X,Y)
10. unchi(X,Y)
11. nepot(X,Y)
12. stramos(X,Y) /* X este strămoş pentru Y – regulă
recursivă */
13. urmas(X,Y)
14. var(X,Y)
15. vara(X,Y)
16. areCopii(X) /* X are copii */
17. esteBunel(X)
18. esteBunica(X)
19. areFrati(X)
20. areVeri(X)
21. etc.
Să se formuleze diferite interogări asupra programului.

1
Efectuarea unei variante constă în definirea a cel puţin 7 relaţii
din cele enumerate mai sus, indicate de către profesor.

2
Lucrare de laborator Nr.2. Funcţii numerice recursive.

1. Să se definească predicatul fact(N,Rez) care calculează recursiv


factorialul unui număr natural.

2. Să se definească predicatul suma(A,B,Rez) şi minus(A,B,Rez) , care


calculează cu ajutorul recursiei suma şi diferenţa a două numere naturale.

3. Să se definească predicatul produs(A,B,Rez) care calculează cu


ajutorul recursiei produsul a două numere naturale.

4. Să se definească predicatul cmmdc(A,B,Rez) care găseşte recursiv cel


mai mare divizor comun a două numere naturale, aplicând algoritmul lui
Euclid.

5. Să se definească predicatul expo(X,N,XlaN) de ridicare a unui număr


la o putere naturală cu ajutorul recursiei.

6. Să se definească predicatul mod1(A,B,Rez) care calculează cu ajutorul


recursiei restul de la împărţirea unui număr natural la altul.

7. Să se definească predicatele succesor(A,B) şi predecesor(A,B) , care


verifică cu ajutorul recursiei dacă un număr natural este succesorul celuilalt
şi dacă un număr este predecesorul celuilalt.

8. Să se definească predicatul div1(A,B,Rez) care calculează cu ajutorul


recursiei partea întreagă de la împărţirea unui număr natural la altul.

9. Să se definească predicatul recursiv care calculează suma primelor n


numere naturale.

10. Să se definească predicatul recursiv care găseşte numărul Fibonacci de


pe poziţia dată.

3
11. Să se definească în limbajul Prolog funcţia Ackermann:
 m + 1 , d aăcn = 0

A(n, m) =  A(n − 1, 1) , d aăc n > 0 , m = 0
 A(n − 1, A(n, m − 1) ), d aăc n > 0 , m > 0

12. Să se definească predicatul recursiv care calculează din câte cifre este
compus numărul natural dat.

13. Să se definească predicatul recursiv care găseşte suma tuturor


divizorilor unui număr natural dat.

14. Să se definească predicatul recursiv care determină dacă două numere


naturale sunt reciproc prime(nu au divizori comuni).

15. Să se definească predicatul recursiv care calculează suma primelor n


numere naturale impare.

16. Să se definească predicatul recursiv care verifică dacă un număr natural


dat este prim.

17. Să se definească predicatul recursiv care verifică dacă un număr natural


dat este perfect (este egal cu suma divizorilor săi, de ex. 6=3+2+1).

18. Să se definească predicatul recursiv care pentru un număr natural dat


calculează suma primilor n multipli al acestui număr, inclusiv el însăşi.

19. Să se definească predicatul recursiv care găseşte suma a trei numere


naturale.

20. Să se definească predicatul recursiv care reduce două numere


naturale(le face reciproc prime prin împărţirea ambelor numere la cel mai
mare divizor comun al lor).

4
Lucrare de laborator Nr.3.
Prelucrarea listelor în limbajul PROLOG. Definiţii recursive.

1. Să se definească în Prolog următoarele predicate:


a) predicatul care verifică dacă un element se conţine într-o listă
(aparţine).
b) predicatul care găseşte al n-lea element dintr-o listă.
c) predicatul care dublează toate elementele unei liste.

2. Să se definească în Prolog următoarele predicate:


a) predicatul care tipăreşte o listă la ecran.
b) predicatul care tipăreşte o listă în ordine inversă.
c) predicatul care dublează toate elementele unei liste.

3. Să se definească în Prolog următoarele predicate:


a) predicatul care concatenează două liste.
b) predicatul care inversează o listă.
c) predicatul care verifică dacă o listă se conţine în altă listă (este
submulţime).

4. Să se definească în Prolog următoarele predicate:


a) predicatul care elimină dintr-o listă un element.
b) predicatul care elimină dintr-o listă elementul de pe locul n.
c) predicatul care calculează lungimea unei liste.

5. Să se definească în Prolog următoarele predicate:


a) predicatul care numără de câte ori se întâlneşte un element într-o
listă.
b) predicatul care calculează suma elementelor dintr-o listă de
numere întregi.
c) predicatul care calculează media aritmetică a numerelor dintr-o
listă de numere întregi.

6. Să se definească în Prolog următoarele predicate:


a) predicatul care găseşte elementul maximal dintr-o listă numerică.
b) predicatul care găseşte poziţia unui element dat într-o listă.
c) predicatul care găseşte elementul de pe poziţia dată într-o listă.

5
7. Să se definească în Prolog următoarele predicate:
a) predicatul care găseşte produsul elementelor dintr-o listă
numerică.
b) predicatul care tipăreşte elementele de pe poziţiile impare ale
unei liste.
c) predicatul care tipăreşte în ordine inversă elementele de pe
poziţiile pare ale unei liste.

8. Să se definească în Prolog următoarele predicate:


a) predicatul care alipeşte două liste.
b) predicatul care măreşte cu o unitate toate elementele unei liste
numerice.
c) predicatul care elimină dintr-o listă ultimul element al listei.

9. Să se definească în Prolog următoarele predicate:


a) predicatul care inversează o listă.
b) predicatul care elimină dintr-o listă penultimul element.
c) predicatul care într-o listă numerică, toate elementele mai mari ca
3 le micşorează cu 3.

10. Să se definească în Prolog următoarele predicate:


a) predicatul care selectează dintr-o listă numerică sublista
elementelor impare.
b) predicatul care elimină dintr-o listă al treilea element.
c) predicatul care elimină toate elementele de pe poziţiile pare dintr-
o listă.

6
Lucrare de laborator Nr.4.
Prelucrarea listelor în limbajul PROLOG. Definiţii recursive.

1. Să se scrie predicatul care găseşte elementul maximal al unei liste


numerice.

2. Să se scrie predicatul care alipeşte două liste în felul următor: prima listă
o inversează şi o alipeşte la lista a doua.

3. Să se scrie predicatul care într-o listă arbitrară schimbă cu locurile


elementele în felul următor: primul element cu al doilea, al treilea cu al
patrulea, al cincilea cu al şaselea etc. Dacă lista are un număr impar de
elemente, ultimul element va rămâne pe poziţia sa.

4. Să se scrie predicatul care elimină dintr-o listă arbitrară toate repetările


elementelor, în afară de ultima repetare.

5. Să se scrie predicatul care verifică dacă un element dat se întâlneşte într-


o listă dată exact de două ori.

6. Să se scrie predicatul care elimină dintr-o listă arbitrară primele N


elemente.

7. Să se scrie predicatul care verifică dacă o listă este prefixul altei liste.

8. Să se scrie predicatul care verifică dacă un element dat se întâlneşte într-


o listă o singură dată.

9. Să se scrie predicatul care pentru o listă numerică calculează suma


ultimelor două elemente ale acestei liste.

10. Să se scrie predicatul care calculează numărul de apariţii ale unui


element dat într-o listă.

11. Să se scrie predicatul care elimină toate apariţiile unui element dat de
pe poziţiile impare dintr-o listă. Se consideră că poziţia primului element al
listei este 1.

7
12. Să se scrie predicatul care pentru o listă arbitrară construieşte o listă
formată din două elemente: primul şi ultimul element al listei iniţiale.

13. Să se scrie predicatul care pentru un număr şi o listă numerică date


verifică dacă în listă se conţin două elemente vecine, suma cărora este egală
cu numărul dat.

14. Să se scrie predicatul care pentru un număr natural dat şi o listă de


numere naturale dată verifică dacă în listă se conţin două elemente pentru
care numărul dat reprezintă media lor aritmetică.

15. Să se scrie predicatul care calculează suma elementelor pozitive dintr-o


listă numerică.

16. Să se scrie predicatul care elimină dintr-o listă fiecare a doua apariţie al
unui element dat.

17. Să se scrie predicatul care calculează suma a doi vectori reprezentaţi


sub forma a două liste numerice de aceeaşi lungime (vectori de aceeaşi
dimensiune).

18. Să se scrie predicatul care inserează un element într-o listă pe ultima


poziţie.

19. Să se scrie predicatul care calculează suma poziţiilor unei liste, pe care
se află elemente nule. Poziţia primului element al listei se consideră 1.

20. Să se scrie predicatul care uneşte două liste simbolice în felul următor:
1-ul element al primei liste, 1-ul element al listei a doua, al 2-lea element al
primei liste, al 2-lea element al listei a doua etc. Dacă elementele uneia din
liste s-au epuizat (această listă este mai scurtă decât cealaltă listă), în lista
rezultantă se introduce constanta simbolică „null” până când va fi parcursă
cealaltă listă.

8
Lucrare de laborator Nr.5. Prelucrarea listelor în PROLOG.
Utilizarea listelor la reprezentarea unor structuri de date.
1. Să se scrie programul pentru sortarea unei liste numerice în ordine
crescătoare, prin metoda „naivă”: se generează permutări ale listei până
când se obţine o permutare sortată.

2. Să se scrie programul pentru sortarea unei liste numerice în ordine


crescătoare, prin metoda inserţiei: capul listei se elimină, se sortează coada,
apoi capul se inserează în coada sortată pe poziţia corespunzătoare.

3. Să se scrie programul pentru sortarea unei liste numerice în ordine


crescătoare, prin metoda bulelor.

4. Să se scrie programul pentru sortarea unei liste numerice în odine


crescătoare, prin metoda rapidă: pentru o lista dată [Cap|Coada], Coada se
divizează în două liste L şi M, în aşa fel, ca L să conţină elementele mai
mici decât Cap, iar M să conţină elementele mai mari decât Cap. Lista
sortată va fi compusă din versiunea sortată a listei L, apoi Cap şi apoi
versiunea sortată a listei M. La rândul său, listele L şi M sunt sortate
recursiv prin sortarea rapidă.

5. Să se scrie programul pentru sortarea unei liste numerice în ordine


crescătoare, prin metoda selecţiei: din listă se selectează elementul
maximal şi se trece în capul listei rezultante, iniţial vidă. Procesul se repetă
până când vor fi mutate toate elementele listei.

6. Să se scrie programul care pentru un număr natural N şi două liste Lista


şi Comb efectuează:
a) verifică dacă lista Comb este combinare a N elemente din lista
Lista;
b) fiind date lista Lista şi numărul natural N, construieşte toate
listele Comb care formează
combinări de N elemente din Lista.

7. Să se scrie programul care pentru o listă (ce reprezintă o mulţime de


numere) şi un număr dat găseşte o submulţime de elemente, suma cărora
este egală cu numărul dat (dacă există o astfel de submulţime).

9
8. Să se scrie programul care pentru două liste arbitrare verifică dacă
elementele din prima listă se întâlnesc în lista a doua în aceeaşi ordine
(prima listă este o selecţie de elemente din lista a doua).
De exemplu: Lista1=[a, b, d, x, z], Lista2=[s, b, a, c, b, b, d, e, x, r, z].

9. Numerele întregi mari pot fi reprezentate sub forma: [n1, c1, n2, c2, … nk,
ck] , unde ni este numărul de repetări al cifrei ci. Să se scrie programul,
care transformă orice număr reprezentat sub formă de listă de cifre într-o
reprezentare prin perechi. De exemplu: [1, 1, 1, 1, 2, 3, 3, 5, 5, 0, 0, 0]
→ [4, 1, 1, 2, 2, 3, 2, 5, 3, 0].

10. Numerele întregi mari pot fi reprezentate sub forma: [n1, c1, n2, c2, …
nk, ck] , unde ni este numărul de repetări al cifrei ci. Să se scrie programul,
care transformă orice număr reprezentat sub formă de listă de perechi într-o
listă ce conţine toate cifrele numărului. De exemplu: [4, 1, 1, 2, 2,
3, 2, 5, 3, 0] → [1, 1, 1, 1, 2, 3, 3, 5, 5, 0, 0, 0].

11. Vom reprezenta matricile pătrate n× n în formă liste ce conţin n2


elemente, în care primele n elemente formează prima linie a matricii,
următoarele n elemente – a doua linie, etc. Să se scrie programul, care
pentru două numere i, j şi o listă ce reprezintă o matrice, găseşte elementul
de pe poziţia (i, j) în matrice.

12. Să se scrie programul care într-o listă numerică arbitrară numără câte
elemente se conţin, cu următoarea proprietate: sunt mai mari decât orice
element din dreapta lui.De exemplu: [1, 14, 3, 12, 4, 7, 3, 6, 2, 1, 2] → 5.

13. Fie date două liste: prima – o listă numerică arbitrară, a doua – o listă
numerică sortată în ordine crescătoare. Să se scrie programul care inserează
toate elementele primei liste în lista a doua, astfel încât lista a doua să
rămână sortată.

14. Fie dată o listă care conţine toate numerele naturale de la 1 până la N
aranjate în ordine arbitrară. Să se scrie programul care construieşte din
această listă o lisă nouă, astfel încât în lista nouă să nu nimerească pe
oricare două poziţii vecine numere naturale vecine. De exemplu 1 şi 2, 5 şi
4, 4 şi 5, 8 şi 7 etc.

10
15. Fie dată o listă de subliste de numere arbitrare. Să se sorteze această
listă în ordine crescătoarea a sumelor elementelor sublistelor. De exemplu:
[[5, 3, 1], [ ], [-4, 2], [0, 1, 2, 3]] → [[-4, 2], [ ], [0, 1, 2, 3], [5, 3, 1]] .

16. Fie dată o listă de subliste de simboluri. Să se scrie programul care


transformă această listă într-o mulţime – listă de simboluri (fără subliste) în
care elementele nu se repetă (programul construieşte o listă nouă).
De exemplu: [[x, a, b, a], [b, c, d, e], [ ], [b, c, f]] → [x, a, b, c, d, e, f] .

17. Să se scrie programul care elimină dintr-o listă arbitrară prima şi ultima
apariţie a fiecărui element al listei.
De exemplu: [a, b, a, c, d, c, a, b, f, d, b, a, b] → [a, a, b, b] .

18. Să se scrie programul care elimină dintr-o listă arbitrară a doua şi


ultima apariţie a fiecărui element al listei.
De exemplu: [u, v, x, u, y, u, z, x, a, x, z, y, u] → [u, x, y, u, z] .

19. Numerele întregi mari pot fi reprezentate sub forma: [[n1, c1], [n2, c2],
… [nk, ck]] , unde ni este numărul de repetări al cifrei ci. Să se scrie
programul, care transformă orice număr reprezentat sub formă de listă de
cifre într-o reprezentare prin perechi (listă de subliste. Toate sublistele
conţin două elemente). De exemplu: [1, 1, 1, 1, 2, 3, 3, 5, 5, 0, 0, 0] →
[[4, 1], [1, 2], [2, 3], [2, 5], [3, 0].

20. Numerele întregi mari pot fi reprezentate sub forma: [[n1, c1], [n2, c2],
… [nk, ck]] , unde ni este numărul de repetări al cifrei ci. Să se scrie
programul, care transformă orice număr reprezentat sub formă de listă de
perechi (listă de subliste din două elemente) într-o listă ce conţine toate
cifrele numărului. De exemplu: [[4, 1], [1, 2], [2, 3], [2, 5], [3, 0]] →
[1, 1, 1, 1, 2, 3, 3, 5, 5, 0, 0, 0].

11
Lucrare de laborator Nr.6. Tema: Automate finite.

Să se scrie un program Prolog care realizează automatul finit ce


recunoaşte cuvintele de forma:
1. a( abc ) n c , n≥0
2. ( ab ) n (cd ) m , n≥1, m≥0
3. a n bd m , n≥0, m≥1
4. ab n cd m e , n≥1, m≥1
5. ( abc ) n d ( ef ) m , n≥0, m≥0
6. a n b m c k e , n≥0, m≥0, k≥0
7. a( abc ) n ( de ) m , n≥0, m≥0, n+m≥1
8. ( abc ) n ( ab ) m , n≥1, m≥1
9. a n b m , n≥0, m≥0, n+m≥1
10. a n b m c k , n≥0, m≥0, k≥0, n+m≥1
11. ( ab ) n ( cd ) m , n≥2, m≥1, n – par, m – impar
a( bc ) d ( de ) , n≥0, m≥0
n m
12.
13. a n b m ( cd ) k , n≥0, m≥0, k≥1
14. ( abc ) n de m , n≥0, m≥0
15. ( abcd ) n ( ef ) m , n≥1, m≥1
a n ( bc ) ( cd ) , n≥0, m≥1, k≥1
m k
16.
17. ( bc ) n ( ab ) m d , n≥0, m≥0, n+m≥1
18. a n b m c k , n≥1, m≥2, k≥3, n – impar, m – par, k se divide la 3
a n ( bc ) ( de ) , n≥1, m≥1, k≥1, m – impar
m k
19.
20. ( abc ) n ( bcd ) m e , n≥0, m≥0, n+m≥1

12
Lucrare de laborator Nr.7.
Distribuirea numerelor. Probleme combinatorice.
1. Să se distribuie numerele de la 1 la n în trei cutii A, B, C, astfel ca să
se satisfacă următoarele condiţii:
- dacă numărul i este într-o cutie, atunci numărul k=2*i (k≤n), nu
poate fi cu el în aceeaşi cutie;
- dacă numerele i şi j sunt într-o cutie, atunci k=i+j (k≤n), nu poate fi
în aceeaşi cutie cu ultimii.
Să se scrie un program Prolog ce ar găsi soluţia problemei, luând în
creştere valoarea lui n.

2. Să se distribuie numerele de la 1 la n în trei cutii A, B, C, astfel ca să


se satisfacă următoarele condiţii:
- dacă numărul i este într-o cutie, atunci numărul k=2*i+1 (k≤n), nu
poate fi cu el în aceeaşi cutie;
- dacă numerele i şi j sunt într-o cutie, atunci k=i+j-1 (k≤n), nu poate
fi în aceeaşi cutie cu ultimii.
Să se scrie un program Prolog ce ar găsi soluţia problemei, luând în
creştere valoarea lui n.

3. Să se distribuie numerele de la 1 la n în trei cutii A, B, C, astfel ca să


se satisfacă următoarele condiţii:
- numerele pare pot fi incluse numai în cutiile A şi C;
- numerele impare pot fi incluse numai în cutiile B şi C;
- dacă numerele i şi j sunt într-o cutie, atunci k=i+j (k≤n), nu poate fi
în aceeaşi cutie cu ultimii.
Să se scrie un program Prolog ce ar găsi soluţia problemei, luând în
creştere valoarea lui n.

4. Să se distribuie numerele de la 1 la n în trei cutii A, B, C, astfel ca să


se satisfacă următoarele condiţii:
- în cutia A pot fi incluse numai numere pare;
- în cutia B pot fi incluse numai numere impare;
- dacă numărul i este într-o cutie, atunci numărul k=2*i (k≤n), nu
poate fi cu el în aceeaşi cutie.
Să se scrie un program Prolog ce ar găsi soluţia problemei, luând în
creştere valoarea lui n.

13
5. Să se distribuie numerele de la 1 la n în trei cutii A, B, C, astfel ca să
se satisfacă următoarele condiţii:
- dacă numărul i este într-o cutie, atunci numărul k=n-i (k<n), nu
poate fi cu el în aceeaşi cutie;
- dacă numerele i şi j sunt într-o cutie, atunci k=(i+j)/2 (k≤n), nu
poate fi în aceeaşi cutie cu ultimii.

6. Să se divizeze o mulţime numerică în două submulţimi, astfel, încât


suma elementelor din fiecare submulţime să fie aceeaşi.

7. Copiii familiei Bright.


În familia Bright sunt cinci copii. La vârstele de 4, 5, 6, 7 şi 8 ani
Rose şi fraţii săi şi-au demonstrat talentele în domenii diferite. Unul din ei
cântă bine la pian.
Să se determine vârsta şi talentul fiecărui copil, ţinând cont că
1. Becca are 4 ani şi nu străluceşte în matematici.
2. Un magician al calculatorului e cu un an mai mare decât Stu.
3. Violonistul are 7 ani.
4. Iona nu are 8 ani.
5. La 5 ani ai săi Rob e un copil mai mic decât cel ce străluceşte
în litere.

8. Patru elevi Mihai, Anatol, Alexandru şi Petru studiază câte o


limbă străină. Doi băieţi studiază limba germană, unul engleza şi unul
franceza. Se ştie că Mihai şi Anatol studiază limbi străine diferite, la fel
Mihai cu Alexandru, Petru cu Alexandru, Petru cu Mihai, Anatol cu
Alexandru. Mihai nu studiază limba engleză. Determinaţi ce limbă studiază
fiecare băiat.

9. Alina, Corina, Irina, Marina şi Sabina s-au aşezat la teatru pe


locurile de la 1 la 5. Alina nu are locul 5, iar Corina nu are locul 1. Irina
şede între prietene. Sabina nu şede lângă Irina, iar Irina nu şede lângă
Corina. Locul Marinei are un număr mai mare decât cel al Corinei. Cine
şede pe locul 5?

14
10. Să se distribuie numerele de la 1 la n în trei cutii A, B, C, astfel ca
să se satisfacă următoarele condiţii:
- dacă numărul i este într-o cutie, atunci numărul k=2*i (k≤n), nu
poate fi cu el în aceeaşi cutie;
- dacă numerele i şi j sunt într-o cutie, atunci k=i+j (k≤n), nu poate fi
în aceeaşi cutie cu ultimii.
Să se scrie un program Prolog ce ar găsi soluţia problemei, luând în
creştere valoarea lui n.

Lucrare de laborator Nr.8. Jocul ”Chibriturile”.

1. Să se realizeze în Prolog jocul ”Chibriturile”. Pe masă


sunt aşezate 23 chibrituri. Sunt doi jucători şi fiecare din ei pe
rând trebuie să ia de pe masă câteva chibrituri. Fiecare jucător
are dreptul să ia 1, 2, sau 3 chibrituri. Jucătorul care va lua
ultimul chibrit va pierde jocul.
Să se scrie programul care utilizează strategia optimală de joc.

2. Să se realizeze în Prolog jocul ”Chibriturile”. Pe masă


sunt aşezate 23 chibrituri. Sunt doi jucători şi fiecare din ei pe
rând trebuie să ia de pe masă câteva chibrituri. Fiecare jucător
are dreptul să ia 1, 2, sau 3 chibrituri. Jucătorul care va lua
penultimul chibrit va pierde jocul.
Să se scrie programul care utilizează strategia optimală de joc.

15
Lucrare de laborator Nr.9. 1. Pionii.
Pe o tablă orizontală cu 7 pătrate iniţial sunt aliniaţi trei
pioni albi şi trei pioni negri cu un pătrat liber între ei:
A A A N N N
Să se găsească consecutivitatea de transformări a configuraţiei
iniţiale pentru a ajunge la configuraţia finală în care pionii albi
sunt în dreapta, iar cei negri – în stânga despărţiţi de un pătrat
liber:
N N N A A A
utilizând următoarele patru reguli:
- un pion negru poate fi deplasat cu un pătrat spre
stânga, dacă pătratul e liber, de exemplu
A N A N N A → A N A N N A
- un pion negru poate sări peste un pion adiacent alb spre
stânga, dacă pătratul e liber, de exemplu
A N A N N A → A N N A N A
- un pion alb poate fi deplasat cu un pătrat spre dreapta, dacă
pătratul e liber, de exemplu
A N A N N A → A N A NN A
- un pion alb poate sări peste un pion adiacent negru spre
dreapta, dacă pătratul e liber, de exemplu
A A N N N A → A N A NN A

Lucrare de laborator Nr.10. Bidoanele cu apă.


1. Fie date două bidoane – unul de 7 litri şi unul de 5
litri. Iniţial ambele sunt deşarte. Să se găsească o secvenţă de
acţiuni care lasă 4 litri de apă în bidonul de 7 litri (volumul de
apă rămas în bidonul mic nu contează). Acţiunile posibile care
pot modifica starea bidoanelor sunt:
- un bidon poate fi umplut dintr-o sursă externă;
- un bidon poate fi golit într-un recipient;
- apa poate fi turnată dintr-un bidon în altul, până când primul
e gol sau al doilea e plin.
16
2. Fie date trei bidoane – unul de 8 litri, unul de 5 litri şi
unul de 3 litri. Iniţial cel de 8 litri este plin, iar celelalte (de 5
litri şi de 3 litri) sunt deşarte. Să se găsească o secvenţă de
acţiuni care lasă câte 4 litri de apă în bidonul de 8 litri şi în
bidonul de 5 litri. Acţiunile posibile care pot modifica starea
bidoanelor sunt: apa poate fi turnată dintr-un bidon în altul, până
când primul se goleşte sau al doilea se umple.

3. Fie date trei bidoane – unul de 12 litri, unul de 7 litri


şi unul de 5 litri. Iniţial cel de 12 litri este plin, iar celelalte (de 7
litri şi de 5 litri) sunt deşarte. Să se găsească o secvenţă de
acţiuni care lasă câte 6 litri de apă în bidoanele de 12 litri şi de 7
litri. Acţiunile posibile care pot modifica starea bidoanelor sunt:
apa poate fi turnată dintr-un bidon în altul, până când primul se
goleşte sau al doilea se umple.

4. Fie date trei bidoane – unul de 10 litri, unul de 7 litri


şi unul de 3 litri. Iniţial cel de 10 litri este plin, iar celelalte (de 7
litri şi de 3 litri) sunt deşarte. Să se găsească o secvenţă de
acţiuni care lasă câte 5 litri de apă în bidoanele de 10 litri şi de 7
litri. Acţiunile posibile care pot modifica starea bidoanelor sunt:
apa poate fi turnată dintr-un bidon în altul, până când primul se
goleşte sau al doilea se umple.

5. Fie date trei bidoane – unul de 16 litri, unul de 8 litri


şi unul de 5 litri. Iniţial în cel de 16 litri sunt exact 14 litri de
apă, iar celelalte (de 8 litri şi de 5 litri) sunt deşarte. Să se
găsească o secvenţă de acţiuni care lasă câte 7 litri de apă în
bidoanele de 16 litri şi de 8 litri. Acţiunile posibile care pot
modifica starea bidoanelor sunt: apa poate fi turnată dintr-un
bidon în altul, până când primul se goleşte sau al doilea se
umple.
17
6. Fie date trei bidoane – unul de 7 litri, unul de 6 litri şi
unul de 3 litri. Iniţial în cel de 7 litri sunt 6 litri de apă, în cel de
6 litri sunt 4 litri de apă, celălalt de 3 litri este deşert. Să se
găsească o secvenţă de acţiuni care lasă câte 5 litri de apă în
bidoanele de 7 litri şi de 6 litri. Acţiunile posibile care pot
modifica starea bidoanelor sunt: apa poate fi turnată dintr-un
bidon în altul, până când primul se goleşte sau al doilea se
umple.

7. Fie date trei bidoane – unul de 14 litri, unul de 8 litri


şi unul de 5 litri. Iniţial cel de 14 litri este plin, iar celelalte (de 8
litri şi de 5 litri) sunt deşarte. Să se găsească o secvenţă de
acţiuni care lasă câte 7 litri de apă în bidoanele de 14 litri şi de 8
litri. Acţiunile posibile care pot modifica starea bidoanelor sunt:
apa poate fi turnată dintr-un bidon în altul, până când primul se
goleşte sau al doilea se umple.

Lucrarea de laborator Nr.11. Gramatici.


1. Fie dată gramatica
<Number> → <A><B>
<A> → 01
<A> → 0<A>1
<B> → 2
<B> → 2<B>
ce generează numere de forma 0n1n2m .
Să se scrie un program Prolog ce ar recunoaşte astfel de şiruri de
simboluri.
2.Fie dată gramatica G= (VN, VT, P, S);VN={ S },VT={a, b, c } ,
P= { 1. S → a2S
2. S → bc }
ce generează cuvinte de forma: L(G)= { a2nbc, n>=0 }.
Să se scrie un program Prolog ce ar recunoaşte astfel de cuvinte.
18
3. Fie dată gramatica G= (VN,VT,P,S);VN={S,H},VT={b,c,d,e },
P= { 1. S → bbSe
2. S → H
3. H → cHdd
4. H → cd }
Limbajul generat de această gramatică este:L(G)={b2ncmd2m-1en,
m>=1, n>=0 }. Să se scrie un program Prolog ce ar recunoaşte
astfel de cuvinte.
4. Fie dată gramatica G= (VN,VT,P,S);VN={S,A,B}, VT={a,b,c},
P= { 1. S → AB
2. A → aAb
3. A → ab
4. B → cB
5. B → c }
Limbajul generat de această gramatică este:L(G)= {aibicj,i 1,j 1}.
Să se scrie un program Prolog ce ar recunoaşte astfel de cuvinte.
5. Fie dată gramatica G= (VN, VT, P, S); VN={ S }, VT={ a },
P= { 1. S → aSa
2. S → a }
Limbajul generat de această gramatică este: L(G)= { a2n-1, n 1 }.
Să se scrie un program Prolog ce ar recunoaşte astfel de cuvinte.
6. Fie dată gramatica G= (VN, VT, P, S); VN={ S }, VT={ a },
P= { 1. S → aSa
2. S → aa }
Limbajul generat de această gramatică este: L(G)= { a2i, i 1 }.
Să se scrie un program Prolog ce ar recunoaşte astfel de cuvinte.
7. Fie dată gramatica G= (VN, VT, P, S); VN={ S }, VT={ a },
P= { 1. S → aaS
2. S → a }
Limbajul generat de această gramatică este: L(G)= { a2i-1, i 1 }.
Să se scrie un program Prolog ce ar recunoaşte astfel de cuvinte.
19
8. Fie dată gramatica G= (VN, VT, P, S); VN={ S }, VT={ a },
P= { 1. S → aaS
2. S → aa }
Limbajul generat de această gramatică este: L(G)= { a2j, j 1 }.
Să se scrie un program Prolog ce ar recunoaşte astfel de cuvinte.
9. Fie dată gramatica G= (VN, VT, P, S); VN={ S }, VT={ a },
P= { 1. S → Saa
2. S → a }
Limbajul generat de această gramatică este: L(G)= { a2j-1, j 1 }.
Să se scrie un program Prolog ce ar recunoaşte astfel de cuvinte.
10. Fie dată gramatica G= (VN, VT, P, S); VN={ S }, VT={ a },
P= { 1. S → Saa
2. S → aa }
Limbajul generat de această gramatică este: L(G)= { a2n, n 1 }.
Să se scrie un program Prolog ce ar recunoaşte astfel de cuvinte.
11. Fie dată gramatica G= (VN, VT, P, S); VN={ S }, VT={ x, y },
P= { 1. S → xSy
2. S → xy }
Limbajul generat de această gramatică este: L(G)= { xnyn, n 1 }.
Să se scrie un program Prolog ce ar recunoaşte astfel de cuvinte.
12. Fie dată gramatica G= (VN, VT, P, S); VN={ S, P, Q },
VT={ a, b, c, d, e, f },
P= { 1. S → aP
2. P → bP
3. P → cQ
4. Q → dQ
5. Q → e }
Limbajul generat de această gramatică este: L(G)= { abncdme, n 0, m 0 }.
Să se scrie un program Prolog ce ar recunoaşte astfel de cuvinte.
20
21