Paradigmata programování 1

Podobné dokumenty
Paradigmata programování 1

Paradigmata programování 1

Jazyk Scheme: jeho syntax a sémantika

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

Paradigmata programování 1

IB111 Úvod do programování skrze Python Přednáška 13

PARADIGMATA PROGRAMOVÁNÍ 1A

Paradigmata programování 1

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

IB015 Neimperativní programování. Organizace a motivace kurzu, programovací jazyk Haskell. Jiří Barnat

Programovací jazyk Pascal

1 Základních pojmy z oblasti programování, vyšší programovací jazyky, programovací paradigmata

Úvod. Programovací paradigmata

Funkcionální programování. Kristýna Kaslová

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

PARADIGMATA PROGRAMOVÁNÍ 2 PŘÍSLIBY A LÍNÉ VYHODNOCOVÁNÍ

Algoritmizace a programování

IB111 Programování a algoritmizace. Programovací jazyky

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

Úvod do programovacích jazyků (Java)

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

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

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

Paměť počítače. alg2 1

Martin Hejtmánek hejtmmar

Funkcionální programování úvod

DTP Základy programování Úvod do předmětu

Předměty. Algoritmizace a programování Seminář z programování. Verze pro akademický rok 2012/2013. Verze pro akademický rok 2012/2013

Operátory. Základy programování 1 Tomáš Kühr

Algoritmizace a programování

IB111 Úvod do programování skrze Python Přednáška 13

11. Přehled prog. jazyků

ALGORITMIZACE A PROGRAMOVÁNÍ

Přednáška 3. Rekurze 1

1. Od Scheme k Lispu

Virtuální počítač. Uživatelský program Překladač programovacího jazyka Operační systém Interpret makroinstrukcí Procesor. PGS K.

Denotační sémantika. Marek Běhálek

Program a životní cyklus programu

Masarykova střední škola zemědělská a Vyšší odborná škola, Opava, příspěvková organizace

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

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

Prolog PROgramming in LOGic část predikátové logiky prvního řádu rozvoj začíná po roce 1970 Robert Kowalski teoretické základy Alain Colmerauer, David

Matematika v programovacích

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ

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

Úvod z historie. Kompilátory. Kompilace / Kompilátor Compile / Compiler. Pojem kompilátoru. Úvod z historie

Programovací jazyk univerzální notace pro zápis algoritmů, implementována.

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

Algoritmizace a programování. Ak. rok 2012/2013 vbp 1. ze 44

ZÁKLADY PROGRAMOVÁNÍ. Mgr. Vladislav BEDNÁŘ /14

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

1 Strukturované programování

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

Pojem algoritmus. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava

NPRG030 Programování I, 2018/19 1 / :25:37

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

Hanojská věž. T2: prohledávání stavového prostoru. zadání [1 1 1] řešení [3 3 3] dva možné první tahy: [1 1 2] [1 1 3]

Základní datové struktury

PARADIGMATA PROGRAMOVÁNÍ 2A INTERPRET S VEDLEJŠÍMI EFEKTY A MAKRY

Programování v C++ Úplnej úvod. Peta (maj@arcig.cz, SPR AG )

Úvod do programování

Programovací jazyk. - norma PASCAL (1974) - implementace Turbo Pascal, Borland Pascal FreePascal Object Pascal (Delphi)

Přednáška 7. Celočíselná aritmetika. Návratový kód. Příkazy pro větvení výpočtu. Cykly. Předčasné ukončení cyklu.

Překladač a jeho struktura

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

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

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

Sada 1 - Základy programování

8) Jaké jsou důvody pro použití víceprůchodového překladače Dříve hlavně kvůli úspoře paměti, dnes spíše z důvodu optimalizace

Slepé prohledávání do šířky Algoritmus prohledávání do šířky Při tomto způsobu prohledávání máme jistotu, že vždy nalezneme koncový stav, musíme ale p

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE STRUKTURA PŘEKLADAČE

Soulad studijního programu. Aplikovaná informatika

Dokumentace programu sdc

