Funkcionální programování úvod

Podobné dokumenty
LISP Definice funkcí

FUNKCIONÁLNÍ A LOGICKÉ PROGRAMOVÁNÍ 3. CVIČENÍ

Paradigmata programování 1

Paradigmata programování 1

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

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

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

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]

Paradigmata programování 1

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

1. Od Scheme k Lispu

Programovací jazyk Pascal

Paradigmata programování 1

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

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

Programování v jazyce JavaScript

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

FUNKCIONÁLNÍ A LOGICKÉ PROGRAMOVÁNÍ 5. CVIČENÍ

Lokální definice (1) plocha-kruhu

Jazyky pro umělou inteligenci

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

2.1 Podmínka typu case Cykly Cyklus s podmínkou na začátku Cyklus s podmínkou na konci... 5

Funkcionální programování

Algoritmizace a programování

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

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

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.

Algoritmizace a programování

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

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.

NPRG030 Programování I, 2016/17 1 / :58:13

Martin Hejtmánek hejtmmar

FUNKCIONÁLNÍ A LOGICKÉ PROGRAMOVÁNÍ 2. CVIČENÍ

Operační systémy 2: Zápočtové úkoly

Tvorba výrazu: speciální znaky shellu se uvádějí do apostrofů jednotlivé části výrazu se oddělují mezerou

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

Činnost: 1) Vyhodnotí se výraz E. 2) Jeho hodnota se uloží do proměnné V.

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

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

Lisp 7-1. opakování destruktivních změn seznamů

Paradigmata programování II Přednáška 2: Mutace

NPRG030 Programování I, 2010/11

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

PODPROGRAMY PROCEDURY A FUNKCE

PROGRAMOVÁNÍ V SHELLU

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

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

2 Strukturované datové typy Pole Záznam Množina... 4

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

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

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

Maturitní otázky z předmětu PROGRAMOVÁ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

ALGORITMIZACE PRAKTICKÉ

Programy na PODMÍNĚNÝ příkaz IF a CASE

Booleovská algebra. Booleovské binární a unární funkce. Základní zákony.

Stručný návod k programu Octave

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

IB015 Neimperativní programování. Seznamy, Typy a Rekurze. Jiří Barnat Libor Škarvada

Algoritmizace prostorových úloh

Algoritmizace prostorových úloh

Jazyk C# a platforma.net

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

ŘÍDÍCÍ STRUKTURY - PODMÍNKY

Definice 7.2. Nejmenší přirozené číslo k, pro které je graf G k-obarvitelný, se nazývá chromatické číslo (barevnost) grafu G a značí se χ(g).

Identifikátory označují objekty v programu používané (proměnné, typy, podprogramy).

PARADIGMATA PROGRAMOVÁNÍ 2A MAKRA I

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

Paradigmata programování 1

Skripta ke školení. Základy VBA. vypracoval: Tomáš Herout. tel:

Paradigmata programování 2

Lekce 01 Úvod do algoritmizace

Algoritmizace prostorových úloh

C2110 Operační systém UNIX a základy programování

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

Matematika (KMI/PMATE)

Algoritmizace. 1. Úvod. Algoritmus

0.1 Funkce a její vlastnosti

Přednáška 3. Rekurze 1

Booleovská algebra. Pravdivostní tabulka. Karnaughova mapa. Booleovské n-krychle. Základní zákony. Unární a binární funkce. Podmínky.

Logické programování I

Sada 1 - Základy programování

DUM 06 téma: Tvorba makra pomocí VBA

Functional and Logic Programming Functional languages

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

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

4.2 Syntaxe predikátové logiky

Základní způsoby: -Statické (přidělění paměti v čase překladu) -Dynamické (přiděleno v run time) v zásobníku na haldě

Matematika I (KMI/PMATE)

Prohledávání do šířky = algoritmus vlny

Profilová část maturitní zkoušky 2017/2018

Programování v jazyce JavaScript

PARADIGMATA PROGRAMOVÁNÍ 2A VEDLEJŠÍ EFEKT

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

Seminární práce z Teorie ICT

Da D to t v o é v ty t py IB111: Datové typy

Reprezentace aritmetického výrazu - binární strom reprezentující aritmetický výraz

