Prevody z pointfree tvaru na pointwise tvar

Podobné dokumenty
Skákalka. Otvoríme si program Zoner Callisto, cesta je Programy Aplikácie Grafika Zoner Callisto.

V nej je potrebné skontrolovať správnosť prenesených a prepočítaných zostatkov z roku 2008.

Kvadratické funkcie, rovnice, 1

Lineárne nerovnice, lineárna optimalizácia

8. Relácia usporiadania

MANUÁL K TVORBE CVIČENÍ NA ÚLOHY S POROZUMENÍM

Kontrola väzieb výkazu Súvaha a Výkaz ziskov a strát Príručka používateľa

PODPROGRAMY. Vyčlenenie podprogramu a jeho pomenovanie robíme v deklarácii programu a aktiváciu vykonáme volaním podprogramu.

Funkcia - priradenie (predpis), ktoré každému prvku z množiny D priraďuje práve jeden prvok množiny H.

M úlohy (vyriešené) pre rok 2017

Textový editor WORD. Práca s obrázkami a automatickými tvarmi vo Worde

Iracionálne rovnice = 14 = ±

Import Excel Univerzál

ALGORITMY A PROGRAMOVANIE VO VÝVOJOVOM PROSTREDÍ LAZARUS. Vývojové prostredie Lazarus, prvý program

Užívateľská príručka k funkcii Zastavenie a pretočenie obrazu

VECIT 2006 Tento materiál vznikol v rámci projektu, ktorý je spolufinancovaný Európskou úniou. 1/4

Postup registrácie certifikátov do Windows

Zvyškové triedy podľa modulu

Ako započítať daňovú licenciu

Riešenie cvičení z 3. kapitoly

KOMISNÝ PREDAJ. Obr. 1

Objektovo orientované programovanie v C# ERIK KUČERA METÓDY VÝPOČTOVEJ INTELIGENCIE PREDNÁŠKA 3

DOBROPISY. Dobropisy je potrebné rozlišovať podľa základného rozlíšenia: 1. dodavateľské 2. odberateľské

Finančné riaditeľstvo Slovenskej republiky. Informácia k výpočtu preddavkov na daň z príjmov fyzických osôb

Finančné riaditeľstvo Slovenskej republiky. Informácia k výpočtu preddavkov na daň z príjmov fyzických osôb

Osoba podľa 8 zákona finančné limity, pravidlá a postupy platné od

Pracovné prostredie MS EXCEL 2003.

VYSPORIADANIE PREHRADENÝCH ZÁVÄZKOV A POHĽADÁVOK

MOCNINY A ODMOCNINY Eva Zummerová

nastavenie a realizácia vzájomných zápočtov v Money S4 / Money S5

Zápis predmetov do AiSu na aktuálny akademický rok

Vytvorenie bootovacieho CD

Finančné riaditeľstvo Slovenskej republiky

Používateľská príručka k aplikácii na SOČ

Finančné riaditeľstvo Slovenskej republiky. Informácia k výpočtu preddavkov na daň z príjmov fyzických osôb

Práca s elektronickou prihláškou SOČ

INTERNET BANKING. Platby cez Internet banking VŠETKO, ČO JE MOŽNÉ. with.vub.sk, Bank of

Užívateľská príručka systému CEHZ. Základné zostavy Farmy podľa druhu činnosti

Hromadná korešpondencia v programe Word Lektor: Ing. Jaroslav Mišovych

Naformátuj to. Naformátuj to. pre samoukov

3D origami - tučniak. Postup na prípravu jednotlivých kúskov: A) nastrihanie, alebo natrhanie malých papierikov (tie budeme neskôr skladať)

Automatický timer pre DX7 návod na inštaláciu a manuál

KEO - Register obyvateľov Prevod údajov

Začínam so zadaním z NEPOUŽÍVAME ROZSAH POKIAĽ HO MUSÍME PRESKOČIŤ

Písomné hlasovanie sedem dní vopred Ak sa rozhoduje písomným hlasovaním pod

3 Determinanty. 3.1 Determinaty druhého stupňa a sústavy lineárnych rovníc