Algoritmizace a programování. Ak. rok 2012/2013 vbp 1. ze 44

Úvod do informatiky. Miroslav Kolařík

3 Co je algoritmus? Trocha historie Definice algoritmu Vlastnosti algoritmu... 3

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

MQL4 COURSE. By Coders guru -4 Operace & Výrazy

Sémantika Tabulka symbolů Intermediální kód Typová kontrola, přetypování Statická a dynamická sémantika. Sémantická analýza.

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

Základy algoritmizace

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

Architektura počítačů

VISUAL BASIC. Přehled témat

Sada 1 - Základy programování

Základy algoritmizace a programování

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

Maturitní témata. IKT, školní rok 2017/18. 1 Struktura osobního počítače. 2 Operační systém. 3 Uživatelský software.

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

Úvod do teoretické informatiky

Algoritmy I. Cvičení č. 2, 3 ALGI 2018/19

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

Racionální čísla, operátory, výrazy, knihovní funkce

Základy algoritmizace a programování

Organizace předmětu, podmínky pro získání klasifikovaného zápočtu

Tematická oblast: Programování 2 (VY_32_INOVACE_08_2_PR) Anotace: Využití ve výuce: Použité zdroje:

Racionální čísla, operátory, výrazy, knihovní funkce

Logické programování

Vyřešené teoretické otázky do OOP ( )

Paradigmata programování II Přednáška 1: Vedlejší efekt

Transkript:

Paradigmata programování 1 Program, jeho syntax a sémantika Vilém Vychodil Katedra informatiky, PřF, UP Olomouc Přednáška 1 V. Vychodil (KI, UP Olomouc) Program, jeho syntax a sémantika Přednáška 1 1 / 33

Paradigmata programování Přednášející: doc. RNDr. Vilém Vychodil, Ph.D. e-mail: vilem.vychodil@upol.cz www: http://vychodil.inf.upol.cz/ Konzultační hodiny (viz webové stránky) Zdroje: učební texty, slidy, poznámky, videozáznamy přednášek http://vychodil.inf.upol.cz/kmi/pp1/ Udělení zápočtu v kompetenci cvičících V. Vychodil (KI, UP Olomouc) Program, jeho syntax a sémantika Přednáška 1 2 / 33

Přehled kursu 1 Program, jeho syntax a sémantika 2 Vytváření abstrakcí pomocí procedur 3 Lokální vazby a definice 4 Tečkové páry, symbolická data a kvotování 5 Seznamy 6 Explicitní aplikace a vyhodnocování 7 Akumulace 8 Rekurze a indukce 9 Hloubková rekurze na seznamech 10 Kombinatorika na seznamech, reprezentace stromů a množin 11 Kvazikvotování a manipulace se symbolickými výrazy 12 Čistě funkcionální interpret Scheme V. Vychodil (KI, UP Olomouc) Program, jeho syntax a sémantika Přednáška 1 3 / 33

Literatura Závazná literatura: Konečný J., Vychodil V.: Paradigmata programování 1A, 1B http://vychodil.inf.upol.cz/download/text-books/pp1a.pdf http://vychodil.inf.upol.cz/download/text-books/pp1b.pdf Doporučená literatura: Sperber M., Dybvig R., Flatt M., Van Straaten A., Findler R., Matthews J.: Revised 6 Report on the Algorithmic Language Scheme. Journal of Functional Programming 19(S1)2009, 1 301. Abelson H., Sussman G. J.: Structure and Interpretation of Computer Programs. The MIT Press, Cambridge, Massachusetts, 2nd edition, 1986. Felleisen M., Findler R. B., Flatt M., Krishnamurthi S.: How to Design Programs: An Introduction to Computing and Programming. The MIT Press, Cambridge, Massachusetts, 2001. V. Vychodil (KI, UP Olomouc) Program, jeho syntax a sémantika Přednáška 1 4 / 33

