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

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

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

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

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.

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

Řídicí struktury. alg3 1

Rekurzivní algoritmy

EVROPSKÝ SOCIÁLNÍ FOND. Úvod do PHP PRAHA & EU INVESTUJEME DO VAŠÍ BUDOUCNOSTI

Stromy. Strom: souvislý graf bez kružnic využití: počítačová grafika seznam objektů efektivní vyhledávání výpočetní stromy rozhodovací stromy

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

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

C++ Akademie SH. 2. Prom nné, podmínky, cykly, funkce, rekurze, operátory. Michal Kvasni ka. 20. b ezna Za áte níci C++

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

Úvod do programovacích jazyků (Java)

Programovací jazyk Pascal

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

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

IB111 Úvod do programování skrze Python

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE REALIZACE PŘEKLADAČE I

Základy programování (IZP)

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

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

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

Úvod do programování - Java. Cvičení č.4

Ukazatel (Pointer) jako datový typ - proměnné jsou umístěny v paměti na určitém místě (adrese) a zabírají určitý prostor (počet bytů), který je daný

Programování v C++, 2. cvičení

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

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

Knihovna EpsnetLib TXV první vydání září 2012 změny vyhrazeny

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

Knihovna DataBoxLib TXV první vydání prosinec 2010 změny vyhrazeny

Pole a kolekce. v C#, Javě a C++

8 Třídy, objekty, metody, předávání argumentů metod

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

Struktura programu v době běhu

Kolekce, cyklus foreach

Začínáme vážně programovat. Řídící struktury Přetypování Vstupně výstupní operace Vlastní tvorba programů

Dynamicky vázané metody. Pozdní vazba, virtuální metody

Základy algoritmizace. Hašování

IAJCE Přednáška č. 8. double tprumer = (t1 + t2 + t3 + t4 + t5 + t6 + t7) / 7; Console.Write("\nPrumerna teplota je {0}", tprumer);

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

Rozklad na prvočinitele. 3. prosince 2010

Více o konstruktorech a destruktorech

Knihovna WebGraphLib

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

Obsah přednášky. Příkaz for neúplný. Příkaz for příklady. Cyklus for each (enhanced for loop) Příkaz for příklady

ROZHODOVACÍ PROCEDURY A VERIFIKACE PAVEL SURYNEK, KTIML

Objektové modelování, AD7B36OMO. Návrhy rozhraní. Tomáš Mayer. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze

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

10. Techniky formální verifikace a validace

type Obdelnik = array [1..3, 1..4] of integer; var M: Obdelnik;

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

Paralelní programování

Zadání k 2. programovacímu testu

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Standardní algoritmy vyhledávací.

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

Funkce, intuitivní chápání složitosti

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

Konstruktory a destruktory

Programování v C++ 1, 1. cvičení

Algoritmizace prostorových úloh

Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false

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

PSK3-9. Základy skriptování. Hlavička

ANOTACE vytvořených/inovovaných materiálů

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

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

Algoritmizace a programování

Algoritmizace a programování

ZPRO v "C" Ing. Vít Hanousek. verze 0.3

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Klíčové pojmy: Cyklus, řídící proměnná, inicializace, test podmínky, přerušení cyklu, vnořování cyklů.

Maturitní otázky z předmětu PROGRAMOVÁNÍ

5 Přehled operátorů, příkazy, přetypování

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

IB111 Úvod do programování skrze Python

Algoritmy I, složitost

Programování: základní konstrukce, příklady, aplikace. IB111 Programování a algoritmizace

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

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

Abstraktní datové typy

6 Příkazy řízení toku

Generování vnitřní reprezentace programu

ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK)

Jazyk C# (seminář 6)

2. lekce Algoritmus, cyklus Miroslav Jílek

Zápis programu v jazyce C#

9. Ladění a testování programů. booleovský výraz

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

Rekurze. Jan Hnilica Počítačové modelování 12

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

Unbounded Model Checking

Základy programování (IZP)

Jazyk C++ I. Šablony

Úvod do Matlabu. Praha & EU: Investujeme do vaší budoucnosti. 1 / 24 Úvod do Matlabu

Cykly. Základy programování 1 Martin Kauer (Tomáš Kühr)

Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní

Opakování programování

Transkript:

PI JE JEDNODUCHÝ IMPERATIVNÍ PROGRAMOVACÍ JAZYK OBSAHUJE PODPORU ANOTACÍ NEOBSAHUJE NĚKTERÉ TYPICKÉ KONSTRUKTY PROGRAMOVACÍCH JAZYKŮ JAKO JSOU REFERENCE, UKAZATELE, GLOBÁLNÍ PROMĚNNÉ PODOBÁ SE JAZYKU C S NĚKTERÝMI OMEZENÍMI NSWI162: Sémantika programů 2

