ŘÍKÁME, ŽE FUNKCE JE ČÁSTEČNĚ SPRÁVNÁ (PARTIALLY CORRECT), POKUD KDYŽ JE SPLNĚNA PRECONDITION

Podobné dokumenty
PODOBÁ SE JAZYKU C S NĚKTERÝMI OMEZENÍMI GLOBÁLNÍ PROMĚNNÉ. NSWI162: Sémantika programů 2

Matematická indukce a správnost programů. Základy diskrétní matematiky, BI-ZDM ZS 2011/12, Lekce 13

IV113 Validace a verifikace

Algoritmizace a programování

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21.

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 12.

Algoritmy. Z. Sawa (VŠB-TUO) Úvod do teoretické informatiky 15. dubna / 39

Funkce, podmíněný příkaz if-else, příkaz cyklu for

IV113 Validace a verifikace. Převod LTL formule na Büchi automat. Jiří Barnat

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

5 Rekurze a zásobník. Rekurzivní volání metody

Úvod do programovacích jazyků (Java)

Obsah přednášky. programovacího jazyka. Motivace. Princip denotační sémantiky Sémantické funkce Výrazy Příkazy Vstup a výstup Kontinuace Program

Třída PTIME a třída NPTIME. NP-úplnost.

teorie logických spojek chápaných jako pravdivostní funkce

3. přednáška. Obsah: Řídící struktury sekvence, if-else, switch, for, while, do-while. Zpracování posloupnosti

Seminář z IVT Algoritmizace. Slovanské gymnázium Olomouc Tomáš Kühr

Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti

Databázové systémy. * relační kalkuly. Tomáš Skopal. - relační model

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

ÚVODNÍ ZNALOSTI. datové struktury. správnost programů. analýza algoritmů

ROZHODOVACÍ PROCEDURY A VERIFIKACE PAVEL SURYNEK, KTIML

Programovací jazyky. imperativní (procedurální) neimperativní (neprocedurální) assembler (jazyk symbolických instrukcí)

Řídicí struktury. alg3 1

10. Techniky formální verifikace a validace

Paralelní programování

Z. Kotala, P. Toman: Java ( Obsah )

Logika. 2. Výroková logika. RNDr. Luděk Cienciala, Ph. D.

Výroková logika. Teoretická informatika Tomáš Foltýnek

9. přednáška - třídy, objekty

Principy indukce a rekursivní algoritmy

Stefan Ratschan. Fakulta informačních technologíı. Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti

Sémantika výrokové logiky. Alena Gollová Výroková logika 1/23

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

IAJCE Přednáška č. 6. logický celek, řešící dílčí část problému Příklad velmi špatného zápisu programu na výpočet obsahu obdélníku

IV113 Validace a verifikace. Formální verifikace algoritmů. Jiří Barnat

Úvod do logiky (VL): 4. Zjištění průběhu pravdivostních hodnot formule tabulkovou metodou

Unbounded Model Checking

Úvod do informatiky. Miroslav Kolařík

Částečná korektnost. Petr Štěpánek. S využitím materialu Krysztofa R. Apta

Matematická logika. Miroslav Kolařík

IB108 Sada 1, Příklad 1 Vypracovali: Tomáš Krajča (255676), Martin Milata (256615)

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

Zpracoval: 7. Matematická indukce a rekurse. Řešení rekurentních (diferenčních) rovnic s konstantními koeficienty.

Formální systém výrokové logiky

Složitost algoritmů. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava

Algoritmus. Přesné znění definice algoritmu zní: Algoritmus je procedura proveditelná Turingovým strojem.

Programovací jazyk Pascal

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Sémantika predikátové logiky

Negativní informace. Petr Štěpánek. S použitím materiálu M.Gelfonda a V. Lifschitze. Logické programování 15 1

Unární je také spojka negace. pro je operace binární - příkladem může být funkce se signaturou. Binární je velká většina logických spojek

Modely Herbrandovské interpretace

Lineární algebra : Násobení matic a inverzní matice

DSA, První krok: máme dokázat, že pro left = right vrátí volání f(array, elem, left, right)

Algoritmy a datové struktury

Rekurzivní algoritmy