Přednáška 1: Přehled 1 Úvodní pojmy: programovací jazyk, program, výpočetní proces, syntaxe a sémantika programu, přehled základních paradigmat programování. 2 Jazyk Scheme: symbolické výrazy a syntaxe jazyka Scheme, abstraktní interpret jazyka Scheme, primitivní procedury a jejich aplikace, rozšíření jazyka o speciální formy, vytváření abstrakcí pojmenováním hodnot. V. Vychodil (KI, UP Olomouc) Program, jeho syntax a sémantika Přednáška 1 5 / 33

Výpočetní proces a program Výpočetní proces aktivní (dynamická) entita počátek, konec, prováděn v elementárních krocích vstup = výstup + vedlejší efekty Program pasivní (statická) entita; soubor na disku (program = data) výpočetní proces = vykonávání programu Programování tvůrčí činnost vytváření programu; programátor programovací jazyk = soubor pravidel v souladu s kterými je vytvořen program Jak psát program tak, abychom vytvořili zamýšlený výpočetní proces? V. Vychodil (KI, UP Olomouc) Program, jeho syntax a sémantika Přednáška 1 6 / 33

Paradigmata programování paradigma = styl Účel kursů PP: seznámení se základními programovací styly vytváření programů s využitím různých stylů programování zkoumání různých typů výpočetních procesů a jejich efektivity zkoumání efektivity programování (chybovost) problematika interpretace programů Možné postupy: 1 pro každé hlavní paradigma zvolíme typický jazyk 2 jeden (multiparadigmový) jazyk V. Vychodil (KI, UP Olomouc) Program, jeho syntax a sémantika Přednáška 1 7 / 33

Program a algoritmus Program vs. algoritmus: dva pojmy algoritmus: 1 naivní pojem algoritmus (místy ošidné ) 2 formální pojem algoritmus (zatím příliš složité ) pro nás: algoritmus = takový program, že příslušný výpočetní proces pro libovolný vstup ukončí svoji činnost po konečně mnoha krocích Více v kursech: algoritmická matematika formální jazyky a automaty vyčíslitelnost a složitost V. Vychodil (KI, UP Olomouc) Program, jeho syntax a sémantika Přednáška 1 8 / 33

Rovnocennost programovacích jazyků Problém volby programovacího jazyka : Je jazyk A lepší než jazyk B? z pohledu možnosti řešení problémů jsou všechny rozumné programovací jazyky rovnocenné (stejně silné) pojem Turingovsky úplný jazyk (Alan Turing) Pozor ale: různé jazyky poskytují různý komfort při programování nezanedbatelný aspekt (!!) vyšší míra abstrakce = vyšší komfort pro uživatele (programátora) extrémní příklad: jazyk brainfuck (pouze 8 elementárních instrukcí) Více v kursech: formální jazyky a automaty vyčíslitelnost a složitost V. Vychodil (KI, UP Olomouc) Program, jeho syntax a sémantika Přednáška 1 9 / 33

Základní klasifikace programovacích jazyků Programovatelné vs. neprogramovatelné počítače neprogramovatelné ( 1945) programovatelné (cca 1945 ); zajímavý přehled na http://damol.info/12/10/04/holmes/ Nižší programovací jazyky kódy stroje (vykonávané přímo procesorem) assemblery (mnemotechnické zkratky instrukcí, návěstí) autokódy, bajtkódy,... Vyšší programovací jazyky vyšší míra abstrakce (aritmetické operace, podprogramy, funkce, cykly) velké množství jazyků podporující různá paradigmata programování celá řada výhod: čitelnost programu, knihovny, přenositelnost,... V. Vychodil (KI, UP Olomouc) Program, jeho syntax a sémantika Přednáška 1 10 / 33

Vytváření výpočetních procesů kód stroje = výpočetní proces vytváří procesor v ostatních případech: interpretace prováděna interpretem (speciální program) výrazy v programu postupně načítány po načtení výrazu interpret vygeneruje příslušný výpočetní proces překlad (kompilace) prováděna překladačem (kompilátorem, spec. prog.) program je načten celý a je vyprodukován ekvivalentní kód v jiném jazyku: Rozlišujeme: překlad do kódu stroje překlad do assembleru překlad do (jiného) nižšího jazyka (bajtkód) překlad do (jiného) vyššího jazyka (jazyk C) hybridní přístupy (např.: just in time compilers) V. Vychodil (KI, UP Olomouc) Program, jeho syntax a sémantika Přednáška 1 11 / 33

