10 ROZHODOVACÍ PROCEDURY A VERIFIKACE PAVEL SURYNEK, KTIML HTTP://KTIML.MFF.CUNI.CZ/~SURYNEK/NAIL094 Matematicko-fyzikální fakulta Univerzita Karlova v Praze 1
ROZHODOVÁNÍ TEORIÍ POMOCÍ SAT ŘEŠIČE (SMT) 2 Rozhodovací procedury a verifikace, 10. přednáška
SAT řešič a obecné teorie (1) Budeme chtít využít efektivity SAT řešiče při rozhodování obecných teorií. Nechť T je nějaká teorie (například logika s rovností a neinterpretovanými funkcemi). Budeme předpokládat existenci rozhodovací procedury pro konjunktivní fragment teorie T (rozhodované formule mají tvar konjunkce literálů) rozhodovací procedura bude značena DECIDE T. Cílem je zkonstruovat rozhodovací proceduru pro T, která bude vytvořena integrací rozhodovací procedury DECIDE T a SAT řešiče. Obě technologie budou kooperovat SAT řešič vybírá literály, které je nutno splnit, aby byla splněna booleovská struktura formule. Rozhodovací procedura DECIDE T kontroluje, zda je výběr provedený SAT řešičem konzistentní s teorií T. Výhodou je efektivita, obecnost a modularita 3 Rozhodovací procedury a verifikace, 10. přednáška
SAT řešič a obecné teorie (2) Teorie T bude bezkvantifikátorová teorie se signaturou Σ. Výrokové kódování literálů: Každému Σ-literálu l bude přiřazena výroková proměnná e(l), kterou budeme nazývat výrokovým kódem literálu l (propositional encoder). Výrokové kódování formulí v NNF tvaru: Kódování lze rozšířit na celou formuli, nechť φ je Σ-formule v NNF tvaru, potom e(φ) bude označovat výrokovou formuli, která vznikla nahrazením každého literálu ve φ jeho výrokovým kódem. Formule e(φ) se nazývá výroková kostra formule φ (propositional skeleton). Př.: Σ-literál x=y bude kódován výrokovou proměnnou e(x=y). φ := (x = y) (x = z) nechť je Σ-formule. Výroková kostra formule φ tedy je e(φ) := e(x = y) e(x = z). SAT řešič bude pracovat nad (postupně modifikovanou) výrokovou kostrou rozhodované formule. 4 Rozhodovací procedury a verifikace, 10. přednáška
Integrace SAT řešiče a DECIDE T (1) Nechť T je teorie rovnosti. Uvažme formuli φ v negačně normálním tvaru (NNF), kde: φ := (x = y) ((y = z x z) (x = z)). Nejprve je určena výroková kostra formule φ: e(φ) := e(x = y) (e(y = z) e(x z)) e(x = z)). Jelikož jsou kódovány literály a nikoli atomy, e(φ) neobsahuje žádné negace a je tedy triviálně splnitelná. Budeme používat výrokovou formuli B, která se bude postupně vyvíjet. Na začátku položíme B = e(φ). Formule B je předložena SAT řešiči k vyřešení. 5 Rozhodovací procedury a verifikace, 10. přednáška
Integrace SAT řešiče a DECIDE T (2) Přepokládejme, že SAT řešič vrátil splňující ohodnocení α formule B (tedy výrokové kostry), kde: α := { e(x = y) True, e(y = z) True, e(x z) True, e(x = z) False } Rozhodovací procedura DECIDE T bude nyní rozhodovat, zda je konjunkce literálů, která odpovídá ohodnocení výrokových kódů, splnitelná. Množinu literálů, jež odpovídá ohodnocení α bude označována jako Th(α): Literál l je zařazen do Th(α), jestliže α(e(l)) = True. Literál l je zařazen do Th(α), jestliže α(e(l)) = False. Th^(α) bude značit konjunkci literálů v Th(α); tedy Th^(α) = lth(α) l. Konkrétně: Th^(α) = (x = y) (y = z) (x z) (x = z) 6 Rozhodovací procedury a verifikace, 10. přednáška
Integrace SAT řešiče a DECIDE T (3) Rozhodovací procedura DECIDE T detekuje, že Th^(α) = (x = y) (y = z) (x z) (x = z) není splnitelná. Th^(α) je tím pádem validní. K formuli B je přidána (konjunkcí) výroková kostra e(th^(α)), kde: e(th^(α)) := (e(x = y) e(y = z) e(x z) e(x = z)). Tato formule (blokující klauzule či lemma) zakazuje ohodnocení α, to znamená, že případné nové splňující ohodnocení B musí být různé od α. Obecně lemma označujeme jako t. Uvedená volba blokující formule není nutně nejlepší vzhledem k urychlení prohledávání. SAT řešiči předložíme k vyřešení formuli B po modifikaci: α := { e(x = y) True, e(y = z) True, e(x z) False, e(x = z) True } Tedy Th^(α ) = (x = y) (y = z) (x z) (x = z). 7 Rozhodovací procedury a verifikace, 10. přednáška
Integrace SAT řešiče a DECIDE T (4) Nyní je vidět, jak vypadá integrace SAT řešiče a rozhodovací procedury pro teorii T DECIDE T. SAT řešič α e(t) Th^(α) DECIDE T Procedura DECIDE T detekuje, že formule: Th^(α ) = (x = y) (y = z) (x z) (x = z) je splnitelná. Ohodnocení, které splňuje Th^(α ) rovněž splňuje původní formuli s NNF výrokovou strukturou: φ = (x = y) ((y = z x z) (x = z)). Uvedený proces lze několika směry vylepšit: Není třeba čekat na úplné ohodnocení formule B. Když předložíme proceduře DECIDE T formuli Th^(β), kde β je částečné ohodnocení, a DECIDE T odpoví, že Th^(β) je nesplnitelná. Potom je lemma t silnější, neboť blokuje všechna ohodnocení, která rozšiřují β. t 8 Rozhodovací procedury a verifikace, 10. přednáška
Integrace SAT řešiče a DECIDE T (5) Pokračování vylepšení: Význam může mít i situace, když DECIDE T odpoví, že Th^(β) je splnitelná pro částečné ohodnocení β. V takovém případě může DECIDE T odvodit nové implikace. Situaci ilustrujeme na příkladu: β = { e(x = y) True, e(y = z) True } Rozhodovací procedura DECIDE T obdrží formuli: Th^(β) = (x = y) (y = z) A může (pokud je k tomu uzpůsobená) odvodit, že Th^(β) implikuje formuli (x = z), tuto informaci je možno vrátit zpět do SAT řešiče. Předpokládejme, že DECIDE T bude toto umět. Tedy ohodnocení β (díky zpětně propagované informaci) implikuje e(x=z)true a e(x z)false. Toto tzv. propagování teorií (theory propagation) lze přidat ke standardní BCP. 9 Rozhodovací procedury a verifikace, 10. přednáška
Líné kódování (1) Nechť φ je Σ-formule ve tvaru NNF: Množina všech literálů formule φ se bude značit jako lit(φ). Zformalizujeme rozhodovací proces demonstrovaný na předchozím příkladě. Následující algoritmus odpoví, zda je vstupní formule φ splnitelná. function LAZY-BASIC(φ): boolean B e(φ) while True do (result,α) SOLVE-SAT(B) if not result then return False else (result,t) DECIDE T (Th^(α)) if result then return True B B e(t) function SOLVE-SAT(B): (boolean,assignment) Rozhodne výrokovou formuli, vrátí indikátor splnitelnosti, případně splňující ohodnocení. φ je nesplnitelná φ je splnitelná function DECIDE T (ψ): (boolean,formula) Rozhodne konjunktivní Σ- formuli ψ v teorii T, vrátí indikátor splnitelnosti, případně lemma. 10 Rozhodovací procedury a verifikace, 10. přednáška
Líné kódování (2) Na formuli t, kterou vrací DECIDE T, jsou kladeny jisté podmínky: (i) Formule t musí být validní v teorii T (tedy T-validní). Př.: Nechť T je teorie rovnosti, pak formule ((x = y) (y = z)) (x = z) je validní v T. (ii) Formule t může obsahovat pouze atomy, které se vyskytují v původní vstupní formuli φ. (iii) Výrokový kód formule t musí zakazovat ohodnocení α; tedy e(t) není splněna ohodnocením α. Podmínka (i) je postačující pro korektnost algoritmu (odpoví-li, odpoví správně), (ii) a (iii) pak garantují, že algoritmus vždy skončí (podmínka (iii) zaručuje, že se žádné ohodnocení nebude opakovat). 11 Rozhodovací procedury a verifikace, 10. přednáška
Integrace líného kódování a DPLL (1) Inkrementální splnitelnost (incremental satisfiability): Nechť B i označuje formuli B v i-té iteraci funkce LAZY-BASIC. Platí, že podmínka reprezentovaná formulí B i+1 je silnější než B i pro každé i=1,2,... Každou naučenou klauzuli, kterou SAT řešič odvodil při řešení B i pro i{1,2,...}, lze použít při řešení B j pro j > i. Jedná se o speciální případ inkrementální splnitelnosti - klauzule jsou pouze přidávany (obecně se mohou klauzule i odebírat, pak je otázka, které naučené klauzule mohou být znovu použity). Volání SOLVE-SAT ve funkci LAZY-BASIC lze nahradit voláním inkrementálního SAT řešiče zvýšení efektivity. Lepší variantou je integrovat rozhodovací proceduru pro teorii T (tedy funkci DECIDE T ) přímo do procedury DPLL (na vstupu je opět Σ-formule φ ve tvaru NNF). 12 Rozhodovací procedury a verifikace, 10. přednáška
Integrace líného kódování a DPLL (2) function LAZY-DPLL(φ): boolean B CNF(e(φ)) if BCP(B,α)=NULL then return False while True do (x,v) SELECT(φ,α) if (x,v)=null then (result,t) DECIDE T (Th^(α)) if result then return True B B e(t) while not result where (result,α) BCP(B,α) do (level,φ) ANALYZE-CONFLICT(B,α) if level < 0 then return False else BACK-TRACK(B,level) else α α {α(x)=v} while not result where (result,α) BCP(B,α) do (level,φ) ANALYZE-CONFLICT(B,α) if level < 0 then return False else BACK-TRACK(B,level) 13 Rozhodovací procedury a verifikace, 10. přednáška φ je nesplnitelná φ je splnitelná φ je nesplnitelná φ je nesplnitelná function CNF(B): formula Převede zadanou formuli na tvar CNF. procedure BACK-TRACK (B, level) Vrátí se na zadanou úroveň rozhodování, zruší pozdější rozhodnutí. function SELECT (B,α): (variable, boolean) Vybere neohodnocenou proměnnou vzhledem k α a její ohodnocení; vrací NULL, když všechny proměnné ohodnoceny
Integrace líného kódování a DPLL (3) Algoritmus je možné dále vylepšit, uvažujme formuli φ, která obsahuje celočíselnou proměnnou x 1 a literály x 1 10 a x 1 <0 (mimo jiné). Předpokládejme, že bylo vybráno ohodnocení e(x 1 10) True a e(x 1 <0) True. Rozhodovací procedura DECIDE T pro T by ihned detekovala nesplnitelnost pro konjunkci těchto dvou literálů. Ovšem DECIDE T je zavolána až v okamžiku, kdy ohodnocení výrokových proměnných je úplné. Tedy ohodnocování následující po ohodnocení e(x 1 10) True a e(x 1 <0) True představuje zbytečnou práci. Rozhodovací proceduru DECIDE T by bylo vhodné volat už pro částečná ohodnocení výrokových kódů: Částečná ohodnocení, která nelze rozšířit na úplná splňující, mohou být včas zakázána. Implikovaná ohodnocení mohou být vrácena zpět SAT řešiči. Př.: Jakmile e(x 1 10) True, může DECIDE T odvodit, že e(x 1 <0) musí být False. 14 Rozhodovací procedury a verifikace, 10. přednáška
Pokročilejší integrace s DPLL (1) Na vstupu je opět Σ-formule φ ve tvaru NNF, algoritmus odpoví, zda je φ splnitelná function DPLL T (φ): boolean B CNF(e(φ)) if BCP(B,α)=NULL then return False while True do (x,v) SELECT(φ,α) if (x,v)=null then return True α α {α(x)=v} do while not result where (result,α) BCP(B,α) do (level,φ) ANALYZE-CONFLICT(B,α) if level < 0 then return False else BACK-TRACK(B,level) (ignoredresult,t) DECIDE T (Th^(α)) B B e(t) while t True 15 Rozhodovací procedury a verifikace, 10. přednáška φ je nesplnitelná Zde dojde k propagaci teorie T do SAT řešiče. φ je splnitelná, α je úplné ohodnocení. φ je nesplnitelná Na formuli t se kladou další podmínky, aby byla zaručena konečnost algoritmu.
Pokročilejší integrace s DPLL (2) Podmínky, které musí splňovat odvozená formule t: Formule t musí být implikována φ a musí se omezovat na atomy vyskytující se v φ. Jestliže Th^(α) je nesplnitelná, potom e(t) musí zakazovat ohodnocení α. Jestliže Th^(α) je splnitelná, potom je potřeba splnit jednu ze dvou následujících podmínek, aby byla zajištěna konečnost algoritmu: (i) e(t) je vynucující klauzule (konfliktní klauzule taková, že obsahuje právě jeden literál z aktuální rozhodovací úrovně), po přidání e(t) k B je v rámci volání BCP ohodnocen kód nějakého literálu. (ii) Když DECIDE T nedokáže najít formuli t, že e(t) je vynucující klauzule, pak t i e(t) jsou ekvivalentní hodnotě True. Pokud jsou všechny výrokové proměnné ohodnocené a Th^(α) je splnitelná, potom nastane případ (ii). 16 Rozhodovací procedury a verifikace, 10. přednáška
Pokročilejší integrace s DPLL (3) Uvažujme příklad, kdy vstupní formule φ obsahuje dva literály: x 1 10 a x 1 < 0 pro celočíselnou proměnnou x 1. Máme tedy dva výrokové kódy e(x 1 10) a e(x 1 < 0). Po ohodnocení α = {e(x 1 < 0) True}, procedura DECIDE T detekuje, že (x 1 10) je implikovaná, tedy: t = (x 1 10) (x 1 < 0) je T-validní formule. Odpovídající vynucující klauzule vzhledem k ohodnocení α tedy je: e(t) = e(x 1 10) e(x 1 < 0). Po přidání e(t) k formuli B dojde k okamžitému odvození e(x 1 < 0) (a možná k dalším odvozením). Poznámka: Používají se dvě varianty procedury DECIDE T, jedna varianta v rámci algoritmů LAZY-BASIC a LAZY-DPLL generuje blokující klauzuli, druhá varianta v rámci DPLL T, která generuje blokující klauzule, které jsou zároveň vynucující. 17 Rozhodovací procedury a verifikace, 10. přednáška