Szerkesztő:Kovacsshotput/próbalap

A Hoare-logika

szerkesztés

A Hoare-logika(más néven Floyd-Hoare-logika vagy a Hoare-szabályok) ez egy olyan formális rendszerrel amely logikai szabályok halmazát tartalmazza a számítógépes programok helyességének szigorú bizonyítására.Tony Hoare,brit számítógéptudós és logikus dolgozta ki 1969-ben, majd később finomították Hoare és más kutatók. [1] Az eredeti ötletek Robert W. Floyd,munkájának hatására születtek, aki hasonló rendszert publikált[2] folyamatábrákhoz.

Hoare hármas

szerkesztés

A Hoare-logika központi eleme a Hoare hármas. Ez a hármas leírja, hogy a kódrészlet végrehajtása hogyan változtatja meg a számítás állapotát. A Hoare hármas formailag

 

ahol   és   állítások és   pedig egy parancs.[note 1]  -t nevezzük előfeltételnek és  -t pedig utófeltételnek: amikor az előfeltétel teljesül, a parancs végrehajtása teljesíti az utófeltételt. Az állítások predikátumlogikai formulák.

A Hoare-logika biztosít axiómákat és következtetési szabályokat egy egyszerű imperative programozási nyelv valamennyi konstrukciójához. Az eredeti Hoare-kutatásokban szereplő egyszerű nyelv szabályai mellett azóta számos más nyelvi konstrukcióhoz készítettek szabályokat Hoare és más kutatók. Vannak szabályok concurrency, eljárásokhoz, ugrásokhoz, és mutatókhoz.

Részleges és teljes helyesség

szerkesztés

Az alapvető Hoare-logikával csak a részleges helyesség bizonyítható. A teljes helyesség külön bizonyítást igényel a határokra vonatkozóan, amelyet kiterjesztett verziójú While-szabállyal vagy külön bizonyítással lehet megadni.[3] Így egy Hoare-hármas intuitív értelmezése a következő: Ha   igaz a számítás állapotára a  , végrehajtása előtt, akkor a   igaz lesz , vagy,   nem terminálódik. Utóbbi esetben nincs "után", ezért a   bármely megállapítás lehet. Valójában a   választható hamis értékűnek annak kifejezésére, hogy   nem határolódik.

A "terminálás" itt és a cikk további részében a számítás végső befejezését jelenti a széles értelmezésben, ami azt jelenti, hogy az eljárás végső soron befejeződik, és az örökké tartó ciklusok hiányát jelenti; nem jelenti a megvalósítási korlátok megsértése (pl. nullával való osztás) hiányát, ami korai programleálláshoz vezethet. Hoare 1969-es cikkében szűkebb terminálási fogalmat használt, amely a megvalósítási korlátok hiányát is magában foglalta, és széles értelmezésű terminálás mellett érvelt, mivel az megőrzi az állítások megvalósításfüggetlenségét:[4]


„A másik hiányosság az idézett axiómákban és szabályokban az, hogy nem nyújtanak alapot egy program sikeres leállásának bizonyításához. A leállás meghiúsulhat egy végtelen ciklus miatt, vagy az implementáció által meghatározott határértékek megsértése miatt, például a numerikus operandusok tartománya, a tároló mérete vagy egy operációs rendszer időkorláta miatt. Ezért a “ ” jelölést úgy kell értelmezni, hogy “amennyiben a program sikeresen leáll, az eredményeinek tulajdonságai a   által leírtak szerinti.” Viszonylag könnyű azzal módosítani az axiómákat, hogy ne lehessen velük megjósolni a nem leálló programok “eredményeit”, azonban az axiómák használata mostantól függene az implementáció sok függő tulajdonságától, például a számítógép sebességétől és méretétől, a számok tartományától és az overflow technika választásától. A végtelen ciklusok elkerülésének bizonyításán kívül valószínűleg jobb a program “feltételes” helyességét bizonyítani, és a végrehajtás megszakításakor az implementáció figyelmeztetésére támaszkodni, ha a program végrehajtását az implementációs korlát megsértése miatt fel kellett függeszteni.A másik hiányosság az idézett axiómákban és szabályokban az, hogy nem nyújtanak alapot egy program sikeres leállásának bizonyításához. Az leállás meghiúsulhat egy végtelen ciklus miatt, vagy az implementáció által meghatározott határértékek megsértése miatt, például a numerikus operandusok tartománya, a tároló mérete vagy egy operációs rendszer időkorláta miatt. Ezért a “ ” jelölést úgy kell értelmezni, hogy “amennyiben a program sikeresen leáll, az eredményeinek tulajdonságai a   által leírtak szerinti.” Viszonylag könnyű azzal módosítani az axiómákat, hogy ne lehessen velük megjósolni a nem leálló programok “eredményeit”, azonban az axiómák használata mostantól függene az implementáció sok függő tulajdonságától, például a számítógép sebességétől és méretétől, a számok tartományától és az overflow technika választásától. A végtelen ciklusok elkerülésének bizonyításán kívül valószínűleg jobb a program “feltételes” helyességét bizonyítani, és a végrehajtás megszakításakor az implementáció figyelmeztetésére támaszkodni, ha a program végrehajtását az implementációs korlát megsértése miatt fel kellett függeszteni. ”