Syntax a sémantika programu Dva (zcela jiné) pojmy: syntax říká, jak program vypadá (jak se zapisuje) sémantika říká, jaký má program význam (co dělá příslušný výp. proces) SYNTAX SÉMANTIKA výraz: 03/05/2010 (možný zápis data, různé interpretace) výraz: X=Y+3 (různý význam v jazycích C, Pascal, Metapost, Prolog) Chyby v programech: syntaktické chyby chyby v zápisu programu (snadno odstranitelné) sémantické chyby: zjištěné během překladu / před interpretací (např. kolize typů) za běhu programu (noční můra všech programátorů, Mars Climate Orbiter) chyby dělají i zkušení programátoři (!!) V. Vychodil (KI, UP Olomouc) Program, jeho syntax a sémantika Přednáška 1 12 / 33

Příklad (Notace zápisu aritmetických výrazů) infixová symbol pro operace je mezi operandy ( běžná notace ) plusy: snadno se čte minusy: asociativita, priorita, operace pouze dva argumenty Příklad: 2 * (3 + 5) prefixová symbol pro operace před operandy plusy: libovolný počet operandů, odpadají problémy s asociativitou / prioritou minusy: nezvyk, velké množství závorek Příklad: (* 2 (+ 3 5)) (vynásob dvojku se součtem trojky a pětky) postfixová symbol pro operace za operandy Příklad: (2 (3 5 +) *) postfixová bezzávorková (polská) plusy: strojově snadno analyzovatelná minusy: nejméně čitelná, operace mají fixní počet operandů Příklad: 2 3 5 + * V. Vychodil (KI, UP Olomouc) Program, jeho syntax a sémantika Přednáška 1 13 / 33

Základní paradigmata programování procedurální: výpočet = sekvenční provádění procedur významný rys: přiřazovací příkaz teoretický model: RAM stroj (John von Neumann) jazyky: Fortran, Algol, Pascal, C funkcionální: výpočet = postupná aplikace funkcí významný rys: funkce vyšších řádů teoretický model: λ-kalkul (Alonzo Church) jazyky: Scheme, Common LISP, Haskel, ML logické: výpočet = automatická dedukce významný rys: deklarativní charakter teoretický model: matematická logika, princip rezoluce (Robinson) jazyky: Prolog, Datalog V. Vychodil (KI, UP Olomouc) Program, jeho syntax a sémantika Přednáška 1 14 / 33

Základní paradigmata programování Procedurální jazyky dělíme na: naivní: významný rys: nekoncepční jazyky: Basic nestrukturované: významný rys: explicitní příkaz skoku přejdi na řádek jazyky: Fortran strukturované: významný rys: skok nahrazen podmíněnými cykly jazyky: Algol, Pascal, C Další významná paradigmata: paralelní (více souběžných výpočetních procesů) objektové (interakce entit, které mají vnitřní stav) V. Vychodil (KI, UP Olomouc) Program, jeho syntax a sémantika Přednáška 1 15 / 33

Jazyk Scheme Co je Scheme? multiparadigmový jazyk preferované paradigma je funkcionální specifikován v revidovaném reportu R 6 RS programy obvykle interpretovány (existují výjimky) volně dostupné interprety: GUILE, MIT Scheme, Bigloo,... Racket: http://racket-lang.org/ V. Vychodil (KI, UP Olomouc) Program, jeho syntax a sémantika Přednáška 1 16 / 33