@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 && 0 <= l && u < a && 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ů 3

@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 && 0 <= l && u < a && 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; (FORMÁLNÍ) PARAMETRY LinearSearch(b, 0, b - 1, v) ARGUMENTY NSWI162: Sémantika programů 4

PI NEMÁ TYP UKAZATELE ANI REFERENCE, PARAMETRY SE TEDY PŘEDÁVAJÍ HODNOTOU VČETNĚ STRUKTUR A POLÍ NAVÍC PI NEDOVOLUJE MĚNIT HODNOTU PARAMETRŮ MUSÍME TEDY HODNOTU PŘÍPADNĚ PŘIŘADIT DO JINÉ PROMĚNNÉ TAK MŮŽEME VŽDYCKY (I V POSTCONDITION) ODKÁZAT NA VSTUPNÍ HODNOTY PARAMETRŮ return JE JEDINÝ ZPŮSOB, JAKÝM MŮŽE MÍT VOLANÁ FUNKCE EFEKT NA KONTEXT VOLAJÍCÍHO A JAK SMYSLUPLNĚ NAPSAT POSTCONDITION NSWI162: Sémantika programů 5

KROMĚ POLÍ OBSAHUJE JAZYK PI I PODPORU PRO STRUKTURY: typedef struct qs { int pivot; int[] array; qs; POMOCÍ TEČKOVÉ NOTACE SE ODKAZUJEME K JEDNOTLIVÝM POLOŽKÁM, NAPŘ.: qs var; int p := var.pivot; var.array[0] := 5; NSWI162: Sémantika programů 6

ANOTACE JSOU DŮLEŽITOU VLASTNOSTÍ JAZYKA PI ANOTACE JE FORMULE, JEJÍŽ VOLNÉ PROMĚNNÉ JSOU POUZE PROMĚNNÉ FUNKCE, KE KTERÉ SE ANOTACE VÁŽE ANOTACE F NA MÍSTĚ L VYJADŘUJE, ŽE F JE SPLNĚNÁ VŽDYCKY, KDYŽ EXEKUCE PROGRAMU DOSÁHNE L EXISTUJÍ TŘI HLAVNÍ TYPY ANOTACÍ ANOTACE FUNKCÍ, INVARIANTY CYKLŮ A ASERCE NSWI162: Sémantika programů 7

@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 && 0 <= l && u < a && 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ů 8

JEDNÁ SE O DVOJICI ANOTACÍ PRECONDITION A POSTCONDITION PRECONDITION JE FORMULE, JEJÍŽ VOLNÉ PROMĚNNÉ ZAHRNUJÍ POUZE FORMÁLNÍ PARAMETRY DANÉ FUNKCE VYJADŘUJE, CO BY MĚLO BÝT SPLNĚNO PŘI VSTUPU DO FUNKCE NEBO JINÝMI SLOVY, JAKÉ VSTUPY FUNKCE OČEKÁVÁ POSTCONDITION JE FORMULE, JEJÍŽ VOLNÉ PROMĚNNÉ ZAHRNUJÍ FORMÁLNÍ PARAMETRY A SPECIÁLNÍ PROMĚNNOU rv REPREZENTUJÍCÍ NÁVRATOVOU HODNOTU FUNKCE DÁVÁ DO VZTAHU NÁVRATOVOU HODNOTU rv A VSTUPNÍ PARAMETRY NSWI162: Sémantika programů 9

SPECIFIKACE FUNKCE PRO (LINEÁRNÍ) VYHLEDÁVÁNÍ MŮŽE NEFORMÁLNĚ ZNÍT: FUNKCE LINEARSEARCH VRACÍ true PRÁVĚ TEHDY KDYŽ POLE a OBSAHUJE HODNOTU e V ROZMEZÍ INDEXŮ [l, u]. FUNKCE SE CHOVÁ KOREKTNĚ, POKUD l 0 u < a. NSWI162: Sémantika programů 10

@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: true (int i := l; i <= u; i := i + 1) { if (a[i] = e) return true; return false; NSWI162: Sémantika programů 11

NĚKDY SE MŮŽE STÁT, ŽE NETRIVIÁLNÍ (RŮZNÁ OD true) PRECONDITION NENÍ PŘIJATELNÁ NAPŘ. POKUD SE JEDNÁ O PUBLIC FUNKCI NĚJAKÉ KNIHOVNY PAK JE TŘEBA OMEZENÍ Z PRECONDITION NĚJAK PŘENÉST DO POSTCONDITION NSWI162: Sémantika programů 12

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

sorted(a, i, j) PLATÍ, POKUD POLE a JE OD INDEXU i DO INDEXU j VČETNĚ USPOŘÁDANÉ VZESTUPNĚ, TJ.: k, l. i k l j a k a l partitioned(a, i, j, k, l) PLATÍ, KAŽDÝ PRVEK V ROZSAHU [i,j] JE MENŠÍ NEBO ROVEN JAKÉMUKOLIV PRVKU Z ROZSAHU [k,l] POLE a, TJ.: x, y. i x j k y l a x a y NSWI162: Sémantika programů 14

POKUD FUNKCE NEOBSAHUJE (ANI TRANSITIVNĚ) ŽÁDNÉ CYKLY, JE POČET PRŮCHODŮ A TEDY POČET FORMULÍ, KTERÉ JE TŘEBA OVĚŘIT, POMĚRNĚ MALÝ BĚŽNÉ PROGRAMY ALE CYKLY OBSAHUJÍ, PROTO JE NUTNÉ SE S NIMI VYPOŘÁDAT POMOCÍ INVARIANTŮ CYKLŮ: while @ <invariant> (<podmínka>) { <tělo cyklu> for @ <invariant> (<init>; <podmínka>; <inkrementace>) { <tělo cyklu> NSWI162: Sémantika programů 15

for CYKLUS MŮŽEME PŘEPSAT JAKO while CYKLUS NÁSLEDUJÍCÍM ZPŮSOBEM: <inicializace> while @ <invariant> (<podmínka>) { <tělo cyklu> <inkrement> <invariant> MUSÍ PLATIT PŘED KAŽDOU ITERACÍ CYKLU A ZÁROVEŇ PO POSLEDNÍ ITERACI, TEDY PO SKONČENÍ CYKLU PŘED VYHODNOCENÍM PODMÍNKY NSWI162: Sémantika programů 16

@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 && 0 <= l && u < a && 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ů 17

V JAZYKU PI JE MOŽNÉ PŘIDAT ANOTACE KAMKOLIV POKUD SE NEJEDNÁ O PRE- A POSTCONDITION ANI O INVARIANT CYKLU, NAZÝVÁ SE ASSERTION JEDNÁ SE VLASTNĚ O FORMÁLNÍ KOMENTÁŘ, KTERÝ VYJADŘUJE, CO MÁ BÝT SPLNĚNO, NAPŘÍKLAD: @ k > 0 i := i + k ASSERTIONS JSOU PAK OVĚŘENY PŘI PŘEKLADU NEBO PŘI VERIFIKACI SPECIÁLNÍ TYP ASSERTIONS JSOU RUNTIME ASSERTIONS DĚLENÍ NULOU, MODULO NULOU, PŘÍSTUP MIMO ROZSAH POLE, DEREFERENCE NULL, V PI SE GENERUJÍ RUNTIME ASSERTIONS PRO PRVNÍ TŘI TYPY CHYB NSWI162: Sémantika programů 18

@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ů 19

POKUD MÁME FUNKCE OPATŘENÉ ANOTACEMI, MŮŽEME OVĚŘIT JEJICH SPRÁVNOST ŘÍ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 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 ROZLOŽENO NA KONEČNÝ POČET ZÁKLADNÍCH CEST (BASIC PATHS) 2. PRO KAŽDOU ZÁKLADNÍ CESTU SE VYGENERUJE VERIFIKAČNÍ PODMÍNKA NSWI162: Sémantika programů 20

CESTA JE POSLOUPNOST PŘÍKAZŮ ANOTACE (INVARIANTY CYKLŮ, ASSERCE) A VĚTVENÍ PROGRAMU ROZŘEZÁVAJÍ MOŽNÉ PRŮCHODY PROGRAMEM NA KONEČNÝ POČET KONEČNÝCH ZÁKLADNÍCH CEST OD PRECONDITION K PRVNÍMU ŘEZU (ZAČÁTEK CYKLU, PŘÍSTUP DO POLE, ) OD ŘEZU K NÁSLEDUJÍCÍMU ŘEZU OD POSLEDNÍHO ŘEZU K POSTCONDITION VOLÁNÍ FUNKCÍ, VČETNĚ REKURZIVNÍCH, ROZŘEZÁVÁ CESTY PODLE PRE- A POSTCONDITIONS NAKONEC MÁME KONEČNOU MNOŽINU ZÁKLADNÍCH CEST, Z KAŽDÉ Z NICH SE VYGENERUJE VERIFIKAČNÍ PODMÍNKA NSWI162: Sémantika programů 21

@pre 0 <= l && u < a 1 @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 && 0 <= l && u < a && 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ů 22

@pre 0 <= l && u < a 2 @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 && 0 <= l && u < a && 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ů 23

@pre 0 <= l && u < a 3 @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 && 0 <= l && u < a && 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ů 24

@pre 0 <= l && u < a 4 @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 && 0 <= l && u < a && 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ů 25

@pre 0 <= l && u < a 5 @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 && 0 <= l && u < a && 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ů 26

Z KAŽDÉ ZÁKLADNÍ CESTY SE VYGENERUJE JEDNA VERIFIKAČNÍ PODMÍNKA V PODOBĚ IMPLIKACE VERIFIKÁTOR (SMT SOLVER) SE POKUSÍ DOKÁZAT PLATNOST TÉTO FORMULE, TJ. ŽE PŘI JAKÉMKOLIV OHODNOCENÍ VOLNÝCH PROMĚNNÝCH BUDE HODNOTA FORMULE (VERIFIKAČNÍ PODMÍNKY) true NSWI162: Sémantika programů 27

@pre 0 <= l && u < a @post rv <-> exists j. (l <= j && j <= u && a[j] = e) 5 bool LinearSearch(int[] a, int l, int u, int e) { for @ L: l <= i && 0 <= l && u < a && 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; l i 0 l u < a j. l j j < i a j! = e i u false j. l j j u a j = e NSWI162: Sémantika programů 28

VERIFIKACE PAK SPOČÍVÁ V DOKÁZÁNÍ PLATNOSTI VŠECH VERIFIKAČNÍCH PODMÍNEK V PŘÍPADĚ NEPLATNOSTI VERIFIKAČNÍ PODMÍNKY MŮŽEME PROZKOUMAT PROTIPŘÍKLAD, PODLE KTERÉHO V NĚKTERÝCH PŘÍPADECH MŮŽEME UPRAVIT ANOTACE TAK, ABY BYLY DOSTATEČNĚ SILNÉ, A VERIFIKAČNÍ PODMÍNKA TAK MOHLA BÝT DOKÁZÁNA NSWI162: Sémantika programů 29

VERIFIKAČNÍ NÁSTROJ PRO PROGRAMY V PI UŽIVATELSKÉ ROZHRANÍ V JAVĚ, PŘIPOJUJE SE PŘES TCP K SERVERU PRO ÚČELY TOHOTO KURZU BĚŽÍ SERVER NA ADRESE LAB.D3S.MFF.CUNI.CZ NA PORTU 4242 UPRAVENÝ KLIENT DOSTUPNÝ NA STRÁNKÁCH PŘEDMĚTU NSWI162: Sémantika programů 30

DEMO @pre true @post true 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ů 31

DEMO @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ů 32

DEMO @pre true @post sorted(rv, 0, rv - 1) int[] BubbleSort(int[] a_0) { int[] a := a_0; for @ true (int i := a - 1; i > 0; i := i - 1) { for @ true (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ů 33

DEMO @pre true @post sorted(rv, 0, rv - 1) int[] BubbleSort(int[] a_0) { int[] a := a_0; for @ 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 @ 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ů 34

PI JE JEDNODUCHÝ IMPERATIVNÍ JAZYK, JEHOŽ HLAVNÍ SLOŽKOU JSOU ANOTACE ANOTACE JSOU PRE- A POSTCONDITIONS FUNKCÍ, INVARIANTY CYKLŮ A ASSERTIONS UVNITŘ FUNKCÍ ZÁKLADNÍ CESTY DEFINUJÍ VERIFIKAČNÍ PODMÍNKY, JEJICHŽ PLATNOST JE PŘEDMĚTEM VERIFIKACE POMOCÍ PIVC LZE DOKÁZAT PLATNOST ANOTACÍ FUNKCÍ, ZEJMÉNA POSTCONDITIONS A OVĚŘIT TAK ČÁSTEČNOU SPRÁVNOST PROGRAMU NSWI162: Sémantika programů 35

PRVNÍ DOMÁCÍ ÚLOHA DOPLŇTE ANOTACE U FUNKCE containszero TAK, ABYSTE ZACHYTILI JEJÍ SÉMANTIKU, A OVĚŘTE POSTCONDITION POMOCÍ PIVC. TERMÍN PRO ODEVZDÁNÍ JE 16.11.2018, 23:59. @pre true @post true bool containszero(int[] a) { for @ true (int i := 0; i < a ; i := i + 1) { if (a[i] = 0) return true; return false; NSWI162: Sémantika programů 36