Szabályok

szerkesztés

Üres feltétel alaptétel

szerkesztés

Az üres feltétel nem változtatja meg a program állapotát, így bármi, ami igaz volt az üres utasítás előtt, az utasítás után is igaz marad.[note 2]

 

Az értékadás alaptétel

szerkesztés

Az értékadás axióma azt állítja, hogy az értékadás után bármely olyan állítás, amely korábban igaz volt az értékadás jobb oldalára vonatkozóan, most igaz a változóra is. Formálisan legyen P egy olyan állítás, amelyben az x változó szabadon szerepel. Ekkor:

 

ahol   utal a P állításra ,azt jelent, ahol hogy az összes x szabad előfordulását x kicserélődik E-re.

z értékadás axióma sémája azt jelenti, hogy az   igazsága ekvivalens a P utáni állítással. Ha tehát  igaz volt az értékadás előtt, akkor az értékadás axiómája alapján P igaz lesz a későbbiekben is. Ha viszont   hamis (azaz.   igaz) akkor az értékadás után, P hamisnak kell lennie.

Példák érvényes hármasra:

  •  
  •  

Azokat a feltételeket, amelyeket az kifejezés nem módosít, át lehet vinni a post-állapotba.Az első példában a   értékadás nem változtatja meg azt a tényt, hogy  , így mindkét állítás szerepelhet a post-állapotban. Formálisan ezt az eredményt az axióma sémájának alkalmazásával érhetjük el, ahol P (  és  ), ahol átad  ahol (  and  ),amelyet a kiinduló feltételre   egyszerűsíthető le.


Egy másik helytelen szabály, amely első pillantásra csábítónak tűnik: {P}x:=E{P∧x=E} ; értelmetlen példákhoz vezet, például:

{x=5}x:=x+1{x=5∧x=x+1}

Bár egy adott postcondition P egyértelműen meghatározza a precondition-t P[E/x], a fordított irányítás nem igaz. Például:

Az értékadás tétel séma ekvivalens azzal az állítással, hogy az előfeltétel meghatározásához először vegyük az utófeltételt-t, és cseréljük ki az összes bal oldali kifejezést az értékadás jobb oldali kifejezésével. Vigyázzunk, hogy ne próbáljuk ezt visszafelé megtenni az alábbi helytelen gondolatmenet követése során: ; ez a szabály értelmetlen példákhoz vezet, ehez hasonlókhoz:

 

Egy másik helytelen szabály, amely első pillantásra csábítónak tűnik: ; értelmetlen példákhoz vezet, például:

 

Bár egy adott utófeltétel P egyértelműen meghatározza az előfeltételt  , megfordítva ez nem igaz.

Példa:

  •  ,
  •  ,
  •  , and
  •  

are valid instances of the assignment axiom scheme.

Az elosztás alaptétele Hoare által javasolt szabálya nem alkalmazható, ha több név is hivatkozhat ugyanarra az értékre.

Példa,

 
ha az x és y változók ugyanarra az értékre hivatkoznak (aliasing), akkor az alábbi kódrészlet nem helyes,ugyanakkor ez egy helyes példa (mind a  és  ugyanúgy ).

