2SAT
Notacija
jest logička operacija NOT (NE).
jest logička operacija AND (I).
jest logička operacija OR (ILI).
ili označava logičku ekvivalenciju.
predstavlja logičku implikaciju.
Uvod
SAT (Boolean satisfiability problem) jest problem pridruživanja istine ili laži varijablama tako da se zadovolji neka Booleova funkcija zapisana u kanonskom obliku produkta maksterma. To se preciznije naziva konjunktivna normalna forma.
2-SAT poseban je slučaj SAT-a kada se svaki maksterm sastoji od dvije varijable.
Iznad je napisan primjer funkcije koju je potrebno zadovoljiti. Cilj nam je dodijeliti varijablama vrijednosti istinu ili laž, tako da izraz naposljetku bude istinit. Primjetimo da to znači da u svakoj zagradi barem jedan operand operacije mora biti istinit. Ako je taj operand oblika , tada mora vrijediti . Ako pak je taj operand oblika , onda mora biti .
Znamo:
Dakle možemo konstruirati usmjereni graf s po dva vrha za svaku varijablu: jedan za nju samu, i još jedan za njezin komplement. Povlačimo brid iz jednog vrha u drugi kada vrijednost prvog vrha implicira vrijednost drugog vrha u zadanoj formuli. Na donjoj je slici konstruiran takav graf za gore navedeni primjer.
Rješenje
2SAT problem ima rješenje ako i samo ako njegov zapis kao gore definirani graf s implikacijama nema i u istoj strogo povezanoj komponenti, za svaku varijablu .
U protivnom postoji barem jedno rješenje, koje je moguće dobiti sljedećim postupkom:
- Konstruiramo usmjereni graf kao što je gore opisano
- Odredimo strogo povezane komponente grafa
- Kondenziramo graf, odnosno u svaku strogo povezanu komponentu stegnemo da dobijemo , u kojem svaki vrh predstavlja jednu strogo povezanu komponentu iz . U grafu postoji brid iz u ako postoji brid u takav da je i .
- Topološki sortiramo vrhove u i rješenje zapišemo u neku listu
- Obrnutim redoslijedom prolazimo kroz i obrađujemo komponentu po komponentu:
- Svi vrhovi u komponenti moraju biti iste logične vrijednosti, znači ili su svi istiniti ili su svi lažni.
- Ako barem jedan vrh nema pridruženu logičnu vrijednost, tada ćemo svim vrhovima u komponenti pridružiti istinu. Ako u nekom vrhu piše , postavljamo . Ako pak u nekom vrhu piše , tada postavljamo . Time postižemo da je svaki vrh u komponenti istinit, pa ne može doći do lažne implikacije .
- Ovo smo radili obrnutim topološkim redoslijedom jer, ako postoji put od komponente do komponente , želimo prvo postaviti komponentu da bude istinita. Ovime sprječavamo da dođe do lažne implikacije .