Dodanie tovaru a reťazové obchody Miesto dodania tovaru - 13/1

Import cenových akcií FRESH

Užívateľský manuál Technický server SKGA ročná kontrola HCP

Moderné vzdelávanie pre vedomostnú spoločnosť/projekt je spolufinancovaný zo zdrojov EÚ. Grafy

TomTom Referenčná príručka

Finančný manažment, finančná matematika a účtovníctvo

Zálohy (príjem, odpočítanie) bez modulu Sklad - Prijaté zálohy

Modul PROLUC Podvojné účtovníctvo

7.1 Návrhové zobrazenie dotazu

Preddavky v module Fakturácia

Manuál Elektronická návratka

Súťaž Vráťme knihy do škôl je tu už po 5-krát!

5.3.3 Vyhlásenie na zdanenie príjmov zo závislej činnosti

Manuál Elektronická návratka

SPRIEVODCA PRE POUŽÍVANIE EPAYMENTS

Vážení používatelia programu WISP.

Zásady volieb do Akademického senátu Fakulty medzinárodných vzťahov Ekonomickej univerzity v Bratislave

ANALÝZA PRÍPADNÉHO ROZDIELU A SPÔSOB JEHO ODSTRÁNENIA

Multiplexor a demultiplexor

Imagine. Popis prostredia:

Predaj cez PC pokladňu

Limita funkcie. Čo rozumieme pod blížiť sa? y x. 2 lim 3

Konfigurácia IP Bell 02C Dverný vrátnik a FIBARO Home Center 2

NÁVRH NA ODPREDAJ POZEMKOV SPOLOČNOSTI OBYTNÝ SÚBOR KRASŇANY, S.R.O.

s.r.o. HelpLine:

Návod na použite plaftormy ELMARK E- Business obsahuje popis hlavných možností a funkcií programu. Príručka je štruktúrovaná podľa poradia možností.

Multihosting Užívateľská príručka

RIZIKO V PODNIKU. Prípadová štúdia 2. Ing. Michal Tkáč, PhD.

Microsoft Outlook. Stručný prehľad základných funkcií. Ing.Anna Grejtáková, SPP DFBERG

Názov: Osmóza. Vek žiakov: Témy a kľúčové slová: osmóza, koncentrácia, zber dát a grafické znázornenie. Čas na realizáciu: 120 minút.

Mgr. Stanislav Fila, psychológ CPPPaP Banská Bystrica Centrum pedagogicko-psychologického poradenstva a prevencie (bývalá KPPP) Banská Bystrica

Prekrývanie smerníc a súbežná aplikácia viacerých smerníc pri posudzovaní zhody strojových zariadení

Informačný list 1. Čo je energia? Všetci potrebujeme energiu! Energia doma

Tvorba logického a fyzického dátového modelu relačnej databázy pomocou nástrojov od firmy Oracle výukový tutoriál

Formuláre PowerPoint MGR. LUCIA BUDINSKÁ,

Tlač do PDF a odosielanie dokladov cez . OBSAH

Ak stlačíme OK, prebehne výpočet a v bunke B1 je výsledok.

Inventúra účtov- základný popis.

Manuál Generovanie prístupových práv E-Recept

Task, async, await METÓ DY VÝPOČTOVEJ INTELIGENCIE A C# FA K ULTA E L E K T ROTECHNIKY A INFORMATIKY S LOVENSKÁ T E CHNICKÁ U NIVERZITA

POSTUP GENEROVANIA ŽIADOSTI O KVALIFIKOVANÝ CERTIFIKÁT POMOCOU PROGRAMU COMFORTCHIP.

Pred samotnou prácou s objednávkami odporúčame vykonať súvisiace nastavenia cez menu Firma - Nastavenie

Úplný zápis každého desiatkového čísla môžeme zapísať pomocou polynómu:

Total Commander. Základné nastavenia

Sledovanie nadčasov, vyšetrenia zamestnanca a sprievodu

Metóda vetiev a hraníc (Branch and Bound Method)

Ako funguje stav účtu - prehľad o platbách na zdravotné odvody