Složitost 1.1 Opera ní a pam ová složitost 1.2 Opera ní složitost v pr rném, nejhorším a nejlepším p ípad 1.3 Asymptotická složitost

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

IB015 Neimperativní programování. Časová složitost, Typové třídy, Moduly. Jiří Barnat Libor Škarvada

Transkript:

Funkcionální programování úvod Imperativní jazyky založeny na von Neumann architektuře primárním kriteriem je efektivita Modelem je Turingův stroj Základní konstrukcí je příkaz Příkazy mění stavový prostor programu Funkcionální jazyky založeny na matematických funkcích Program definuje funkci Výsledkem je fční hodnota Modelem je lambda kalkul (Church 30tá léta) Základní konstrukcí je výraz (definuje algoritmus i vstup) Výrazy Čisté = nemění stavový prostor programu S vedlejším efektem = mění stavový prostor

Funkcionální programování úvod Vlastnosti čistých výrazů: Hodnota výsledku nezávisí na pořadí vyhodnocování (tzv.church-roserova vlastnost) Výraz lze vyhodnocovat paralelně nahrazení podvýrazu jeho hodnotou je nezávislé na výrazu, ve kterém je uskutečněno (tzv. referenční transparentnost) -vyhodnocení nezpůsobuje vedlejší efekty -operandy operace jsou zřejmé ze zápisu výrazu -výsledky operace jsou zřejmé ze zápisu výrazu

Funkcionální programování- úvod Př. nalezení největšího čísla a) Ze dvou max2(x, Y) def jestliže X > Y pak X jinak Y b) Ze čtyř max4(u, V, X, Y) def max2(max2(u, V), max2(x,y)) c) Z n čísel max(n) def jestliže délka(n) = 2 pak max2(prvý-z(n), duhý-z(n)) jinak max2(prvý-z(n), max(zbytek(n))) Prostředky funkc. progr.: Kompozice složitějších funkcí z jednodušších rekurze

Funkcionální programování- úvod Def.: Matematická fce je zobrazení prvků jedné množiny, nazývané definiční obor fce do druhé množiny, zvané obor hodnot Funkcionální program je tvořen výrazem E. Výraz E je redukován pomocí přepisovacích pravidel Proces redukce se opakuje až nelze dále redukovat Tím získaný výraz se nazývá normální formou výrazu E a je výstupem funkcionálního programu Př. Aritmetický výraz E = (4 +7+ 10) * (5 2) s přepis. pravidly určenými tabulkami pro +, *, Smysl výrazu je redukcemi zachován = vlastnost referenční transparentnosti je vlastností vyhodnocování. funkcionálního programu

Funkcionální programování- úvod Church-Roserova věta: Získání normální formy je nezávislé na pořadí vyhodnocování subvýrazů Funkcionální program sestává z definic funkcí (algoritmu) a aplikace funkcí na argumenty (vstupní data). Aparát pro popis funkcí = lambda kalkul používá operaci aplikace fce F na argumenty A, psáno FA abstrakce ve tvaru λ (x) M [ x ] definuje fci (zobrazení) x M[ x ] Př. λ (x) x * x * x forma = výraz definuje fci kubicka(x) = x * x * x lambda výrazem

Funkcionální programování- úvod Lambda výrazy popisují bezejmenné fce jsou aplikovány na parametry např. ( λ (x) x * x * x ) 5 = 5 * 5 * 5 = 125 popis funkce argumenty aplikace (vyvolání) funkce Ve funkcionálním zápisu je zvykem používat prefixovou notaci ~ funkční notaci př. ((lambda (x) ( * x x)) 5) ((lambda (y) ((lambda (x) (+ (* x x) y )) 2 )) 3) 7 přesvědčíme se?

Funkcionální programování- úvod V LISPu lze zapisovat i ((lambda (y x) (+ ( * x x) y )) 2 3) dá to také 7? ((lambda (y x) (+ ( * x x) y )) 3 2) Pořadí vyhodnocování argumentů: Všechny se vyhodnotí před aplikací fce = eager (dychtivé) evaluation Vyhodnotí se těsně před jeho použitím v aplikaci fce = lazy evaluation Pochopit význam pojmu volná proměnná Vázaná proměnná

