Helyességbizonyító eszközök alkalmazása funkcionális programok esetén Tejfel Máté, matej@inf.elte.hu ELTE Informatikai Kar Programozási Nyelvek és Fordítóprogramok Tanszék 2.604-es szoba
Programhelyesség Mikor helyes egy program? Megfelel az elvárásoknak (a specifikációnak). Elvárások - felhasználói - tervezői Program tulajdonságai határozzák meg
Programhelyesség Hogyan vizsgálható, ellenőrizhető? - szimuláció, tesztelés - modell ellenőrzés (model checking) - helyességbizonyítás (verification)
Szimuláció, tesztelés a szimulációt a rendszer valamilyen absztrakcióján, modelljén végezzük a tesztelést az adott rendszeren, programon végezzük adott inputok elvárt válasz nem képes lefedni minden esetet szoftveresen segíthető költséghatékony, sok hibát megtalál
Modell ellenőrzés a program egy modelljének tulajdonságait vizsgálja csak véges állapothalmaz esetén működik (pl. hálózati protokollok, hardware kontrollerek) általában teljes keresést végez az állapottéren igen válasz vagy ellenpélda
Modell ellenőrzés nem használható minden esetben nem igényel magas fokú szakértelmet automatikus Pl.: NuSMV http://nusmv.irst.itc.it/
Helyességbizonyítás axiómák + levezetési szabályok + a program egy absztrakciója (általában funkcionális) magas fokú (matematikai, logikai) szakértelmet igényel bonyolult, időigényes csak részben automatizálható
Helyességbizonyítás CoQ Isabelle/Hol PVS http://coq.inria.fr/ http://isabelle.in.tum.de/ http://www4.in.tum.de/~nipkow/LNCS2283/ PVS http://pvs.csl.sri.com/
Programszintézis helyes program előállításának alternatív módszere specifikációból kiindulva építjük fel a programot nem egy meglévő programot vizsgálunk pl.: B nyelv J.-R. Abrial. The B-Book: Assigning Programs to Meanings. Cambridge University Press, 1996.
Helyességbizonyítás Program Reprezentáció Tulajdonság Axiómák Levezetési szabályok Bizonyítás
Sparkle a funkcionális Clean nyelv helyességbizonyítója a reprezentációs nyelv is Clean (Core-Clean) reprezentálás automatikus szabad forráskódú ( Clean nyelvű)
Clean Egyszerű gyakorlati példák …
Példa take :: Int ![a] -> [a] take n [x:xs] | n > 0 = [x: take (n-1) xs] = [] take n [] drop :: Int !u:[.a] -> u:[.a] drop n [x:xs] | n > 0 = drop (n-1) xs = [x:xs] drop n []
Sparkle „tanácsadó” mechanizmus 42 levezetési szabály (Clean specifikus pl. redukció, indukció) COQ bizonyító rendszer alapján jól kezelhető GUI
Tulajdonságok leírása elsőrendű logika egyenlőség predikátumok helyett clean függvények Pl.: Paros(x) predikátum helyett paros logikai függvény definíciója és paros(x) = True ellenőrzése
Tulajdonságok leírása TRUE, FALSE azonosan igaz, azonosan hamis kifejezés Sparkle tulajdonságokban (pl.: FALSE -> TRUE) (egyenlőségvizsgálat eredménye) True, False a Bool típus két lehetséges értéke Clean-ben
Tulajdonságok leírása negáció ~ és /\ vagy \/ implikáció -> ekvivalencia <-> univerzális kvantor [x::Típus] egzisztenciális kvantor {x::Típus}
Definiáltság Clean lusta kiértékelése miatt kezelni kell _|_ („bottom”) érték esetszétválasztásnál automatikusan plusz lehetőség
Példa take :: Int ![a] -> [a] take n [x:xs] | n > 0 = [x: take (n-1) xs] = [] take n [] drop :: Int !u:[.a] -> u:[.a] drop n [x:xs] | n > 0 = drop (n-1) xs = [x:xs] drop n []
Példa ~(n = _|_) -> take n xs ++ drop n xs = xs
Példa Nincs szabad változó (univerzális kvantálás automatikus) ~(n = _|_) -> take n xs ++ drop n xs = xs Nincs szabad változó (univerzális kvantálás automatikus) [n][xs] ~(n = _|_) -> take n xs ++ drop n xs = xs
Tételek (theorems) tulajdonságok + bizonyítás szekciókba szervezhetők (.sec file-ok) a szekciók elmenthetők (Section könyvtár) kivéve „main” szekció, munkakönyvtár újrafelhasználás
Axiómák, beépített tételek StdEnv-ben leírt függvényekre Section könyvtár négy előre definiált eleme kevés axióma (int típusra) néhány előre definiált tétel (logikai szabályok, tételek boolean, int, list típusra) bizonyítások alacsony szintűek
Bizonyítás bizonyítási fa cél csúcsai – célok élei – levezetési szabályok cél bizonyítandó állítás környezet deklarált változók lokális hipotézisek
Levezetési szabályok (tactics) 42 beépített szabály célokból új célok listája érvényes az új célokból logikailag következik a régi cél
Introduce a bizonyítandó állítás univerzálisan kvantált változók implikációs előtagok cél környezet deklarált változók hipotézisek (dedukciós tétel)
Példa
Introduce n xs H1.
Rewrite cél környezet egyenlőség hipotézisek alapján bizonyítandó állítás változó helyetesítés bármelyik irányban előfordulásokat akár külön is
Példa
Rewrite -> All H1.
Apply egy már bizonyított tény vagy egy hipotézis felhasználása implikáció előtag illesztése egy hipotézisre utótag illesztése a bizonyítandó állításra
Példa
Apply H2.
Apply H2 to H1.
Cut egy már bizonyított tény vagy egy hipotézis felhasználása a bizonyítandó állításban implikációs előtagként dedukciós tétel
Példa
Cut H1.
Assume egy új állítás felvétele hipotézisként a cél környezetébe új célként bizonyítani kell (az eredeti környezetben)
Példa
Assume x >= 0.
Reduce függvénydefiníciók behelyettesítése a bizonyítandó állításban egyes függvényekre külön, vagy mindre együtt különböző mélységig
Példa
Reduce NF (take 1).
Induction strukturális indukció (univerzálisan kvantált válozóra) adatszerkezet alapján _|_ ág
Példa
Induction xs.
Definedness definiáltságot kezeli ha a rendszer képes kikövetkeztetni a definiáltságot (definiálatlanságot), akkor használható
„Definedness.”-el bizonyítható
Példa
A -al elkezdjük a bizonyítást
Tanácsadó rendszer bizonyítási lépéseket javasol valószínűség (mennyire használható) nem mindig tud tanácsot adni nem mindig ad jó tanácsot adott példánál jól használható megjegyzés: a példánál ne használjuk a beépített „list.sec” szekciót, mert ott megtalálható a bizonyítás
Tanácsadó rendszer automatikus bizonyításra is használható általában kevés sikerrel adott példa automatikusan is bizonyítható
CPPCC összefoglaló The Certified Proved-Property-Carrying Code (CPPCC): három fő komponens. 1. A mobil kód előállítója tulajdonságokat és bizonyítást rak a kód mellé. A kód felhasználója csak ellenőrzés után hajtja végre a kódot. A hitelesítő leegyszerűsíti a felhasználó munkáját.
Hitelesített kódok könyvtára CPPCC architektúra Mobil kód előállítója Helyességbizonyító Hálózat Forráskód Kód Típuskód Tulajdonságok Bizonyítás Hitelesített kódok könyvtára Kód Típuskód Tulajdonságok Zárjegy Hitelesítő Ellenőrző Mobil kód felhasználója Engedélyező
Kód előállító / küldő komponens Függvénykifejezés Típusleírás Tulajdonságok Fordítóprogram Helyességbizonyító Típus- kód Absztrakt gépi kód Kódolt tulajdonságok Forráskód Bizonyítás
Hitelesítő komponens Típus- kód Absztrakt gépi kód Kódolt tulajdonságok Forráskód Bizonyítás Fordításellenőrző Helyességellenőrző Hitelesítő Típus- kód Absztrakt gépi kód Kódolt tulajdonságok Zárjegy
Fogadó/ engedélyező komponens Típus- kód Absztrakt gépi kód Kódolt tulajdonságok Zárjegy Felhasználó program Zárjegyvizsgáló Dinamikus összeszerkesztő Követel- mények Engedélyező Típusegyeztető Típus- minták Alkalmazás
Funkcionális programok helyessége Elosztott funkcionális programok helyessége OTKA T037742 kutatási projekt http://aszt.inf.elte.hu/~fun_ver