Pracovnoprávny vzťah závislá práca

Modul Kontrolné programy

Modré obrázkové slová skladanie slov z písmen

Obsah Úvod... 3 Zapnutie makra... 4 Vyplnenie formulára... 6 Naplnenie hlavnej knihy... 7 Naplnenie stavu zamestnancov... 7 Mapa modulov...

Neplatené voľno / absencia zadanie v programe, oznamovacia povinnosť

Súťaž Vráťme knihy do škôl je tu už po 7-krát!

Ružové obrázkové slová skladanie slov z písmen

Transkript:

Prevody z pointfree tvaru na pointwise tvar Tomáš Szaniszlo 2010-03-24 (v.2) 1 Príklad (.(,)). (.). (,) Prevedenie z pointfree do pointwise tvaru výrazu (.(,)). (.). (,). (.(,)). (.). (,) Teraz je funkcia v tvare f. g. h, kde f = (.(,)), g = (.), h = (,). Použijeme definíciu skladania funkcie (f. g. h) x f (g (h x)), takže budeme musiet pridat na pravú stranu x (a takisto aj do zoznamu parametrov) a celú funkciu dat do zátvoriek (bez zátvoriek by mal prefix prednost pred infixom a f. g. h x by malo implicitné zátvorky f. (g. (h x)), čo má ale iný význam). Dostaneme teda \x -> ((.(,)). (.). (,)) x \x -> (.(,)) ((.) ((,) x)) Teraz máme ako prvú funkciu pravú operátorovú sekciu operátora (.), t.j. (.(,)). Platí (.(,)) a a. (,), pričom v tomto prípade a = ((.) ((,) x)), preto dostávame \x -> ((.) ((,) x)). (,) Zase sme sa dostali do tvaru f. g, kde f = ((.) ((,) x)), g = (,), a preto použijeme (f. g) x f (g x) a postupujeme podobne ako pred chvíl ou celý výraz uzátvorkujeme, pridáme nový parameter y a prepíšeme podl a toho vzt ahu pre skladanie dvoch funkcií: \x y -> (((.) ((,) x)). (,)) y \x y -> ((.) ((,) x)) ((,) y) Teraz máme vl avo ((.) ((,) x)), čo je čiastočná aplikácia funkcie (.) na ((,) x). Tá však teraz už nie je potrebná a dokonca je aj menej výhodná, preto ju odstránime: \x y -> (.) ((,) x) ((,) y) V tejto časti by sme už mohli prepísat zápisy tvaru ((,) a) na (a,). Či to spravíme teraz alebo neskôr, výsledok nezmení, hoci niektorá možnost môže sprehl adnit d alšie výrazy podl a toho, komu čo viac vyhovuje. V tomto výraze máme zase vl avo prefixový zápis skladania funckie. Ten prevedieme do infixu: 1

\x y -> ((,) x). ((,) y) Zas využijeme (f. g) x f (g x)a veci s tým spojené: \x y z -> (((,) x). ((,) y)) z \x y z -> ((,) x) (((,) y) z) Teraz sme už s úpravou výrazu v podstate hotoví a budú nasledovat len menšie prepisovania, konkrétne odstaňovania zbytočných čiastočných aplikácií a úpravy podl a (,) a b (a, b): \x y z -> (,) x ((,) y z) \x y z -> (,) x ((y, z)) \x y z -> (,) x (y, z) \x y z -> (x, (y, z)) A to je konečný (pointwise) tvar pôvodného výrazu, ktorého každá použitá funkcia už nevyžaduje žiadne d alšie parametre. 2 Príklad ((,).). (,) Prevedenie z pointfree do pointwise tvaru výrazu ((,).). (,). ((,).). (,) Funkciu máme v tvare f. g. Obalíme ju zátvorkami a pridáme parameter x, aby sme mohli použit prevod podl a (f. g) x f (g x): \x -> (((,).). (,)) x \x -> ((,).) ((,) x) Teraz máme v l avej funkcii ((,).) operátorovú sekciu, ktorú rozpíšeme a dostaneme \x -> (,). ((,) x) Zas máme funkciu v tvare, f. g a použijeme známu úpravu: \x y -> ((,). ((,) x)) y \x y -> (,) (((,) x) y) Dostali sme funkciu (,), ktorej dávame prvý parameter (((,) x) y). V ňom máme nadbytočné zátvorky, ktoré odstránime, pričom dostaneme ((,) x y) a následne ((x, y)) (x, y), teda máme \x y -> (,) (x, y) Funkcia (,) vyžaduje ešte jeden parameter, preto jej ho dodáme a použitím (,) a b = (a, b) dostaneme konečný tvar: \x y z -> (,) (x, y) z \x y z -> ((x, y), z) 2