Symbolické výrazy a programy program (v jazyku Scheme) = konečná posloupnost symbolických výrazů Definice (symbolický výraz, S-výraz) 1 Každé číslo je symbolický výraz (zapisujeme 12, -10, 2/3, 12.45, 4.32e-20, -5i, 2+3i, a pod.); 2 každý symbol je symbolický výraz (zapisujeme sqrt, +, quotient, even?, muj-symbol, ++?4tt, a pod.); 3 jsou-li e 1, e 2,..., e n symbolické výrazy (pro n 1), pak výraz ve tvaru (e 1 e 2 e n ) je symbolický výraz zvaný seznam. není definice kruhem (!!) složitější seznamy se definují pomocí jednodušších pro (e 1 e 2 e n ) je n délka seznamu V. Vychodil (KI, UP Olomouc) Program, jeho syntax a sémantika Přednáška 1 17 / 33

Sémantika jazyka Scheme S-výraz = syntaktický pojem výpočetní proces = vzniká postupným vyhodnocováním S-výrazů Vyhodnocení S-výrazu; neformálně,!! Každé číslo se vyhodnotí na hodnotu, kterou reprezentuje. (čísla se vyhodnocují na sebe sama ) Každý symbol se vyhodnotí na svojí aktuální vazbu. (symboly se vyhodnocují na hodnoty, které jsou na ně navázané) Každý seznam (e 1 e 2 e n ) se vyhodnotí: 1 vyhodnotí se první prvek seznamu (hlava) = procedura (operace), 2 vyhodnotí se zbylé prvky seznamu (tělo) e 2,..., e n, 3 procedura je aplikována s výsledky vyhodnocení e 2,..., e n. Zbývá upřesnit: hodnota, vazba symbolu, procedura, aplikace V. Vychodil (KI, UP Olomouc) Program, jeho syntax a sémantika Přednáška 1 18 / 33

Elementy jazyka, interní a externí reprezentace Reader podprogram interpretu Scheme načítá S-výrazy a převádí je na jejich interní reprezentace Elementy jazyka = hodnoty čísla (efektivní vnitřní reprezentace) symboly (tabulky symbolů jména) seznamy (dynamický lineární spojový seznam) primitivní procedury (zabudované v interpretu, koncept černé skříňky ) Printer podprogram interpretu Scheme pro elementy vrací jejich textovou externí reprezentace externí reprezentace primitivních procedur není čitelná readerem (rys) V. Vychodil (KI, UP Olomouc) Program, jeho syntax a sémantika Přednáška 1 19 / 33

Prostředí: tabulka (počátečních) vazeb symbolů Prostředí: symbol element E 1 F 1 E 2. F 2. E k. F k. Možnosti: aktuální vazba symbolu E i v prostředí je F i aktuální vazba symbolu E není definovaná V. Vychodil (KI, UP Olomouc) Program, jeho syntax a sémantika Přednáška 1 20 / 33

Abstraktní interpret jazyka Scheme Interpretace programů probíhá v cyklu REPL: read prázdný vstup činnost interpretu končí, nebo: načten první vstupní S-výraz E a převeden do interní reprezentace F možnost vzniku syntaktické chyby eval F se vyhodnotí na G (netriviální krok) print převod elementu G do externí reprezentace vytištění externí reprezentace loop V. Vychodil (KI, UP Olomouc) Program, jeho syntax a sémantika Přednáška 1 21 / 33

Aplikace primitivních procedur jádro vyhodnocování elementů aplikací procedur vzniká kvalitativní výpočetní proces Definice (aplikace primitivních procedur) Nechť E je primitivní procedura a E 1,..., E n jsou libovolné elementy jazyka. Výsledek aplikace E na argumenty E 1,..., E n v tomto pořadí: Apply[E, E 1,..., E n ]. Pokud je výsledkem této aplikace element F, pak píšeme Apply[E, E 1,..., E n ] = F. Příklad: Apply[ primitivní procedura násobení, 2, 5, 10] = 100. V. Vychodil (KI, UP Olomouc) Program, jeho syntax a sémantika Přednáška 1 22 / 33

