Web Analytics
Privacy Policy Cookie Policy Terms and Conditions Hoarelogica - Wikipedia

Hoarelogica

Hoarelogica is een rekenmethode in de informatica die gebruikt wordt ter afleiding van programma's. Ze is vernoemd naar de bedenker van de basis van het mechanisme, Tony Hoare.

Inhoud

[bewerk] Hoarelogica en predicatencalculus

Hoarelogica is een toepassing van de predicatencalculus op de ontwikkeling van programma's.

In 1937 publiceerde Alan Turing een model van berekening, een Turingmachine genaamd. Dit theoretische mechanisme beschrijft op een zeer mechanische manier hoe een berekening uitgevoerd wordt, in termen van zeer kleine stappen die van een beginsituatie tot een eindsituatie leiden.

Rond 1968 bedacht Tony Hoare dat Turings idee betekende dat je ook op een andere manier naar een berekening kon kijken dan eerder altijd gedaan werd. Een berekening werd altijd beschouwd in termen van "Wat moet je doen?" of "Hoe moet je het doen?". Maar, zo bedacht Hoare, de verdeling in kleine stappen door Turing betekent dat er meer is aan een berekening dan alleen een begin, een eind en een aantal uit te voeren handelingen: er zijn (mogelijk heel veel) punten in de berekening die tussen opeenvolgende handelingen liggen. Bedenk maar zelf: als je eerst A moet uitvoeren en daarna B, dan is er een moment waarop je A uitgevoerd hebt maar nog niet aan B begonnen bent.

Hoare realiseerde zich echter niet alleen dat een berekening uit stappen met momenten-tussen-stappen bestaat, hij realiseerde zich ook dat het mogelijk was die momenten-tussen-stappen op een wiskundige manier te beschrijven. Het is bij iedere berekening mogelijk de momenten tussen stappen in de berekening een wiskundige beschrijving mee te geven. En niet zomaar een beschrijving, maar een beschrijving in termen van een logische uitspraak over de variabelen die in de berekening gebruikt worden – de waarden van die variabelen, maar ook de relaties tussen variabelen (zoals a < b, c + d = 0, etc.).

In 1969 publiceerde Hoare een artikel getiteld An axiomatic basis for computer programming. In dit artikel introduceerde hij een aantal ideeën die de informatica radicaal veranderden en in één klap een wetenschap met een zware, wiskundige basis maakten van wat eerder een vakgebied was dat half uit gokwerk bestond. Hoares visie kwam in het kort op het volgende neer:

  1. Iedere berekening, ieder programma, bezit een toestandsruimte.
  2. De toestandsruimte van een gegeven berekening is een echte vectorruimte, die opgespannen wordt door de variabelen van de berekening.
  3. Iedere berekening bestaat - volgens het Turingmodel - uit een aantal stappen S_0, S_1, \ldots, S_n. Iedere stap wijzigt de waarde van tenminste één variabele van het programma en is dus op te vatten als een vector in de toestandsruimte van het programma.
  4. Iedere vector, iedere stap in het programma, is een overgang van een punt in de toestandsruimte naar een ander punt (de bovengenoemde momenten-tussen-stappen); ieder punt kan beschreven worden met een logische uitspraak, een predicaat.
  5. Ieder programma is dus feitelijk een serie vectoren, of ook wel een wandeling door de toestandsruimte; een dergelijke wandeling kan genoteerd worden als \{T_0\}S_0\{T_1\}S_1\{T_2\}\ldots\{T_n\}S_n\{T_{n+1}\}.
  6. Iedere stap binnen een programma of berekening wordt volledig beschreven door het triple {Tk}Sk{Tk + 1} – de verificatie van de correctheid van een dergelijke stap is mogelijk als je alleen die drie zaken weet, zelfs zonder te weten hoe je in toestand Tk terechtgekomen bent. Het is genoeg te weten dat je in die situatie begint om te kunnen zien of het geheel correct is.

De volledige beschrijving van een stap van Hoare wordt tegenwoordig, ter ere van Tony Hoare, een Hoaretriple genoemd. Deze triples worden op generieke wijze genoteerd als

{P}S{Q}

met als semantiek:

Stel dat een stap S gestart wordt in een initiële toestand (een preconditie) P. Als S eindigt, dan is de resulterende toestand (de postconditie) toestand Q.

[bewerk] Hoaretriples en de informatica

