Concepte
12 concepte acoperă tot ce trebuie pentru parțial. Fiecare leagă spre exercițiile care îl exersează.
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.