Hoareova logika ( angl. Hoare logic , též Floyd-Hoare logic , nebo Hoare rules ) je formální systém se sadou logických pravidel určených k prokázání správnosti počítačové programy . To bylo navrženo v roce 1969 anglickým počítačovým vědcem a matematickým logikem Hoareem , později vyvinutým samotným Hoareem a dalšími výzkumníky. [1] Původní nápad navrhl Floyd , který publikoval podobný systém [2 ] aplikovaný na vývojové diagramy .
Hlavní charakteristikou Hoareovy logiky je Hoareova trojice . Trojka popisuje, jak provedení části kódu změní stav výpočtu. Hoareův trojitý má následující podobu:
kde P a Q jsou tvrzení a C je příkaz . _ _ _ P se nazývá předběžná podmínka ( antecedent ) a Q se nazývá postpodmínka ( následná ). Pokud je předběžná podmínka pravdivá, příkaz učiní postpodmínku pravdivou. Příkazy jsou formule predikátové logiky .
Hoareova logika má axiomy a pravidla odvození pro všechny konstrukce jednoduchého imperativního programovacího jazyka . Kromě těchto konstrukcí popsaných v původní práci Hoareho vyvinul Hoare a další pravidla pro další konstrukce: souběžné provádění , volání procedury , skok a ukazatel .
Hoareho hlavní myšlenkou je dát každé konstrukci imperativního jazyka pre- a post- podmínku , zapsanou jako logický vzorec. V názvu se proto objevuje trojka - precondition , konstrukce jazyka, postcondition .
Dobře fungující program lze napsat mnoha způsoby a v mnoha případech bude efektivní. Tato nejednoznačnost komplikuje programování. Chcete-li to provést, zaveďte styl. Ale to nestačí. U mnoha programů (například těch, které jsou spjaty nepřímo s lidským životem) je navíc nutné prokázat jejich správnost. Ukázalo se, že důkaz správnosti program řádově (asi 10x) prodražuje.
V Hoareho standardní logice lze prokázat pouze částečnou správnost, protože ukončení programu musí být prokázáno samostatně. Také pravidlo nepoužívat nadbytečné části programu nelze vyjádřit v Hoareově logice. "Intuitivní" chápání Hoareovy trojice lze vyjádřit následovně: pokud P nastane před dokončením C , pak buď nastane Q , nebo C nikdy neskončí. Pokud C neskončí, není žádné po, takže Q může být jakýkoli příkaz. Navíc můžeme zvolit Q jako nepravdivé, abychom ukázali, že C nikdy neskončí.
Úplnou správnost lze také prokázat pomocí rozšířené verze pravidla pro příkaz While .
Pravidlo pro prázdný příkaz říká, že příkaz přeskočit ( prázdný příkaz ) nemění stav programu, takže příkaz, který byl pravdivý před přeskočením , zůstává pravdivý i po jeho provedení.
Axiom operátoru přiřazení říká, že po přiřazení se hodnota libovolného predikátu vzhledem k pravé straně přiřazení nemění s nahrazením pravé strany levou stranou:
Zde se rozumí výraz P , ve kterém jsou všechny výskyty volné proměnné x nahrazeny výrazem E .
Význam axiomu přiřazení je ten, že pravda je po provedení přiřazení ekvivalentní . Pokud to tedy platilo před zadáním, podle axiomu přiřazení to bude platit i po zadání. Naopak, pokud se před příkazem přiřazení rovnalo hodnotě „nepravda“, mělo by se rovnat hodnotě „nepravda“ i poté.
Příklady platných trojic:
Axiom přiřazení v Hoareově formulaci neplatí, pokud více než jeden identifikátor odkazuje na stejnou hodnotu. Například,
je nepravdivé, pokud x a y odkazují na stejnou proměnnou, protože žádná podmínka nemůže zajistit, aby y bylo 3 poté , co bylo x přiřazeno 2.
Hoareovo kompoziční pravidlo platí pro sekvenční provádění programů S a T , kde S se provádí před T , což je zapsáno jako S;T .
Zvažte například dva případy axiomu přiřazení:
a
Podle pravidla složení získáme:
Zde P je invariant cyklu .
V tomto pravidle se kromě zachování invariantu smyčky dokazuje ukončení smyčky termínem nazývaným proměnná smyčky (zde t ), jejíž hodnota je přísně redukována podle opodstatněného vztahu " < " s každou iterací. V tomto případě musí podmínka B implikovat, že t není minimální prvek její domény, jinak bude premisa tohoto pravidla nepravdivá. Protože vztah " < " je plně podložený, každý krok smyčky je definován klesajícími členy konečné lineárně uspořádané množiny .
Zápis tohoto pravidla používá k označení úplné správnosti pravidla hranaté závorky, nikoli složené závorky. (Toto je jeden ze způsobů, jak označit úplnou správnost.)
Příklad 1 |
— na základě axiomu přiřazení. |
Protože na základě pravidla odvození dostaneme: |
Příklad 2 |
— na základě axiomu přiřazení. |
Pokud jsou x a N celá čísla, pak a na základě pravidla pro odvození dostaneme: |
V bibliografických katalozích |
---|