Definice (vyhodnocení elementu E) Výsledek vyhodnocení elementu E, značeno Eval[E], je definován: (A) Pokud je E číslo, pak Eval[E] := E. (B) Pokud je E symbol, pak: (B.1) Pokud E má aktuální vazbu F, pak Eval[E] := F. (B.e) Pokud E nemá vazbu, pak CHYBA: Symbol E nemá vazbu.. (C) Pokud je E seznam tvaru (E 1 E 2 E n ), pak pro F 1 := Eval[E 1 ] (nejprve vyhodnotíme první prvek seznamu, jeho hodnota je F 1 ) a rozlišujeme: (C.1) Pokud je F 1 procedura, pak se v nespecifikovaném pořadí vyhodnotí zbylé prvky seznamu E, to jest uvažujeme F 2 := Eval[E 2 ],...,F n := Eval[E n ]. Pak Eval[E] := Apply[F 1, F 2,..., F n ] (výsledkem vyhodnocení E je element vzniklý aplikací procedury F 1 na argumenty F 2,..., F n ). (C.e) Pokud F 1 není procedura: CHYBA: Nelze provést aplikaci: první prvek seznamu E se nevyhodnotil na proceduru.. (D) Ve všech ostatních případech klademe Eval[E] := E. V. Vychodil (KI, UP Olomouc) Program, jeho syntax a sémantika Přednáška 1 23 / 33

Příklad (Vybrané primitivní funkce: aritmetika) Sčítání: (+ 1 2 3) = 6 (+ (+ 1 2) 3) = 6 (+ 1 (+ 2 3)) = 6 (+ 20) = 20 (+) = 0 Násobení: (* 4 5 6) = 120 (* (* 4 5) 6) = 120 (* 4 (* 5 6)) = 120 (* 4) = 4 (*) = 1 Odčítání: (- 1 2) = -1 (- 1 2 3) = -4 (- (- 1 2) 3) = -4 (- 1 (- 2 3)) = 2 (- 1) = -1 Dělení: (/ 4 5) = 4/5 (/ 4 5 6) = 2/15 (/ (/ 4 5) 6) = 2/15 (/ 4 (/ 5 6)) = 24/5 (/ 4) = 1/4 V. Vychodil (KI, UP Olomouc) Program, jeho syntax a sémantika Přednáška 1 24 / 33

Příklad (Zajímavé rysy aritmetiky ve Scheme) Racionální čísla a čísla v semilogaritmickém tvaru: (/ 2 3) = 2/3 (/ 2 3.0) = 0.6666666666666666 (* 1.0 (/ 2 3)) = 0.6666666666666666 (sqrt 4) = 2 (* -2e-20 4e40) = -8e+20 Libovolně přesná racionální čísla: 6004799503160661/9007199254740992 Komplexní čísla: 3+2i, -3-2i, +2i, -2i, -2/3+4/5i, 0.4e10+2i, 2/3-0.6i Implicitní přetypování (koerce) a explicitní přetypování: (* 2/3 1.0) = 0.6666666666666666 (exact->inexact 2/3) = 0.6666666666666666 (inexact->exact 0.6666666666666666) = 600479 /900719 (rationalize 600479/900719 1/1000) = 2/3 V. Vychodil (KI, UP Olomouc) Program, jeho syntax a sémantika Přednáška 1 25 / 33

Vytváření abstrakcí pojmenováním hodnot Motivační příklad: účetní program počítající se sazbou DPH jak vyřešit problém změny sazby DPH vede na pojmenovanou hodnotu: symbol vat-value s vazbou 10 nebo 20 Chceme možnost definovat vazbu symbolu: (define vat-value 20) Problém: Na define nemůže být navázána procedura. (!!) Nutné rozšířit abstraktní interpret o speciální formy (nový element jazyka) V. Vychodil (KI, UP Olomouc) Program, jeho syntax a sémantika Přednáška 1 26 / 33