Funkcionální programování- LISP Vývoj Maclisp, Franclisp, Scheme, Commonlisp, Autolisp Použití: UI (exp.sys., symb.manipulace, robotika, stroj.vidění, přiroz.jazyk) Návrh VLSI CAD Základní vlastnost: Vše je seznamem (program i data)

Funkcionální programování- LISP Datové typy: S - výrazy -atomy: -čísla (celá i reálná) -znaky -řetězce "to je řetězec" -symboly (T, NIL, ostatní) k označování proměnných a funkcí -seznamy (el1 el2...eln), NIL Seznamy mohou být jednoduché a vnořované např (sqrt (+ 3 8.1 )) je seznam použitelný k vyvolání fce Velká a malá písmena se nerozlišují v CommonLispu

Funkcionální programování- LISP Postup vyhodnocování (často interpretační): Cyklus prováděný funkcí eval: 1. Výpis promptu 2. Uživatel zadá lispovský výraz (zápis fce) 3. Provede se vyhodnocení argumentů 4. Aplikuje funkci na vyhodnocené argumenty 5.Vypíše se výsledek (fční hodnota) Pár příkladů s aritmet. funkcemi Při chybě se přejde do nové úrovně interpretu V chybovém stavu lze napsat help Abort = návrat o úroveň výše (exit) ukončí Lisp

