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.
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.
4
Lucrare de laborator Nr.3.
Prelucrarea listelor în limbajul PROLOG. Definiţii recursive.
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.
6
Lucrare de laborator Nr.4.
Prelucrarea listelor în limbajul PROLOG. Definiţii recursive.
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.
7. Să se scrie predicatul care verifică dacă o listă este prefixul altei liste.
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.
16. Să se scrie predicatul care elimină dintr-o listă fiecare a doua apariţie al
unui element dat.
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ă.
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].
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]] .
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] .
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.
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.
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.
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.
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