Elrendezési szabálya

szerkesztés

Hoare elrendezési szabálya sorban folyamatosan hajtja végre a programot, S-re és T-re ahol S végrehajtása előbb történik majd utána a T-é, és az így írható:   (Q a köztes állapotot jelöli):[5]

 

Például,vegyük figyelembe a következő két esetet értékadás tételével

 

és

 

Az elrendezés szabály alkalmazásával azt állapíthatjuk meg:

 Egy másik példa a jobb oldali táblázatban van.

Feltételes szabály

szerkesztés
 

A feltételes szabály szerint, egy Q utóállapot, amely közös then és else részre, az egész if...endif utasítás utóállapota is..[6] A then és a else részben,a dupla tagadás és a tagadott feltétel B hozzáadható a feltétel P előfeltételéhez, és ez kölcsönös. B feltételének, nincsen mellékhatása.Egy példa a következő részben látható.

Ez a szabály nem volt benne Hoare eredeti publikációjában.[1] Azonban, mivel az állítás:

 

ugyanazt az eredményt adja, mint egy egyszeri ciklus konstrukció

 

a feltételes szabály származtatható a többi Hoare-szabályból. Hasonlóan, más szabályokhoz , a származtatott program szerkezetekre, mint a for loop, do...until loop, switch, break, continue lehet átalakítani a Hoare eredeti írásaból származó szabályokra.

Következmény szabály

szerkesztés
 

Ez a szabály lehetővé teszi, hogy megerősítsük az előfeltételt   és/vagy gyengítsük a végfeltételt  . Ezt például akkor használjuk, ha a "then" és " else" ágak végfeltételek.

Például a következő bizonyítás:

 

A feltételes szabály alkalmazásához először bizonyítani kell, hogy:

 ,   vagy egyszerűsítve:
 

a then részhez, és

 ,   vagy egyszerűsítve:
 

a else részhez.

Ugyanakkor,értékadás szabálya a then résszel az várja el hogy P az  ; szabály alkalmazásával ezentúl megengedett

 ,   ami logikusan ekvivalens
 .

A következményszabály az előfeltétel megerősítéséhez szükséges   a hozzárendelési szabályból kapott   feltételes szabályhoz szükséges.

Hasonlóan, az else résszel, az értékadás szabály megengedi

 ,   vagy megegyezően
 ,

ezért a következményszabályt kell alkalmazni   és   lény   és  , illetve, hogy ismét erősítse az előfeltételt. Informálisan a következményszabály hatása az, hogy ezt "elfelejti".  

  bejegyzésénél ismertelse részét, mivel a hozzárendelési szabályt használják az else résznek nincs szüksége erre az információra..

Míg szabály

szerkesztés
 

Itt P a hurokinvariáns, amelyet az S huroktestnek meg kell őriznie. A ciklus befejezése után ez az invariáns P továbbra is érvényes, sőt   biztosan véget ért a hurok. A feltételes szabályhoz hasonlóan B nem lehetnek mellékhatásai.

Például, bizonyításként

 

a Míg szabály bizonyítja hogy

 ,   vagy egyszerűsíte
 ,

Ezt könnyedén megkaphatjuk az "értékadás szabályával". Végül a utófeltétel,   lelehet egyszerűsíteni  .

Egy következő példa, "mindaddig" szabály formális igazolására az alábbi furcsa program, amely egy tetszőleges szám a pontos gyökének x kiszámítására szolgál - még akkor is, ha x egy egész szám változó és a nem négyzetszám:

 

miután alkalmaztuk a mindaddig szabályt P true, az marad, hogy bebizonyítsuk

 ,

Ez abból következik, hogy alkalmazzuk az "üres utasítás" szabályt és a következmény szabályt

Valójában a furcsa program részben helyes: ha véletlenül véget ér, akkor biztos, hogy x értéke tartalmazza a 'a' négyzetgyökét. Minden más esetben nem fog véget érni, így nem teljesen mértében helyes.

Mindaddig szabály a teljes helyesség érdekében

szerkesztés