De laatste stap uit het lijstje hierboven was als een soort bom die in de informatica afging, zo groot waren de gevolgen van het inzicht dat Hoare gehad had.

Tot op het moment van Hoares publicatie had de informatica meer en meer geworsteld met de complexiteit van het aantonen van correctheid van programma's. Programmacorrectheid met een wiskundig bewijs was vaak een lastige klus waar complexe argumenten in gingen zitten. En steeds complexer wordende computerprogramma's maakten de zaak er niet beter op – een computerprogramma kan vertakkingen (selectiestatements) in zijn berekening bevatten, of herhalingen, wat betekent dat een bewijs van correctheid iets moet zeggen over mogelijk oneindig veel verschillende berekeningen die een programma zou kunnen uitvoeren.

Maar nee, zei Hoare, niets van dat alles: je kunt de correctheid van een programma bewijzen door statement voor statement, handeling voor handeling, stap voor stap, te kijken naar de correctheid van iedere stap op zich. Iedere stap begint in een toestand. Iedere stap die eindigt, eindigt in een toestand. Als dat bewijsbaar de toestand is waarin je dacht dat de stap zou eindigen, dan is die stap correct. Als een programma bestaat uit stappen die allemaal correct zijn, dan kan het programma correct zijn. Als iedere correcte stap eindigt in een toestand die ook nog eens de verwachte begintoestand van de volgende, correcte stap is, dan is het programma correct. Zo simpel is het en je hoeft niet alle, mogelijk oneindig veel, mogelijke berekeningen na te lopen die een programma kan doen om de correctheid van dat programma aan te tonen.

De volgende stap was zo mogelijk nog groter dan de vorige en kwam met behulp van Edsger Dijkstra en zijn studenten tot stand. Zij vroegen zich namelijk het volgende af:

Het is mooi dat je de correctheid van een programma kunt verifiëren door het programma te beschouwen als een wandeling door de toestandsruimte. Maar stel nou dat je er andersom naar kijkt. Je hebt een toestandsruimte, je hebt een punt in die ruimte die je de begintoestand noemt, en een punt die je de eindtoestand noemt. Zou je nu een wandeling van de begintoestand naar de eindtoestand kunnen uitrekenen, zodat het resultaat een werkend programma is?

En het antwoord was ja. Met behulp van een aantal rekenregels, de predicatencalculus en je eigen creativiteit om de zaak een bepaalde richting op te sturen, kun je een programma uitrekenen dat een gegeven probleem oplost en zeker correct moet zijn (of aantonen dat een dergelijk programma niet kan bestaan).

[bewerk] De zwakste (vrije) preconditie

Tussen 1969 en 1975 werkten mensen als Hoare en Dijkstra aan de ontwikkeling van een calculus om programma's mee uit te rekenen. Als onderdeel van dat werk ontwikkelden zij allerlei wiskundige hulpmiddelen, waaronder verfijningen van de betekenis van Hoares triples om de complexiteit het hoofd te bieden.