3 Príklad dist (curry id) id Prevedenie z pointfree do pointwise tvaru, kde dist f g x = f x (g x). dist (curry id) id Ked sa pozrieme na typ funkcie dist, vidíme, že vyžaduje tri parametre (jej typ by bol (a -> b -> c) -> (a -> b) -> a -> c) a má zatial len dva, preto dodáme jeden: \x -> dist (curry id) id x Ďalej použijeme definíciu funkcie dist a dostávame \x -> (curry id) x (id x) Tam môžeme hned zjednodušit id x na x: \x -> (curry id) x x Teraz musíme zistit, čo robí funkcia curry id. Typ curry je ((a, b) -> c) -> a -> b -> c. Ked že id :: d -> d je ako prvý parameter curry, musí platit (a, b) -> c = d -> d, odkial hned vyplýva (a, b) = c, preto curry id :: a -> b -> (a, b). Teda v tomto konkrétnom príklade má funkcia všetky parametre (dvakrát x). Vzhl adom na to, že curry podl a definície len mení parameter typu (a, b) na dva parametre a, b vidiet, že (curry id) m n = (m, n) = (,) m n. (Mimochodom presne táto funkcia sa preberala aj na cvičení.) Zostáva nám už len nahradit túto funkciu a dostaneme výsledný pointwise tvar: \x -> (x, x) 4 Príklad uncurry (dist. ((.) (curry id))) Previest z pointfree do pointwise tvaru, kde dist je ako v predchádzajúcom. Funkcia uncurry :: (a -> b -> c) -> (a, b) -> c má dva parametre, zatial čo v našom výraze má zatial len jeden, preto jej pridáme aj parameter typu (a, b): \(x, y) -> uncurry (dist. ((.) (curry id))) (x, y) Podl a definície uncurry f (x, y) = f x y dostaneme \(x, y) -> (dist. ((.) (curry id))) x y V tomto prípade máme niečo podobné ako (f. g) x f (g x), takže to vyzerá, že by mohlo platit (f. g) x y f (g x y). Lenže to nie je vo všeobecnosti pravda. Totiž ak napríklad f = (2*), g = (1+) :: Num a => a -> a, v pravej strane to zjavne nebude sediet, ked že g nemôže brat dva parametre. A zároveň to môže dopadnút aj nasledovne: f, g: (f. g) x y f (g x) y. Príklady: ((1+). mod) 4 3 (1+) (mod 4 3) (mod. (1+)) 4 3 mod ((1+) 4) 3 Použijeme čiastočnú aplikáciu funkcie, t.j. pridáme zátvorky: 3