4.2 Syntaxe predikátové logiky

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Vlastnosti algoritmu. elementárnost. determinovanost. rezultativnost. konečnost. hromadnost. efektivnost

Standardní algoritmy vyhledávací.

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek

Zadání k 2. programovacímu testu

Výroková a predikátová logika - II

11 VYPOČITATELNOST A VÝPOČTOVÁ SLOŽITOST

1/1 ČESKÁ ZEMĚDĚLSKÁ UNIVERZITA V PRAZE PROVOZNĚ EKONOMICKÁ FAKULTA PŘIJÍMACÍ ŘÍZENÍ 2017/2018

Dolování asociačních pravidel

4. Rekurze. BI-EP1 Efektivní programování Martin Kačer

Třídy složitosti P a NP, NP-úplnost

Implementace LL(1) překladů

Úvod do teoretické informatiky

Pascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7

Klasická predikátová logika

6. Příkazy a řídící struktury v Javě

C# konzole Podíl dvou čísel, podmínka IF

Podmíněné vykonávání

Klasická výroková logika - tabulková metoda

PŘETĚŽOVÁNÍ OPERÁTORŮ

Středoškolská technika 2017 PROGRAM NA GENEROVÁNÍ PRVOČÍSEL

2.2 Sémantika predikátové logiky

Úvod do logiky (VL): 5. Odvození výrokových spojek z jiných

Výrazy a operátory. Operátory Unární - unární a unární + Např.: a +b

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky

Množiny, relace, zobrazení

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

Logické programy Deklarativní interpretace

Základy logiky a teorie množin

Algoritmizace a programování

Konstrukce relace. Postupně konstruujeme na množině všech stavů Q relace i,

Správa paměti. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta, 2016

Druhy souborů. textové. binární. nestrukturované txt strukturované - ini, xml, csv. veřejné bmp, jpg, wav proprietární docx, cdr, psd

Sémantiky programovacích jazyků

NP-úplnost problému SAT

PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

Kapitola 7: Návrh relačních databází. Nástrahy relačního návrhu. Příklad. Rozklad (dekompozice)

Základní pojmy matematické logiky

Místo pojmu výroková formule budeme používat zkráceně jen formule. Při jejich zápisu

Algoritmizace prostorových úloh

Programování v jazyce C pro chemiky (C2160) 3. Příkaz switch, příkaz cyklu for, operátory ++ a --, pole

Výroková a predikátová logika - V

Transkript:

ŘÍKÁME, ŽE FUNKCE JE ČÁSTEČNĚ SPRÁVNÁ (PARTIALLY CORRECT), POKUD KDYŽ JE SPLNĚNA PRECONDITION FUNKCE PŘI JEJÍM ZAVOLÁNÍ, JEJÍ POSTCONDITION JE SPLNĚNA PŘI NÁVRATU Z FUNKCE (POKUD NASTANE) OBECNĚ FUNKCE NEMUSÍ SKONČIT MŮŽE UVÍZNOUT V NEKONEČNÉM VÝPOČTU ( TERMINATION PROBLEM ) OVĚŘENÍ, ŽE FUNKCE SKUTEČNĚ VŽDY SKONČÍ, JE JINÝ A TAKÉ TĚŽKÝ PROBLÉM PRO JAZYKY JAKO JAVA, C#, C/C++ SE JEDNÁ O NEROZHODNUTELNÝ PROBLÉM POTŘEBOVALI BYCHOM SILNĚJŠÍ MECHANISMUS NEŽ JE TURINGŮV STROJ, COŽ NEMÁME I PRO PROGRAMY V PI MUSÍME VERIFIKÁTORU POMOCI VÍCE NA PŘÍŠTÍ PŘEDNÁŠCE O ÚPLNÉ SPRÁVNOSTI OBECNĚ ROZHODNOUT O PLATNOSTI JINÝCH VLASTNOSTÍ NEŽ TERMINACE PROGRAMU JE STEJNĚ TĚŽKÉ NSWI162: Sémantika programů 2