Funkcionální programování- LISP Funkce pracují s určitými typy hodnot Typování je prostředkem zvyšujícím spolehlivost programů Typová kontrola: -statická -dynamická (Lisp, Prolog) nevyžadují deklaraci typů argumentů a funkčních hodnot Zajímavosti -komplexní čísla (* #c(2 2) #c(1.1 2.1)) -nekonečná aritmetika

Funkcionální programování- LISP Elementární funkce CAR FIRST selektor CDR REST selektor CONS konstruktor ATOM test EQUAL test Ostatní fce lze odvodit z elementárních např. test prázdného seznamu (NULL X) je (EQUAL X NIL) Jak zabránit vyhodnocování - QUOTE Př. (FIRST (REST (1 2 3) ) ) (FIRST (REST (1 2 3) ) )

Funkcionální programování- LISP (CONS a b) (A. B) tečka dvojice Lispovská buňka. A B A B (CONS a (b)) NIL. A B A. B NIL

Funkcionální programování- LISP Převod tečka notace do seznamové notace: Vyskytuje-li se. před ( lze vynechat. i ( i odpovídající ) Při výskytu. NIL lze. NIL vynechat Př. Seznam je S-výraz, který má na konci NIL Forma je vyhodnotitelný výraz

Funkcionální programování- LISP Interní reprezentace seznamů

Funkcionální programování- LISP Výsledky fce CONS

Vyhodnoť formu F: Je F atomem Je F atomem T Vrať T ano ne ano Je F atomem NIL ne Je F číslem ne ano ano Vrať NIL Vrať to číslo Vrať hodnotu symbolu F Je první prvek F ano Speciálně zpracuj speciální funkcí (např READ) ne Aplikuj Vyhodnoť na všechny prvky F kromě prvého Na takto získané hodnoty aplikuj fukci, jejíž jméno udává 1.prvek F Získanou hodnotu vrať jako výsledek

Konstruktory APPEND a LIST APPEND:: (seznam x seznam) seznam Vytvoří seznam z argumentů vynechá jejich vnější závorky Př. (APPEND (A B) (B A)) (APPEND (A) (B A)) Common Lisp připouští libovolně argumentů Append (APPEND NIL (A) NIL) (APPEND () (A) ()) (APPEND) (APPEND (A)) (APPEND ((B A)) (A) (B A)) výsledky ( A B B A) (A B A) výsledky (A) (A) nil (A) ((B A) A (B A)

Konstruktory APPEND a LIST LIST:: (seznam x seznam x x seznam) seznam Vytvoří seznam ze zadaných argumentů Př.(LIST A (A B) C) (A (A B) C) (LIST A) (A) (LIST) nil (LIST (X (Y Z) ) (X Y) ) ( (X (Y Z) ) (X Y) ) (APPEND (X (Y Z) ) (X Y) ) (X (Y Z) X Y) (CONS (X (Y Z) ) (X Y) ) ( (X (Y Z) ) X Y )

Selektory CAR a CDR lze vnořovat zkráceně CxxR CxxxR CAAR, CADR, CDAR, CDDR CAAAR, Př. (CAADR (X (Y Z) ) = (CAR (CAR (CDR (X ((Y) Z)) ))) ( (Y ) Z) ( Y ) (CADAR ( ( 1 2 3 ) ( 4 5 ) ) ) 2 Y

LISP - Testy a větvení ATOM NULL NUMBERP SYMBOLP LISTP Př. (NULL NIL) (NULL ( ) ) (LISTP ( ) ) (LISTP NIL ) (SYMBOLP NIL) (SYMBOLP ( ) ) vše je T (NUMBERP (22) ) (NUMBERP 22) (NUMBERP 22) NIL T T

LISP - Testy a větvení = jsou hodnoty argumentů stejná čísla? EQ stejné atomy? EQUAL stejné svýrazy? =hodnota > v sestupném pořadí? >= v nestoupajícím pořadí? < <= obdobné Př. (EQ 3.0 3) (= 3.0 3) (EQ (A) (A) ) (EQ A A) NIL T (EQUAL (A) (A) ) (EQUAL (+ 2 3 3) (CAR (8)) T vypisují stejnou hodnotu T (< 2 3 5 (* 4 4) 20 ) T

LISP - Testy a větvení AND, OR mají libovolně argumentů, NOT má jen jeden Všechny hodnoty různé od NIL považují za pravdivé Argumenty vyhodnocují zleva doprava. Hodnotou fce je hodnota naposledy vyhodnoceného argumentu. Používá zkrácený výpočet argumentů Př. (AND (NULL NIL) (ATOM 5) (+ 4 3)) 7 (OR NIL (= 2 (CAR (2)) (+ 1 1) (- 3.0 1.0) 0) 9) 9

LISP - Testy a větvení COND je spec. fcí s proměnným počtem argumentů (COND (podm1 forma11 forma12 forma1n) (podm2 forma21 forma22 forma2m)... (podmk formak1 formak2 formako) ) Postupně vyhodnocuje podmínky, dokud nenarazí na prvou, která je pravdivá. Pak vyhodnotí formy patřící k pravdivé podmínce. Hodnotou COND je hodnota poslední z vyhodnocených forem. Při nesplnění žádné z podm, není hodnota COND definována (u Common Lispu). Pseudozápis pomocí IF:

LISP - Testy a větvení COND if podm1 then { forma11 forma12 forma1n} else if podm2 then { forma21 forma22 forma2m} else... if podmk then { formak1 formak2 formako} else NIL

LISP - Testy a větvení IF forma (IF podm then-část else-část) Větvení se potřebuje k vytváření uživatelových fcí Př. ( ( lambda (x) ( if (< x 0) (* x x (- x) ) (* x x x) ) ) -5) 125

LISP - Přiřazování Přiřazení je operace, která pojmenuje hodnotu a uloží ji do paměti Je ústupkem od čistě funkcionálního stylu Může zefektivnit a zpřehlednit i funkcionální program Mění vnitřní stav výpočtu (vedlejší efekt přiřazení) Zahrnuje funkce pro: -I/O, -pojmenování uživ. fcí -pojm. hodnot symbolů ( SET, SETQ) (SETQ jméno-symbolu argument) vrátí hodnotu argumentu a naváže hodnotu argumentu na nevyhodnocené jméno symbolu SET je obdobná, ale vyhodnotí i jméno symbolu

(SETQ X 1) 1 (SETQ X (+ 1 X) 2 X 2 >(SETQ LETADLO BOING) BOING >LETADLO BOING >(SETQ BOING JUMBO) JUMBO >(SETQ LETADLO BOING) JUMBO >LETADLO JUMBO LISP - Přiřazování

LISP - Přiřazování >(SET LETADLO AEROBUS) AEROBUS >LETADLO JUMBO >JUMBO AEROBUS

LISP - Přiřazování (LET ( (var-name-1 expression-1) (var-name-2 expression-2)... (var-name-n expression-n)) body ) Vyhodnotí všechny výrazy, provede vazbu hodnot na jména a pak vyhodnotí tělo ( v prostředí LET). Proměnné jsou lokální v LET příkazu, mimo neexistují Hodnotou LET je hodnota poslední formy těla LET. Př. (LET ((a 3) (b 4)) (SQRT (+ (* a a) (* b b))) ) 5