GRUPA I (predstavljanje iskaznih formula u programu, transformacije formula):

1) Napisati C++ program koji omogucava predstavljanje iskaznih formula koje
   ukljucuju veznike ~, /\, \/, u obliku sintaksnog stabla. Pretpostaviti da
   su konjunkcije i disjunkcije n-arne, tj. da se svaka od njih primenjuje
   na dve ili vise podformule. 

   a) Implementirati virtuelnu funkciju clanicu printFormula() za 
   prikazivanje formule na standardnom izlazu u uobicajenoj konkretnoj 
   sintaksi. 
   b) Napisati funkciju koja za datu CNF formulu predstavljenu u obliku
   liste listi (sto smo radili na casu) formira sintaksno stablo.
   c) Napisati program koji poziva funkciju pod b), a zatim prikazuje formulu
   pomocu funkcije iz dela pod a).
   (KOLOKVIJUM 2011, s tim sto su tamo konjunkcije i disjunkcije bile binarne)

2) Napisati program koji omogucava predstavljanje iskaznih formula u NNF-u.
   Pretpostaviti da konjunkcije i disjunkcije mogu biti n-arne. 
   
   a) Implementirati printFormula()
   b) Implementirati uopstenu zamenu A[l1-->F1, l2-->F2,...,ln-->Fn], gde
   se svaki literal li zamenjuje NNF formulom Fi.
   c) Napisati funkciju koja proverava da li je data formula u CNF-u.
   d) Napisati program koji testira funkcije pod a, b, c.
   (KOLOKVIJUM 2012, samo sa n-arnim veznicima).

3) Napisati program koji omogucava predstavljanje formula u CNF-u (u obliku
   liste klauza, gde je klauza lista literala, ili nekako drugacije).

   a) Implementirati prikaz date CNF formule na izlazu.
   b) Implementirati funkciju resolve() koja na dve klauze primenjuje metod
   rezolucije, ukoliko je to moguce, pri cemu proizvodi novu rezolventnu
   klauzu (npr. [-1 2 3], [-2 3 4], moze se primeniti pravilo rezolucije nad
   drugim literalom prve klauze i prvim literalom druge klauze, pri cemu se
   dobija nova klauza [-1 3 4]; obezbediti eliminisanje duplikata iz
   rezolvente).
   c) Pomocu funkcije iz dela pod b), implementirati metod rezolucije, tako
   sto se sistematski primenjuje metod rezolucije dokle god je to moguce,
   sve dok se ne izvede prazna klauza, ili se ne utvrdi da to nije moguce.
   d) Napisati program koji testira funkcije pod a, b, c.

4) Napisati program koji omogucava predstavljanje formula koje ukljucuju 
   unarni veznik ~, kao i binarne veznike \/, /\, =>. 

   a) Definisati uopstenu zamenu A[p1-->F1, p2-->F2,...,pn-->Fn], gde se
   iskazna varijabla pi zamenjuje formulom Fi.
   b) Definisati proceduru koja ispituje da li je jedna formula instanca
   druge. Formula G je instanca formule F, ako postoji uopstena zamena
   takva da je G = F[p1-->F1,...,pn->Fn].
   c) Napisati program koji testira gornje funkcije.
   
5) Napisati C++ program koji omogucava predstavljanje formula u obliku 
   sintaksnog stabla. Formule mogu sadrzati veznike ~, /\, \/, =>. 
   Pretpostaviti da formule ne sadrze logicke konstante. 
   a) implementirati prikaz na izlazu.
   b) implementirati funkciju koja formira kanonsku DNF formu za datu formulu
   F. Kanonska normalna forma se formira na sledeci nacin: posmatraju se sve
   valuacije u kojima je formula tacna (predstavljene kao konjunkcije
   literala koji su tacni u toj valuaciji), a zatim se napravi disjunkcija
   svih takvih konjunkcija. Npr, ako u formuli F imamo 3 varijable p1, p2, i
   p3, i ako su jedine dve valuacije u kojima je F tacna [p1, ~p2, p3], i
   [~p1, ~p2, ~p3], tada je kanonska DNF:
   
   (p1 /\ ~p2 /\ p3)  \/ (~p1 /\ ~p2 /\ ~p3).

   c) Napisati program koji testira ovu funkciju.
 
GRUPA II (Primene SAT resavaca):

6) Dat je pomeracki trobitni registar (p, q, r) i carry bit c. Obavlja se
sledeca operacija: najpre se sadrzaj registra obrce u ogledalu, zatim se
dobijeni sadrzaj pomera u desno kroz carry (sto znaci da vrednost bita c
dolazi na najvisi bit u registru, a najnizi bit iz registra se potiskuje u
c), nakon cega se sadrzaj registra ponovo okrene u ogledalu. Dokazati da se
nakon 4 primene ove slozene operacije registar (i carry bit) vraca u pocetno
stanje.
7) Dat je 4-bitni registar, nad kojim je definisana operacija potpunog
komplementa: bitovi registra se najpre komplementiraju, a zatim se tako
dobijeni sadrzaj sabere sa jedinicom. Dokazati da kada se dva puta primeni
ova operacija, dobija se pocetni broj.
8) Raja, Gaja i Vlaja su dobili od ujka Paje dve plave, dve crvene i dve zute 
lizalice, ali im je ujka Paja rekao da to bratski podele, tako da svako dobije
dve razlicite lizalice. Ako znamo da Raja nije uzeo plavu lizalicu, a da je Gaja
uzeo crvenu, ko je na kraju uzeo koje lizalice?
9) Ako od 4 djaka troje idu na takmicenje iz matematike, troje na takmicenje
iz hemije i troje na takmicenje iz fizike, dokazati da postoji djak koji ide
na sva tri takmicenja.
10) Ako od 4 djaka najvise 2 ide na takmicenje iz matematike, najvise 2 
na takmicenje iz fizike i najvise 3 na takmicenje iz hemije, dokazati da
postoji djak koji ide na najvise jedno takmicenje.

GRUPA III (Dedukcija):

11) Dokazati da je formula:

(p /\ q => r) <=> (p => (q => r))

a) teorema u sistemu prirodne dedukcije.
b) valjana formula (svodjenjem negacije na CNF, Cajtinovom transformacijom, 
   a zatim simulacijom DPLL algoritma, korak po korak).

12) Dokazati da je formula: 

(~B => (A => B)) /\ (~B => (A \/ B)) => B

a) teorema u sistemu prirodne dedukcije.
b) valjana formula (svodjenjem negacije na CNF, Cajtinovom transformacijom,
  a zatim simulacijom DPLL algoritma, korak po korak).

13) Dokazati da je formula:

(~B => ~A) => ((B \/ A) => B)

a) teorema u sistemu prirodne dedukcije.
b) valjana formula (svodjenjem negacije na CNF, Cajtinovom transformacijom,
  a zatim simulacijom DPLL algoritma, korak po korak).

14) Dokazati da je formula:

~((p => q) /\ (~r \/ s)) => ((p /\ ~q) \/ (r /\ ~s))

a) teorema u sistemu prirodne dedukcije.
b) valjana formula (svodjenjem negacije na CNF, Cajtinovom transformacijom,
  a zatim simulacijom DPLL algoritma, korak po korak).