\(x, y) -> ((dist. ((.) (curry id))) x) y Vnútri nich už môžeme použit (f. g) x f (g x): \(x, y) -> ((dist. ((.) (curry id))) x) y \(x, y) -> (dist (((.) (curry id)) x)) y Vo výraze ((.) (curry id)) môžeme v danom kontexte vonkajšie zátvorky odstránit, teda dostaneme \(x, y) -> (dist ((.) (curry id) x)) y Teraz sa zameriame na čierne zátvorky, t.j. na výraz (.) (curry id) x. Tu sa ukazuje, že x je druhý parameter operátora (.), a teda je to v skutočnosti funkcia. (Čo je však v Haskelli stále výraz rovnocenný napr. s číslom.) Výraz môžeme prepísat do infixu podl a bodky: curry id. x (Nutnost zátvoriek okolo curry id odpadá, pretože teraz je bodka infixová a prefix má prednost pred infixom.) Zároveň z predchádzajúceho príkladu vieme, že curry id (,), t.j. (.) (curry id) x (,). x. Teda dostávame \(x, y) -> (dist ((,). x)) y V tomto momente môžeme pôvodne pridané zelené zátvorky odstranit a písat \(x, y) -> dist ((,). x) y Vieme, že funkcia dist berie tri parametre, preto pridáme z a rozpíšeme ju podl a definície: \(x, y) z -> dist ((,). x) y z \(x, y) z -> ((,). x) z (y z) Použijeme podobný prístup ako predtým, t.j. vytvoríme čiastočnú aplikáciu funkcie (,). x a použijeme (f. g) x f (g x): \(x, y) z -> (((,). x) z) (y z) \(x, y) z -> ((,) (x z)) (y z) Tu môžeme posledne pridané zátvorky čiastočnej aplikácie odstránit a po jednoduchej úprave dostávame konečný výsledok: \(x, y) z -> (,) (x z) (y z) \(x, y) z -> ((x z), (y z)) \(x, y) z -> (x z, y z) Vidíme, že y je takisto funkcia. Typ výrazu je (a -> b, a -> c) -> a -> (b, c). 4

5 Niekol ko poznámok Celkovo je dôležité dávat si dobrý pozor na správne prepisovanie výrazov, čiže neprihodit /nevyhodit nejakú zátvorku bodku alebo čokol vek. Jedna z možností kontroly je dat si po jednotlivých úpravách otypovat novoodvodený výraz alebo doň dosadit nejaké hodnoty (ak už vieme typ). Ak sa výsledok/typ nelíši od predchádzajúcich, je dobrá šanca, že krok bol správne vykonaný a je ekvivalentný (ale nemusí to tak byt!). Takisto výsledok daného výrazu môže napovedat o tom, čo tá funckia robí. Konkrétne u týchto príkladov, hlavne 1 3, to dobre vidiet, ked že okrem parametrov má výsledok pridané len dátové konštruktory. V prípade operátorov, ktoré sú komutatívne, nie je správne vyrábat l ubovol nú sekciu, napr. \x -> x + 3 \x -> 3 + x (3+). Prevod medzi jednotlivými tvarmi nie je jednoznačný, teda môže sa vel mi l ahko stat, že pri dvoch prevodoch vyjdú dva rôzne tvary výrazu, avšak oba budú správne. Napríklad \x -> x \x -> id x id id. id flip const 3... Samozrejme nie je nutné používat formálne parametre x, y,...; je to len konvencia a môžu sa použit aj iné (napríklad v príklade 4 by bolo vhodnejšie použit \(f, g) x -> (f x, g x)). 5.1 Pointfree na pointwise Pri počítaní takýchto príkladov sa treba držat niekol kých zásad. Napríklad často sa dá využit (f. g) x f (g x), prípadne obdobný vzt ah pre viacero funkcií, čím sa zbavíme operácie skladania funkcií. Ďalej v prípade, že nal avo máme priamo funkciu, tak sa ju snažíme prepísat pomocou parametrov, ktoré za ňou nasledujú, podl a jej definície. Do každej funkcie musíme zadat tol ko parametrov, kol ko vyžaduje. 5.2 Pointwise na pointfree Pri takýchto prevodoch väčšinou platí jedna hlavná zásada, ktorej podriad ujeme používané kroky. Totiž snažíme sa postupne presúvat parametre úplne doprava tak, aby za nimi nebolo nič (operátor, iný parameter, zátvorky,... ), a to robíme pre každý jeden v opačnom poradí, ako sú uvedené v zozname parametrov, napríklad vo výraze \x y z -> x - z * (2 / y) sa snažíme dostat napravo najprv z, a ked tam bude, tak ho môžeme zmazat zo zoznamu i z výrazu. V prípade, že premennú máme ako prvý parameter funkcie alebo operátora, výhodne sa dá použit pravá operátorová sekcia alebo funkcia flip: \x -> (f x. g 2) (. (g 2)) (f x), či \x -> div x 2 flip div 2. 5