Logica de separare , logica de separare (logica de separare în engleză ) - sistem formal, logică substructurală, aplicabil la verificarea programelor care conțin structuri de date mutabile și pointeri , o extensie a logicii lui Hoare . Proiectat de John Reynolds , Peter O'Hearn , Samin Ishtiaq și Hongseok Yang [ 1 ] [ 2 ] [ 3 ] [4] bazat pe munca lui Rod Burstall [ 5 ] . Limbajul de aserție al logicii partiționării este un caz special al logicii implicațiilor grupate [ 6 ] .
O evoluție a logicii de partiționare pentru calculul paralel cu memorie partajată este logica de partiționare paralelă , dezvoltată de O'Hearn și Stephen D. Brookes .
Tehnologiile bazate pe logica separării fac posibilă dezvoltarea sistemelor de verificare a proiectelor software mari [7] .
Logica lui Hoare are o serie de limitări, care operează numai pe variabile mutabile și nu acceptă proceduri sau cod de primă clasă . Cu toate acestea, cea mai mare limitare este lipsa suportului pentru pointer , care este cea mai relevantă pentru specificația imperativă a programului . În cazul utilizării pointerilor și a heap -ului , variabilele mutabile pot fi abandonate prin atribuirea unei valori de pointer variabilelor locale o singură dată [8] .
În 2000-2002, John Reynolds și Peter O'Hearn au venit cu o extensie a logicii lui Hoare, logica diviziunii. Ideea inițială a fost de a simplifica raționamentul despre programele imperative de nivel scăzut cu o structură comună de date mutabilă [9] . Termenul în sine este asociat cu ideea principală a acestei logici - descrierea divizării stocării ( stocare în limba engleză ) în componente care nu se suprapun. Termenul este folosit atât în raport cu calculul predicat , extins prin operatorul de împărțire , cât și cu rezultatul unei extensii a logicii lui Hoare [1] .
O trăsătură cheie a logicii separării este posibilitatea raționamentului local (raționamentul local) datorită prezenței în enunțuri a conectivelor spațiale ( eng. conective spațiale ) între părți ale grămezii [10] .
Logica vă permite să lucrați cu instrucțiuni de forma , unde:
Pentru a depăși descrierile greoaie ale interdicțiilor de utilizare a aceleiași adrese de către diferite obiecte, a fost introdusă o nouă operație logică - o conjuncție disjunctă , notată cu (sau [13] ) și care afirmă că fiecare dintre condițiile și sunt îndeplinite în ea parte din heap (stocare adresată) [9] [14] . Adică, adevărat pentru o grămadă dacă există două părți ale acestui morman și pentru care [15] este adevărat :
Mai sus și sunt înțelese ca funcții parțiale care dau valori corespunzătoare unei adrese din heap.
Pentru a afirma că heap-ul este gol, se introduce un predicat (în acest caz, evident, ), și pentru a desemna un pointer - . De exemplu, în cele ce urmează, care este una dintre axiome, triplul Hoare
condiția preliminară este celula de memorie neutilizată, care, ca urmare a operației de atribuire, indică către F , care este menționat în postcondiția [12] .
Cheia raționamentului local este regula cadru introdusă de O'Hearn [ 1 ] :
,în care nicio variabilă liberă ( ing . variabilă liberă ) nu este modificată ( ing. modificată ) sub influenţa comenzii . Folosind această regulă, puteți adăuga predicate arbitrare despre variabilele și părțile heap-ului care nu sunt modificate de comanda . În același timp, O'Hearn a numit cantitatea de grămadă ocupată de comandă termenul englez. amprentă („amprentă”). Scopul regulii cadru este acela de a extinde argumentul de la o descriere mai locală a comenzii la o descriere mai globală a comenzii incluse, comanda cu cea mai mare amprentă [1] .
După ce s-a stabilit că logica separării este un exemplu al logicii implicațiilor snopului, Yang și Ishtiak au introdus implicația de separare ( în engleză separare implicație [1] , engleză magic wand ). Denumirea spune că dacă o grămadă a fost extinsă printr-o grămadă neintersectată pentru care este adevărată , atunci pentru grămada rezultată va fi adevărată [7] .
Semantica conjunctivelor logice (conjuncție de separare și implicație de separare) implică o structură heap monoid [7] .
Logica de separare simultană ( CSL ) este o versiune a logicii aplicabile pentru verificarea algoritmilor paraleli cu memorie partajată. Propus inițial de Peter O'Hearn. Utilizează următoarea regulă [16]
,care vă permite să trageți concluzii în prezența unor fire independente de execuție accesând un depozit separat. Regulile de demonstrare ale lui O'Hearn au adaptat abordarea timpurie a concurenței a lui Tony Hoare [17] prin înlocuirea utilizării constrângerilor de domeniu pentru a impune partiționarea cu raționament în logica partiționării. Pe lângă extinderea abordării lui Hoare cu privire la pointerii heap, O'Hearn a arătat că logica de partiționare paralelă poate urmări în mod dinamic transferul de proprietate asupra zonelor heap între procese. Astfel, exemplele din articolul său includ un buffer de trecere a indicatorului și un manager de memorie .
Raționamentul local poate fi înțeles și în termeni de transfer al proprietății . Cel mai ușor este să luați în considerare transferul de proprietate folosind regulile monitorului Hoare ca exemplu (puteți vedea că logica de separare este potrivită și pentru sistemele distribuite ). Pentru a intra într-o secțiune critică , se folosește o conjuncție de separare cu , unde este invariantul de resursă r . La ieșirea din secțiunea critică, concluzia logică urmează în sens invers [18] :
,Prin analogie, putem considera și procesul de procesare de către un proces un mesaj transmis de un alt proces cu resurse delegate acestui proces, determinate de amprente [18] .
Un model pentru o logică de partiționare paralelă a fost introdus pentru prima dată de Stephen D. Brookes într- o lucrare care însoțește lucrarea lui O'Hearn [19] . Corectitudinea logicii a fost o problemă dificilă. În special, contraexemplul lui John Reynolds a arătat eșecul unei versiuni anterioare, nepublicate, a logicii. Punctul ridicat de exemplul lui Reynolds este descris pe scurt în articolul lui O'Hearn și mai pe deplin în cel al lui Brooks.
O'Hearn și Brooks sunt co-beneficiari ai Premiului Gödel 2016 pentru inventarea logicii partiționării paralele [20] .
Logica separării și-a găsit aplicație în verificatoarele automate și interactive ale software-ului scris într-un stil imperativ și orientat pe obiecte . Pentru aceasta, au fost dezvoltate completări adecvate la instrumentele de verificare existente, de exemplu, cum ar fi:
Alte sisteme care folosesc logica split: Smallfoot, Space Invader, THOR, SLAyer, HIP, jStar, Xisa, VeriFast, Infer, SeLoger, SLP. Cu toate acestea, din 2014, nu există dovezitori de teoreme practice care să implementeze logica completă a partiționării, adică să includă o implicație de partiționare [7] .
În funcție de natura utilizării sistemului, acesta poate fi împărțit după cum urmează [24] :