Ha a fenti egyszerű mindaddig szabályt a következővel helyettesítjük, akkor a Hoare-féle kalkulus alkalmas lehet a teljes helyesség, azaz a terminálás és a részleges helyesség bizonyítására is. Általában szögletes zárójeleket használnak itt a program helyességének különböző fogalmának jelzésére.

 

Ebben a szabályban az ismétlési invariáns mellett a leállási feltételt is bizonyítani kell egy kifejezés t segítségével, amelynek értéke szigorúan csökken egy jól-alapuló reláció szerint egy adott < t D tartományban minden iteráció során. Mivel a < reláció jól-alapuló, a D tagjainak szigorúan csökkenő láncolata csak véges hosszúságú lehet, így a t értéke nem csökkenhet örökké. (Például a szokásos < sorrend jól-alapuló a pozitív egész számok   halmazán, de nem jól-alapuló sem az egész számok   halmazán, sem a pozitív valós számok   halmazán; ezek az összes halmaz matematikai értelemben vett végtelen halmazok.)

Az ismétlési invariáns P megadása mellett a feltételnek B biztosítania kell, hogy tnem minimális eleme D-nek, különben a test S nem tudná tovább csökkenteni a t értékét, vagyis a szabály feltétele nem lenne teljesülve. (Ez az egyik jelölése a teljes helyességnek.) [note 3]

A korábbi rész első példájának folytatásaként, a következő teljes helyességgel kapcsolatos bizonyításhoz:

 

a teljes helyességű mindaddig szabályt alkalmazhatjuk, például a D halmaz az egész számok, a hagyományos relációval < , az t kifejezése pedig  , amely akkor bebizonyítja

 

Nem annyira hivatalosan szólva, azt kell bizonyítanunk, hogy a távolság   minden ciklusban csökken, miközben mindig nem-negatív marad; ez a folyamat csak véges számú cikluson keresztül tarthat.


Az előző bizonyítási cél egyszerűsíthető a következőre:

 ,

Ezt a következőképpen lehet bizonyítani:

  a hozzárendelési szabály segítségével áll elő, és
  can be strengthened to   következmény szabály segítségével erősíthető fel

A második példájában ebben a részben nyilvánvalóan nem található olyan kifejezés t, amelyet az üres ciklustörzs csökkentene, így a termináció nem bizonyítható.

Továbbiak

szerkesztés

Megjegyzések

szerkesztés
  1. Hoare originally wrote " " rather than " ".
  2. This article uses a natural deduction style notation for rules. For example,   informally means "If both α and β hold, then also φ holds"; α and β are called antecedents of the rule, φ is called its succedent. A rule without antecedents is called an axiom, and written as  .
  3. Hoare's 1969 paper didn't provide a total correctness rule; cf. his discussion on p.579 (top left). For example Reynolds' textbook[3] gives the following version of a total correctness rule:   when z is an integer variable that doesn't occur free in P, B, S, or t, and t is an integer expression (Reynolds' variables renamed to fit with this article's settings).
  1. a b (1969. október 1.) „An axiomatic basis for computer programming”. Communications of the ACM 12 (10), 576–580. o. DOI:10.1145/363235.363259.  
  2. R. W. Floyd. "Assigning meanings to programs." Proceedings of the American Mathematical Society Symposia on Applied Mathematics. Vol. 19, pp. 19–31. 1967.
  3. a b John C. Reynolds. Theory of Programming Languages. Cambridge University Press (2009) ) Here: Sect. 3.4, p. 64.
  4. Hoare (1969), p.578-579
  5. Logic in Computer Science, second, CUP, 276. o. (2004. augusztus 26.). ISBN 978-0521543101 
  6. (2019. december 1.) „Fifty years of Hoare's logic”. Formal Aspects of Computing 31 (6), 759. o. DOI:10.1007/s00165-019-00501-3.  

További olvasmányok

szerkesztés

Külső linkek

szerkesztés
  • KeY-Hoare A KeY-re támaszkodó részben automatikus verifikációs rendszer. Egyszerű while nyelvhez tartalmaz Hoare-féle számításokat.
  • j-Algo-modul Hoare calculus — A Hoare-kalkulus vizualizációja a j-Algo algoritmus-ábrázoló programban.

Sablon:Program analysis