Programare Logică și Funcțională

Site de studiu pentru parțial

Învață Prolog prin tipare, nu prin probleme izolate. Fiecare exercițiu este etichetat cu conceptele pe care le exersează — din pagina unui concept poți vedea toate exercițiile care îl folosesc.


Concepte

Arbori binari
Reprezentare recursivă a arborilor binari în Prolog și cele trei parcurgeri clasice.
Aritmetică și egalitate (is, =, ==, =:=)
În Prolog există mai multe simboluri pentru egalitate, fiecare cu alt scop. E una dintre distincțiile de mare confuzie din breviar.
Calculul propozițional în Prolog
Reprezentarea formulelor propoziționale ca termeni Prolog, evaluarea într-o valuare, testul de tautologie și rezoluția pentru Subiectul III.
Cut (!) și cazuri de bază
Predicatul cut (!/0) oprește backtracking-ul pe clauzele imediat următoare. E indispensabil pentru a lăsa cazul de bază să „câștige” față de cazul recursiv.
Căutare și drumuri (BFS, puzzle-uri)
Când avem un succesor și un obiectiv, căutăm drumuri de la nodul de start la obiectiv. Pattern: extindere + BFS cu coadă.
Fapte, reguli, baze de cunoștințe
Cum scriem un program în Prolog: adevăruri (facts) + reguli de inferență.
Negația ca eșec (not/1, \+)
În universul închis al Prolog-ului, „nu se poate demonstra P” este tratat ca „P e fals”. Așa implementăm negația — prin eșec.
Predicate predefinite pe liste
Lista de predicate din biblioteca standard SWI-Prolog pe care o folosim zilnic: member, append, select, nth0, length, reverse, permutation, predsort, union, numlist.
Recursivitate pe liste
Pattern-ul de bază pentru orice prelucrare iterativă în Prolog: caz de bază pentru lista vidă, caz recursiv pentru [H | T].
Relații recursive pe baze de cunoștințe
Când o relație în baza de cunoștințe se închide tranzitiv — strămoș, drum, predecesor. Două clauze: caz direct și caz recursiv.
Unificare
Unificarea este mecanismul central prin care Prolog rezolvă interogări. La seminar: algoritmul de unificare. În Prolog: predicatul unify_with_occurs_check/2.
findall / bagof / setof (generate-and-test)
Colectează toate soluțiile unei interogări într-o listă. Cel mai important pattern din parțial.

Exerciții

Predicate de familie
Laboratorul 1, Exercițiul 1
ancestor_of/2 — strămoș
Laboratorul 1, Exercițiul 2
distance/3 — distanță în plan
Laboratorul 1, Exercițiul 3
write_n/2 — triunghi la STDOUT
Laboratorul 1, Exercițiul 4
min/3 — minimul a două elemente
Laboratorul 1, Exercițiul 5
pythagorean_triple/3 — triunghi dreptunghic în plan
Laboratorul 1, Exercițiul 6
fib/2 — Fibonacci, varianta ineficientă și cu memoizare
Laboratorul 2, Exercițiul 1 (recapitulativ)
concat_lists/3 — concatenare manuală
Laboratorul 2, Exercițiul 10
remove_duplicates/2 — elimină duplicatele
Laboratorul 2, Exercițiul 11
list_length/2 — lungimea unei liste
Laboratorul 2, Exercițiul 2
list_sum/2 — suma elementelor
Laboratorul 2, Exercițiul 3
elements_of/2 — apartenență la listă
Laboratorul 2, Exercițiul 4
all_a/1 și all_symb/2 — listă formată dintr-un singur simbol
Laboratorul 2, Exercițiul 5
trans_a_b/2 — translatează a-uri în b-uri
Laboratorul 2, Exercițiul 6
scalarMult/3 — înmulțire cu scalari
Laboratorul 2, Exercițiul 7
dot/3 — produs scalar
Laboratorul 2, Exercițiul 8
max/2 — elementul maxim
Laboratorul 2, Exercițiul 9
vars/2 — mulțimea variabilelor unei formule
Laboratorul 3, Exercițiul 1
val/3 — valoarea unei variabile într-o evaluare
Laboratorul 3, Exercițiul 2
bnon/2, band/3, bor/3, bimp/3 — operații pe {0, 1}
Laboratorul 3, Exercițiul 3
eval/3 — evaluarea unei formule într-o valuare
Laboratorul 3, Exercițiul 4
evals/3 — evaluare pe o listă de valuări
Laboratorul 3, Exercițiul 5
evs/2 — toate valuările pe o mulțime de variabile
Laboratorul 3, Exercițiul 6
all_evals/2 — valorile formulei pe toate valuările
Laboratorul 3, Exercițiul 7
taut/1 — test de tautologie
Laboratorul 3, Exercițiul 8
Exerciții de unificare
Laboratorul 4, Exercițiul 1
Word puzzle — FLOWERS crossword
Laboratorul 4, Exercițiul 2
path/2 — drum pe un graf orientat
Laboratorul 4, Exercițiul 3
divisorsPairs/3 — toate perechile divizor
Laboratorul 5, Exercițiul 1
oddIndexes/2 — elementele de pe poziții impare
Laboratorul 5, Exercițiul 1 (partea 2)
breadthfirst/2, solve/2 — BFS pe graf
Laboratorul 5, Exercițiul 2
Zebra puzzle — cine deține zebra?
Laboratorul 5, Exercițiul 3
Arbori binari — parcurgeri
Laboratorul 5, Exercițiul 4
employee_with_good_salary/3
Model parțial, Exercițiul 1
employee_average_salary/2
Model parțial, Exercițiul 2
sort_employee_average_salary/2
Model parțial, Exercițiul 3
Dutch Royal Family — parent, ruler, predecessor
Model parțial, Exercițiul 4
minimumPaths/2 — drumuri BFS de lungime minimă
Model parțial, Exercițiul 6
palindrome/1 — verifică palindrom
Model parțial, Exercițiul 7
Angajați pe departament — 3 interogări findall
Model parțial, Exercițiul 8
literalForResolution/3 — literal pentru rezoluție
Șablon parțial (2026-04-22), Subiectul III a) [3 puncte]
rezolvent/3 — rezolventul a două clauze
Șablon parțial (2026-04-22), Subiectul III b) [7 puncte]
splitListEvenOdd/3 — separă pare și impare
Șablon parțial (2026-04-22), Subiectul II a) [2 puncte]
findSublist/3 — prima sublistă contiguă cu sumă dată
Șablon parțial (2026-04-22), Subiectul II b) [5 puncte]
solution/3 — sublistă de pare sau impare cu constrângeri
Șablon parțial (2026-04-22), Subiectul II c) [3 puncte]
wroteBy/2 — cărțile unui autor
Șablon parțial (2026-04-22), Subiectul I a) [2 puncte]
publishedMathPhilosophy/1 — editurile de matematică sau filosofie
Șablon parțial (2026-04-22), Subiectul I b) [2 puncte]
editionAfterYear/2 — cărți cu ediții după un an
Șablon parțial (2026-04-22), Subiectul I c) [3 puncte]
countByCountries/1 — câte cărți publicate pe fiecare țară
Șablon parțial (2026-04-22), Subiectul I d) [3 puncte]