PRINCIPIÁLNĚ PROBÍHÁ VERIFIKACE V PI TAK, ŽE SE ANOTACE PŘEVEDOU NA KONEČNÝ POČET VERIFIKAČNÍCH PODMÍNEK, KTERÉ SE POSTUPNĚ OVĚŘÍ VYTVOŘENÍ VERIFIKAČNÍCH PODMÍNEK PROBÍHÁ VE DVOU KROCÍCH: 1. TĚLO (KAŽDÉ) FUNKCE JE PŘEVEDENO NA KONEČNÝ POČET ZÁKLADNÍCH CEST (BASIC PATHS) 2. PRO KAŽDOU ZÁKLADNÍ CESTU SE VYGENERUJE VERIFIKAČNÍ PODMÍNKA POKUD JSOU SPLNĚNY VŠECHNY VERIFIKAČNÍ PODMÍNKY, PLATÍ PAK I POSTCONDITION VŽDY, KDYŽ JE SPLNĚNA PRECONDITION NSWI162: Sémantika programů 3

@pre true @post sorted(rv, 0, rv - 1) int[] BubbleSort(int[] a_0) { int[] a := a_0; for @L1: sorted(arr, i, arr - 1) && -1 <= i && i < arr && partitioned(arr, 0, i, i+1, arr -1) (int i := a - 1; i > 0; i := i - 1) { for @L2: partitioned(arr, 0, i, i + 1, arr - 1) && 1 <= i && i < arr && 0 <= j && j <= i && sorted(arr, i, arr - 1) && partitioned(arr, 0, j - 1, j, j) (int j := 0; j < i; j := j + 1) { if (a[j] > a[j + 1]) { int t := a[j]; a[j] := a[j + 1]; a[j + 1] := t; return a; NSWI162: Sémantika programů 4

U (REKURZIVNÍHO) VOLÁNÍ SE NEJPRVE ZKONTROLUJE PLATNOST PRECONDITION VOLANÉ FUNKCE A NÁSLEDNĚ PŘEDPOKLÁDÁ PLATNOST POSTCONDITION TĚMITO DVĚMA ANOTACEMI SE NAHRADÍ REKURZIVNÍ VOLÁNÍ NÁVRATOVÁ HODNOTA JE DEFINOVANÁ PRÁVĚ POSTCONDITION REKURZIVNĚ VOLANÉ FUNKCE TÍM SE TĚLO FUNKCE OPĚT ROZPADNE NA KONEČNÝ POČET ZÁKLADNÍCH CEST NSWI162: Sémantika programů 5

@pre 0 <= l && u < a && sorted(a, 0, a - 1) @post rv <-> exists j. (l <= j && j <= u && a[j] = e) bool BinarySearch(int[] a, int l, int u, int e) { if (l > u) return false; else { int m := (l + u) div 2; if (a[m] = e) return true; else if (a[m] < e) return BinarySearch(a, m + 1, u, e); else return BinarySearch(a, l, m - 1, e); NSWI162: Sémantika programů 6

else if (a[m] < e) { @ 0 <= m + 1 && u < a && sorted(a, 0, a - 1) // _rv = BinarySearch(a, m + 1, u, e); @assume _rv <-> exists j. (m + 1 <= j && j <= u && a[j] = e) return _rv; else { @ 0 <= l && m - 1 < a && sorted(a, 0, a - 1) // _rv = BinarySearch(a, l, m - 1, e); @assume _rv <-> exists j. (l <= j && j <= m - 1 && a[j] = e) return _rv; NSWI162: Sémantika programů 7

STAVEM PROGRAMU ROZUMÍME PŘIŘAZENÍ HODNOT ODPOVÍDAJÍCÍCH TYPŮ KE VŠEM PROMĚNNÝM PROMĚNNÁ JE I PROGRAM COUNTER (pc) OBSAHUJÍCÍ AKTUÁLNÍ MÍSTO (ŘÁDEK) VYKONÁVÁNÍ PROGRAMU STAV PROGRAMU FUNKCE BUBBLESORT NA MÍSTĚ VYKONÁVÁNÍ L2 (VNĚJŠÍ CYKLUS) MŮŽE BÝT: s: pc L1, a 2; 0; 1, i 2, j 0, t 2, rv FORMÁLNĚ POTŘEBUJEME ROZŠÍŘENÍ TEORIE O DEFINICI TYPŮ A INTERPRETACI FUNKČNÍCH A PREDIKÁTOVÝCH SYMBOLŮ, NICMÉNĚ ZDE BUDEME VŽDY PŘEDPOKLÁDAT BĚŽNOU INTERPRETACI A BĚŽNÉ TYPY HODNOT NSWI162: Sémantika programů 8

KROMĚ ANOTACÍ OBSAHUJE PROGRAM I PŘÍKAZY MĚNÍCÍ STAV PROGRAMU TEDY HODNOTY PROMĚNNÝCH PO ROZDĚLENÍ PROGRAMU NA ZÁKLADNÍ CESTY JE K VYTVOŘENÍ VERIFIKAČNÍCH PODMÍNEK POTŘEBA ZAHRNOUT I EFEKTY JEDNOTLIVÝCH PŘÍKAZŮ PRINCIP, KTERÝ SE K TOMU POUŽÍVÁ, SE JMENUJE WEAKEST PRECONDITION PREDICATE TRANSFORMER (PREDIKÁTOVÝ TRANSFORMÁTOR NEJSLABŠÍHO PŘEDPOKLADU): p: formule prikazy formule TEN DVOJICI (FORMULE, PŘÍKAZ) PŘIŘAZUJE NOVOU FORMULI CHARAKTERIZUJÍCÍ STAV PO PROVEDENÍ PŘÍKAZU ZJEDNODUŠENĚ SE DÁ ŘÍCI, ŽE VÝSLEDNÁ FORMULE ZACHYCUJE EFEKT PŘÍKAZU NA PŮVODNÍ FORMULI POKUD JE ALE NAPŘÍKLAD PŮVODNÍ FORMULE VELMI OBECNÁ, MŮŽE TA SAMÁ FORMULE PLATIT I PRO STAV PO PROVEDENÍ PŘÍKAZU NSWI162: Sémantika programů 9

FORMULE wp F, T JE WEAKEST PRECONDITION STAVU s POKUD s wp F, T A PO PROVEDENÍ PŘÍKAZU T, KTERÝ ZMĚNÍ STAV PROGRAMU Z s NA STAV s, PLATÍ s F wp F, T T s F s NSWI162: Sémantika programů 10

VERIFIKAČNÍ PODMÍNKY OBSAHUJÍ PODFORMULE, KTERÉ ODPOVÍDAJÍ: 1. PŘEDPOKLADŮM (ASUMPCÍM) PODFORMULE TVOŘÍCÍ IMPLIKACE, KROMĚ POSLEDNÍ PODFORMULE TO JSOU TYPICKY ČÁSTI ANOTACÍ 2. PŘIŘAZENÍ PODFORMULE ODRÁŽEJÍCÍ EFEKT PŘIŘAZENÍ PRO ASUMPCE PLATÍ, ŽE POKUD PŘED PROVEDENÍM PŘÍKAZU PLATÍ c F, PAK PO PROVEDENÍ PŘÍKAZU PLATÍ F, TEDY wp F, assume c c F NAPŘÍKLAD VE VERIFIKAČNÍ PODMÍNCE, KDE PLATÍ PODMÍNKA CYKLU PRO PŘIŘAZENÍ PLATÍ, ŽE POKUD F e PLATÍ PŘED PROVEDENÍM PŘÍKAZU v e, PAK PO PROVEDENÍ PŘIŘAZENÍ PLATÍ F v, TEDY wp F v, v e F[e] PRO POSLOUPNOST PŘÍKAZŮ S 1 ; ; S n DEFINUJEME WEAKEST PRECONDITION REKURZIVNĚ JAKO wp F, S 1,, S n wp wp F, S n, S 1 ; ; S n 1 NSWI162: Sémantika programů 11

POKUD MÁME ZÁKLADNÍ CESTU @F S 1 ; S 2 ; S N ; @G, VERIFIKAČNÍ PODMÍNKA JE FORMULE F wp G, S 1 ; S 2 ; ; S N NAPŘÍKLAD PRO ZÁKLADNÍ CESTU @x 0 x x + 1; @x 1 JE VERIFIKAČNÍ PODMÍNKA FORMULE x 0 wp x 1, x = x + 1 CHCEME ZJISTIT, JAKÁ FORMULE ODPOVÍDÁ wp x 1, x = x + 1, ABYCHOM MOHLI ROZHODNOUT O PLATNOSTI VERIFIKAČNÍ PODMÍNKY: wp x 1, x = x + 1 x 1 x x + 1 x + 1 1 x 0 PO DOSAZENÍ DOSTÁVÁME, ŽE x 0 x 0, COŽ ZŘEJMĚ PLATÍ NSWI162: Sémantika programů 12

@pre 0 <= l && u < a @post rv <-> exists j. (l <= j && j <= u && a[j] = e) bool LinearSearch(int[] a, int l, int u, int e) { for @ L: l <= i && forall j. (l <= j && j < i -> a[j]!= e) (int i := l; i <= u; i := i + 1) { @ 0 <= i && i < a if (a[i] = e) return true; return false; NSWI162: Sémantika programů 13

ZÁKLADNÍ CESTA JE V TOMTO PŘÍPADĚ POSLOUPNOST PŘÍKAZŮ: @ F: l i j. l j < i a j e S 1 : assume i u; S 2 : assume a i = e; S 3 : rv true; @ G: rv j. l j u a j = e VERIFIKAČNÍ PODMÍNKA JE PAK FORMULE F wp G, S 1 ; S 2 ; S 3 SPOČÍTEJME TEDY, ČEMU ODPOVÍDÁ wp G, S 1 ; S 2 ; S 3 NSWI162: Sémantika programů 14

wp G, S 1 ; S 2 ; S 3 wp wp rv j. l j u a j = e, rv true, S 1 ; S 2 wp true j. l j u a j = e, S 1 ; S 2 wp j. l j u a j = e, S 1 ; S 2 wp wp j. l j u a j = e, assume a i = e, S 1 wp a i = e j. l j u a j = e, S 1 wp a i = e j. l j u a j = e, assume i u i u a i = e j. l j u a j = e NSWI162: Sémantika programů 15

POKUD NYNÍ NAHRADÍME SPOČÍTANOU FORMULI VE VERIFIKAČNÍ PODMÍNCE F wp, DOSTÁVÁME: COŽ MŮŽEME PŘEPSAT JAKO: S POUŽITÍM EKVIVALENCE: l i j. l j < i a j e i u a i = e j. l j u a j = e l i j. l j < i a j e i u a i = e j. l j u a j = e F 1 F 2 F 3 F 4 F 5 F 1 F 2 F 3 F 4 F 5 VÝSLEDNÁ FORMULE JE PLATNÁ (PRO PŘÍPAD j = i) NSWI162: Sémantika programů 16

@pre true @post sorted(rv, 0, rv - 1) int[] InsertionSort(int[] a_0) { int[] a := a_0; for @ L1: true (int i := 1; i < a ; i := i + 1) { int t := a[i]; int j; for @ L2: true (j := i - 1; j >= 0; j := j - 1) { if (a[j] <= t) break; a[j + 1] := a[j]; a[j + 1] := t; return a; NSWI162: Sémantika programů 17

int e :=?; @pre true @post true int[] union(int[] a, int[] b) { int[] u := new int[ a + b ]; int j := 0; for @ L1: true (int i := 0; i < a ; i := i + 1) { u[j] := a[i]; j := j + 1; for @ L2: true (int i := 0; i < b ; i := i + 1) { u[j] := b[i]; j := j + 1; return u; NSWI162: Sémantika programů 18

ČÁSTEČNÁ SPRÁVNOST ZACHYCUJE DŮLEŽITOU ČÁST KOREKTNOSTI PROGRAMU PRO JEJÍ OVĚŘENÍ JE TŘEBA ROZLOŽIT PROGRAM NA ZÁKLADNÍ CESTY A Z KAŽDÉ PAK VYGENEROVAT VERIFIKAČNÍ PODMÍNKU PODMÍNKA V PODOBĚ FORMULE JE PAK AUTOMATICKY OVĚŘENA SMT SOLVEREM VERIFIKAČNÍ PODMÍNKA VYUŽÍVÁ PRINCIPU WEAKEST PRECONDITION PRO ZACHYCENÍ EFEKTU JEDNOTLIVÝCH PŘÍKAZŮ NSWI162: Sémantika programů 19