Predikativ programmering

Predikativ programmering är det ursprungliga namnet på en formell metod för programspecifikation och förfining , på senare tid kallad Practical Theory of Programming, uppfunnen av Eric Hehner . Den centrala idén är att varje specifikation är ett binärt ( booleskt ) uttryck som är sant för acceptabelt datorbeteende och falskt för oacceptabelt beteende. Av detta följer att förfining bara är implikation . Detta är den enklaste formella metoden, och den mest allmänna, som gäller för sekventiella, parallella, fristående, kommunicerande, avslutande, icke-avslutande, naturliga tid, realtid, deterministiska och probabilistiska program, och inkluderar tids- och rumsgränser .

Kommandon i ett programmeringsspråk anses vara ett specialfall av specifikation – de specifikationer som är kompilerbara. Till exempel, om programvariablerna är , och , är kommandot := +1 ekvivalent till specifikationen (binärt uttryck) = +1 ∧ = = där , och representerar värdena för programvariablerna före tilldelningen, och , och representerar värdena för programvariablerna efter tilldelningen. Om specifikationen är > bevisar vi enkelt ( := +1) ⇒ ( > ), som säger att := +1 innebär, eller förfinar, eller implementerar > .

Slingbevis är mycket förenklat. Till exempel, om är en heltalsvariabel, för att bevisa det

medan >0 gör := –1 od

förfinar, eller implementerar specifikationen ≥0 ⇒ =0, bevisa

om >0 := –1; ( ≥0 ⇒ =0) else fi ⇒ ( ≥0 ⇒ = 0)

där = ( = ) är det tomma, eller gör-ingenting-kommandot. Det finns inget behov av en loopinvariant eller minst fixpunkt . Slingor med flera mellanliggande grunda och djupa utgångar fungerar på samma sätt. Denna förenklade form av bevis är möjlig eftersom programkommandon och specifikationer kan blandas ihop på ett meningsfullt sätt.

Exekveringstid (övre gränser, nedre gränser, exakt tid) kan bevisas på samma sätt, bara genom att introducera en tidsvariabel. För att bevisa uppsägning, bevisa att exekveringstiden är begränsad. För att bevisa icke-uppsägning, bevisa att exekveringstiden är oändlig. Till exempel, om tidsvariabeln är och tiden mäts genom att räkna iterationer, då för att bevisa att exekvering av föregående while -loop tar tid när är initialt icke-negativ, och tar för evigt när initialt är negativ, bevisa

om >0 := –1; := +1; ( ≥0 ⇒ = + ) ∧ ( <0 ⇒ =∞) else fi ⇒ ( ≥0 ⇒ = + ) ∧ ( <0 ⇒ =∞)

där = ( = = ).

Bibliografi

externa länkar