Logica Hoare ( ing. logica Hoare , de asemenea logica Floyd-Hoare , sau regulile Hoare ) este un sistem formal cu un set de reguli logice concepute pentru a dovedi corectitudinea programe de calculator . A fost propus în 1969 de informaticianul și logicianul matematician englez Hoare , dezvoltat ulterior de Hoare însuși și alți cercetători. [1] Ideea originală a fost propusă de Floyd , care a publicat un sistem similar [2 ] aplicat diagramelor de flux .
Principala caracteristică a logicii lui Hoare este triplul Hoare . Triplul descrie modul în care execuția unei bucăți de cod schimbă starea calculului. Triplul Hoare are următoarea formă:
unde P și Q sunt aserțiuni și C este o comandă . _ _ P se numește precondiție ( antecedent ) iar Q se numește postcondiție ( consecință ). Dacă precondiția este adevărată, comanda face ca postcondiția să fie adevărată. Enunţurile sunt formule ale logicii predicatelor .
Logica lui Hoare are axiome și reguli de inferență pentru toate constructele unui limbaj de programare imperativ simplu . În plus față de aceste constructe descrise în lucrarea originală a lui Hoare, Hoare și alții au dezvoltat reguli pentru alte constructe: execuție concomitentă , apel de procedură , salt și pointer .
Ideea principală a lui Hoare este de a da fiecărei construcții a unui limbaj imperativ o pre- și postcondiție , scrisă ca o formulă logică. Prin urmare, în nume apare un triplu - precondiție , construcție a limbii, postcondiție .
Un program care funcționează bine poate fi scris în multe feluri și în multe cazuri va fi eficient. Această ambiguitate complică programarea. Pentru a face acest lucru, introduceți un stil. Dar acest lucru nu este suficient. Pentru multe programe (de exemplu, cele legate indirect de viața umană), este, de asemenea, necesar să se dovedească corectitudinea lor. S-a dovedit că dovada corectitudinii face programul mai scump cu un ordin de mărime (de aproximativ 10 ori).
În logica standard a lui Hoare, numai corectitudinea parțială poate fi dovedită, deoarece terminarea programului trebuie dovedită separat. De asemenea, regula de a nu folosi părți redundante de program nu poate fi exprimată în logica lui Hoare. Înțelegerea „intuitivă” a triplei Hoare poate fi exprimată astfel: dacă P apare înainte ca C să fie finalizat, atunci fie Q apare , fie C nu se va termina niciodată. Într-adevăr, dacă C nu se termină, nu există după, așa că Q poate fi orice instrucțiune. Mai mult, putem alege ca Q să fie fals pentru a arăta că C nu se va termina niciodată.
Corectitudinea deplină poate fi dovedită și folosind o versiune extinsă a regulii pentru instrucțiunea While .
Regula pentru o instrucțiune goală afirmă că instrucțiunea skip ( instrucțiune goală ) nu schimbă starea programului, deci o declarație care era adevărată înainte de skip rămâne adevărată după ce este executată.
Axioma operatorului de atribuire afirmă că după o atribuire, valoarea oricărui predicat în raport cu partea dreaptă a atribuirii nu se modifică odată cu înlocuirea părții drepte cu partea stângă:
Aici înseamnă expresia P în care toate aparițiile variabilei libere x sunt înlocuite cu expresia E .
Sensul axiomei de atribuire este că adevărul este echivalent după ce atribuirea a fost efectuată. Astfel, dacă a fost adevărat înainte de atribuire, conform axiomei de atribuire va fi adevărat după atribuire. În schimb, dacă a fost egal cu „fals” înainte de declarația de atribuire, ar trebui să fie egal cu „fals” după.
Exemple de triple valide:
Axioma de atribuire din formularea lui Hoare nu se aplică atunci când mai mult de un identificator se referă la aceeași valoare. De exemplu,
este falsă dacă x și y se referă la aceeași variabilă, deoarece nicio precondiție nu poate asigura că y este 3 după ce x a fost atribuit 2.
Regula de compunere a lui Hoare se aplică executării secvențiale a programelor S și T , unde S este executat înainte de T , care este scris ca S;T .
De exemplu, luați în considerare două exemple ale axiomei de atribuire:
și
Conform regulii de compunere, obținem:
Aici P este un invariant de ciclu .
În această regulă, pe lângă păstrarea invariantului buclei, terminarea buclei este dovedită printr-un termen numit variabilă buclă (aici t ), a cărei valoare este strict redusă conform relației bine întemeiate " < " cu fiecare iterație. În acest caz, condiția B trebuie să implice că t nu este elementul minim al domeniului său, altfel premisa acestei reguli va fi falsă. Deoarece relația „ < ” este pe deplin întemeiată, fiecare pas de buclă este definit de membrii descrescători ai unei mulțimi finite ordonate liniar .
Notarea acestei reguli folosește paranteze pătrate, nu acolade, pentru a indica corectitudinea completă a regulii. (Acesta este o modalitate de a indica corectitudinea completă.)
Exemplul 1 |
— pe baza axiomei atribuirii. |
Deoarece , pe baza regulii de inferență, obținem: |
Exemplul 2 |
— pe baza axiomei atribuirii. |
Dacă x și N sunt numere întregi, atunci și pe baza regulii de inferență, obținem: |
În cataloagele bibliografice |
---|