Definice (doplnění vyhodnocovacího procesu o speciální formy) Výsledek vyhodnocení elementu E, značeno Eval[E], je definován: (A) (B) (C) Pokud je E seznam tvaru (E 1 E 2 E n ), pak pro F 1 := Eval[E 1 ] (nejprve vyhodnotíme první prvek seznamu, jeho hodnota je F 1 ) a rozlišujeme: (C.1) Pokud je F 1 procedura, pak (C.2) Pokud je F 1 speciální forma, pak Eval[E] := Apply[F 1, E 2,..., E n ]. (C.e) Pokud F 1 není procedura ani speciální forma: CHYBA: Nelze provést aplikaci: první prvek seznamu E se nevyhodnotil na proceduru ani na speciální formu.. (D) Každá speciální forma si sama určuje: jaké argumenty a jakém pořadí budou vyhodnoceny; rozdíl proti procedurám (!!) V. Vychodil (KI, UP Olomouc) Program, jeho syntax a sémantika Přednáška 1 27 / 33

Definice (speciální forma define) Speciální forma define se používá se dvěma argumenty ve tvaru: (define jméno výraz ) Postup aplikace speciální formy: 1 ověří se, jestli je jméno symbol (jinak CHYBA: První výraz musí být symbol. ) 2 F := Eval[ výraz ] 3 v prostředí je vytvořena nová vazba symbolu jméno na element F 4 pokud již jméno měl vazbu, původní vazba je nahrazena elementem F 5 výsledkem aplikace je nedefinované hodnota (nový typ elementu) U každé zavedené speciální formy musíme definovat: syntax v jakém tvaru se forma používá, sémantiku jak probíhá její interpretace, co je výsledkem a vedlejším efektem. V. Vychodil (KI, UP Olomouc) Program, jeho syntax a sémantika Přednáška 1 28 / 33

Příklad (příklady použití define) (define a 20) (* 2 a) = 40 (sqrt (+ a 5)) = 5 (define a (+ a 1)) a = 21 (define b (+ 4 a)) a = 21 b = 25 (define a 666) a = 666 b = 25 (define + -) (+ 20) = -20 V. Vychodil (KI, UP Olomouc) Program, jeho syntax a sémantika Přednáška 1 29 / 33

Pravdivostní hodnoty #t pravda (angl. true) #f nepravda (angl. false) predikáty procedury vracející pravdivostní hodnoty jako výsledky Příklad #t = #t #f = #f (<= 2 3) = #t (< 2 3) = #t (= 2 3) = #f (= 2 2.0) = #t (= 0.5 1/2) = #t (>= 3 3) = #t V. Vychodil (KI, UP Olomouc) Program, jeho syntax a sémantika Přednáška 1 30 / 33

Definice (speciální forma if) Speciální forma if se používá se dvěma argumenty ve tvaru: (if test důsledek náhradník ), přitom náhradník je nepovinný argument a nemusí být uveden. Aplikace: 1 nejprve vyhodnocen argument test 2 pokud je výsledná hodnota různá od #f, pak je výsledkem aplikace hodnota vzniklá vyhodnocením argumentu důsledek 3 pokud je výsledná hodnota #f, pak: pokud je náhradník přítomen, pak je výsledkem aplikace výsledek vyhodnocení argumentu náhradník pokud není náhradník přítomen, pak je výsledek aplikace nedefinovaný. V. Vychodil (KI, UP Olomouc) Program, jeho syntax a sémantika Přednáška 1 31 / 33

Podmíněné výrazy Zobecněné pravdivostní hodnoty: pravda = vše kromě #f nepravda = #f Důsledek: jakýkoliv element může být použitý jako pravdivostní hodnota Pozor: if není procedura (!!) if vyhodnocuje druhý a třetí argument v závislosti na prvním teoreticky jej lze chápat jako proceduru (do budoucna neudržitelné) V. Vychodil (KI, UP Olomouc) Program, jeho syntax a sémantika Přednáška 1 32 / 33

Příklad (Podmíněné výrazy) (define a 10) (define b 13) (if (> a b) a b) = 13 (if (<= a b) (if (= a b) a (- a)) #f) = -10 (if 1 2 3) = 2 ((if #f + -) 10 20) = -10 V. Vychodil (KI, UP Olomouc) Program, jeho syntax a sémantika Přednáška 1 33 / 33