Separační logika , separační logika ( angl . separační logika ) - formální systém, substrukturální logika, použitelné pro ověřování programů obsahujících proměnlivé datové struktury a ukazatele , rozšíření Hoareovy logiky . Navrhli John Reynolds , Peter O'Hearn , Samin Ishtiaq a Hongseok Yang [ 1 ] [ 2 ] [ 3] [4] na základě práce Roda Burstalla [ 5 ] . Jazyk asercí rozdělovací logiky je speciálním případem logiky skupinových implikací [ 6 ] .
Evolucí logiky dělení pro paralelní výpočty se sdílenou pamětí je logika paralelního dělení vyvinutá O'Hearnem a Stephenem D. Brookesem .
Technologie založené na logice separace umožňují vyvíjet systémy pro ověřování velkých softwarových projektů [7] .
Hoareova logika má řadu omezení, pracuje pouze s proměnnými proměnnými a nepodporuje procedury ani kód první třídy . Největším omezením je však chybějící podpora ukazatelů , která je pro imperativní specifikaci programu nejrelevantnější . V případě použití ukazatelů a haldy lze proměnlivé proměnné opustit tím , že místním proměnným přiřadíme hodnotu ukazatele pouze jednou [8] .
V letech 2000-2002 přišli John Reynolds a Peter O'Hearn s rozšířením Hoareovy logiky, logikou dělení. Původní myšlenkou bylo zjednodušit uvažování o nízkoúrovňových imperativních programech s běžnou proměnlivou datovou strukturou [9] . Samotný termín je spojen s hlavní myšlenkou této logiky - popisem rozdělení úložiště ( anglicky storage ) na nepřekrývající se komponenty. Termín se používá jak ve vztahu k predikátovému počtu rozšířenému operátorem dělení , tak k výsledku rozšíření Hoareovy logiky [1] .
Klíčovým rysem logiky separace je možnost lokálního uvažování (lokálního uvažování) díky přítomnosti ve výpovědích prostorových spojek ( angl. prostorových spojek ) mezi částmi haldy [10] .
Logika vám umožňuje pracovat s příkazy formuláře , kde:
K překonání těžkopádných popisů zákazů používání stejné adresy různými objekty byla zavedena nová logická operace - disjunktní spojka , označená (nebo [13] ) a tvrdící, že každá z podmínek a jsou splněny ve svém část haldy (adresné úložiště ) [9] [14] . To platí pro hromadu , pokud existují dvě části této hromady a pro kterou platí [15] :
Výše a jsou chápány jako dílčí funkce , které dávají hodnoty odpovídající adrese na haldě.
Aby se potvrdilo, že halda je prázdná, zavede se predikát (v tomto případě samozřejmě ) a pro označení ukazatele - . Například v následujícím, což je jeden z axiomů, Hoareova trojice
předpokladem je nevyužitá paměťová buňka, která v důsledku operace přiřazení ukazuje na F , což je uvedeno v postpodmínce [12] .
Klíčem k místnímu uvažování je rámcové pravidlo zavedené O'Hearnem [ 1 ] :
,ve kterém není pod vlivem příkazu změněna žádná volná proměnná ( angl . free proměnná ) . Pomocí tohoto pravidla můžete přidat libovolné predikáty o proměnných a částech haldy, které nejsou modifikovány příkazem . Zároveň O'Hearn nazval množství hromady obsazené příkazem termínem angličtina. stopa („otisk“). Účelem rámcového pravidla je rozšířit argument z lokálnějšího popisu příkazu na globálnější popis obklopujícího příkazu, příkazu s největším potiskem [1] .
Poté, co Yang a Ishtiak zjistili, že logika separace je příkladem logiky svazkových implikací, zavedli separační implikaci ( anglicky separating implication [1] , anglicky magic wand ). Označení říká, že pokud byla halda rozšířena o neprotínající se haldu, pro kterou je true , pak pro výslednou haldu to bude pravda [7] .
Sémantika logických spojek (oddělovací konjunkce a oddělovací implikace) implikuje monoidní haldovou strukturu [7] .
Concurrent Separation Logic ( CSL ) je verze logiky použitelná pro ověřování paralelních algoritmů se sdílenou pamětí. Původně navrhl Peter O'Hearn. Používá následující pravidlo [16]
,což vám umožňuje vyvozovat závěry za přítomnosti nezávislých vláken provádění přistupujících k samostatnému úložišti. O'Hearnova pravidla důkazu přizpůsobila raný přístup Tonyho Hoareho k souběžnosti [17] tím, že nahradila použití omezení rozsahu k vynucení rozdělování uvažováním v logice rozdělování. Kromě rozšíření Hoareho přístupu k ukazatelům haldy O'Hearn ukázal, že logika paralelního dělení může dynamicky sledovat přenos vlastnictví oblastí haldy mezi procesy. Příklady v jeho článku tedy zahrnují vyrovnávací paměť pro ukazatel a správce paměti .
Místní uvažování lze chápat i z hlediska převodu vlastnictví . Nejjednodušší je uvažovat jako příklad o převodu vlastnictví pomocí pravidel monitoru Hoare (můžete vidět, že logika oddělení je vhodná i pro distribuované systémy). Pro zadání kritické sekce se používá oddělovací spojka s , kde je invariant zdroje r . Po opuštění kritické sekce následuje logický závěr v opačném směru [18] :
,Analogicky můžeme uvažovat i o procesu zpracování zprávy procesem odeslané jiným procesem se zdroji delegovanými na tento proces, určenými otisky prstů [18] .
Model pro paralelní rozdělovací logiku poprvé představil Stephen D. Brookes v doprovodném článku k O'Hearnovu článku [19] . Správnost ( anglicky soundness ) logiky byla obtížným problémem. Konkrétně protipříklad Johna Reynoldse ukázal selhání dřívější, nepublikované verze logiky. Pointa vznesená Reynoldsovým příkladem je stručně popsána v O'Hearnově článku a úplněji v Brooksově článku.
O'Hearn a Brooks jsou spolupříjemci Gödelovy ceny za rok 2016 za vynález logiky paralelního dělení [20] .
Logika oddělení našla uplatnění v automatických a interaktivních ověřovačích softwaru napsaného imperativním a objektově orientovaným stylem. Za tímto účelem byly vyvinuty vhodné doplňky stávajících ověřovacích nástrojů, například:
Další systémy využívající rozdělenou logiku: Smallfoot, Space Invader, THOR, SLAyer, HIP, jStar, Xisa, VeriFast, Infer, SeLoger, SLP. Od roku 2014 však neexistují žádné praktické důkazy teorémů, které by implementovaly plnou logiku dělení, tj. včetně implikace dělení [7] .
Podle charakteru použití systému jej lze rozdělit následovně [24] :