Een belangrijke stap was het inzicht dat het Hoaretriple eigenlijk vaak te streng is om bewijzen mee te kunnen leveren. Als je een brug wilt slaan tussen de toestanden P en Q, dan is het vaak te moeilijk om een stap te bedenken die een dergelijke brug vormt. Soms kan dat opgelost worden door meerdere stappen te nemen (bijvoorbeeld door te splitsen, waardoor je iets krijgt als {P}S0{P'}S1{Q}. Maar soms is het gewoon echt te moeilijk, omdat P te strenge eisen stelt (we zeggen dan: P is te sterk).

Gelukkig hoef je niet altijd direct een brug te slaan. Hoare wilde graag dat de betekenis van zijn triple was dat als je vanuit P aan S begint en S eindigt, dan eindigt S in een toestand Q. Dijkstra bedacht dat je dan natuurlijk ook voor iedere, mogelijke, stap vanuit een of andere Q kon bedenken wat de minste (of zwakste) preconditie was die je nodig had om dat te bereiken. Dit werd de zwakste vrije preconditie (weakest liberal precondition) genoemd. De notatie hiervoor werd

wlp.S.Q

en de betekenis was

wlp.S.Q \equiv "absoluut de zwakste toestand zodanig dat {wlp.S.Q}S{Q}"

En daarmee was een groot probleem opgelost, want als je kon bewijzen dat

P \Rightarrow wlp.S.Q

dan volgde daar ook direct {P}S{Q} uit. En omgekeerd ook, als je moeite had met de aansluiting op het volgende statement:

\{P\}S_0\{R_0\} \wedge \{R_1\}S_1\{Q\} \wedge (R_0 \Rightarrow R_1) \Rightarrow \{P\}S_0;S_1\{Q\}.

Met deze kennis in de hand werd het mogelijk een calculus op te stellen gebaseerd op de zwakste vrije precondities van alle soorten stappen die gezet konden worden:

Het lege statement of de skip
wlp.skip.R \equiv R
De toekenning
wlp.(x := E).R \equiv (x := E).R (R met daarin alle voorkomens van x vervangen door E)
De sequentiële compositie
wlp.(S_0;S_1).R \equiv wlp.S_0.(wlp.S_1.R)
Het selectiestatement
wlp.(if\ B_0 \rightarrow S_0 \| \ldots \| B_n \rightarrow S_n\ fi).R \equiv (B_0 \Rightarrow wlp.S_0.R) \wedge \ldots \wedge (B_n \Rightarrow wlp.S_n.R)
Het repetitiestatement
wlp.(do\ B_0 \rightarrow S_0 \| \ldots \| B_n \rightarrow S_n\ od).R \equiv (B_0 \Rightarrow wlp.(do\ B_0 \rightarrow S_0 \| \ldots \| B_n \rightarrow S_n\ od).R) \wedge \ldots \wedge (B_n \Rightarrow wlp.(do\ B_0 \rightarrow S_0 \| \ldots \| B_n \rightarrow S_n\ od).R) \wedge (\forall_{i \in \{0,\ldots ,n\}}:(\forall_{j \in \{0,\ldots ,n\}}:\neg B_j) \Rightarrow wlp.S_i.R)

[bewerk] Bronnen

Bron(nen):
  • On a method of multiprogramming
    W.H.J. Feijen en A.J.M. van Gasteren
    Springer Verlag New York, 1999
    ISBN 0-387-98870-X
  • Predicate calculus and program semantics
    E.W. Dijkstra en C.S. Scholten
    Springer Verlag, 1990
    ISBN 0-387-96957-8
 
THIS WEB:

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - be - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - closed_zh_tw - co - cr - cs - csb - cu - cv - cy - da - de - diq - dv - dz - ee - el - eml - en - eo - es - et - eu - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gd - gl - glk - gn - got - gu - gv - ha - haw - he - hi - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mg - mh - mi - mk - ml - mn - mo - mr - ms - mt - mus - my - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - rm - rmy - rn - ro - roa_rup - roa_tara - ru - ru_sib - rw - sa - sc - scn - sco - sd - se - searchcom - sg - sh - si - simple - sk - sl - sm - sn - so - sq - sr - ss - st - su - sv - sw - ta - te - test - tet - tg - th - ti - tk - tl - tlh - tn - to - tokipona - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu

Static Wikipedia 2008 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -

Static Wikipedia 2007:

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - be - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - closed_zh_tw - co - cr - cs - csb - cu - cv - cy - da - de - diq - dv - dz - ee - el - eml - en - eo - es - et - eu - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gd - gl - glk - gn - got - gu - gv - ha - haw - he - hi - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mg - mh - mi - mk - ml - mn - mo - mr - ms - mt - mus - my - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - rm - rmy - rn - ro - roa_rup - roa_tara - ru - ru_sib - rw - sa - sc - scn - sco - sd - se - searchcom - sg - sh - si - simple - sk - sl - sm - sn - so - sq - sr - ss - st - su - sv - sw - ta - te - test - tet - tg - th - ti - tk - tl - tlh - tn - to - tokipona - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu

Static Wikipedia 2006:

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - be - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - closed_zh_tw - co - cr - cs - csb - cu - cv - cy - da - de - diq - dv - dz - ee - el - eml - en - eo - es - et - eu - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gd - gl - glk - gn - got - gu - gv - ha - haw - he - hi - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mg - mh - mi - mk - ml - mn - mo - mr - ms - mt - mus - my - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - rm - rmy - rn - ro - roa_rup - roa_tara - ru - ru_sib - rw - sa - sc - scn - sco - sd - se - searchcom - sg - sh - si - simple - sk - sl - sm - sn - so - sq - sr - ss - st - su - sv - sw - ta - te - test - tet - tg - th - ti - tk - tl - tlh - tn - to - tokipona - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu