Functional Programming

Similar documents
Functional Programming

Functional Programming

構造化プログラミングと データ抽象

構造化プログラミングと データ抽象

オートマトン 形式言語及び演習 1. 有限オートマトンとは 酒井正彦 形式言語 言語とは : 文字列の集合例 : 偶数個の 1 の後に 0 を持つ列からなる集合 {0, 110, 11110,

次に示す数値の並びを昇順にソートするものとする このソートでは配列の末尾側から操作を行っていく まず 末尾の数値 9 と 8 に着目する 昇順にソートするので この値を交換すると以下の数値の並びになる 次に末尾側から 2 番目と 3 番目の 1

プログラミング実習I

Microsoft PowerPoint - 3.ppt [互換モード]

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

Functional Programming

関数 C 言語は関数の言語 関数とは 関数の定義 : f(x) = x * x ; 使うときは : y = f(x) 戻り値 引数

77

Microsoft PowerPoint - kougi7.ppt

Microsoft PowerPoint - 10.ppt [互換モード]

Microsoft PowerPoint - IntroAlgDs-05-4.ppt

Microsoft PowerPoint - ProD0107.ppt

始めに, 最下位共通先祖を求めるための関数 LcaDFS( int v ) の処理を記述する. この関数は値を返さない再帰的な void 関数で, 点 v を根とする木 T の部分木を深さ優先探索する. 整数の引数 v は, 木 T の点を示す点番号で, 配列 NodeSpace[ ] へのカーソル

program7app.ppt

PowerPoint Presentation

Sort-of-List-Map(A)

5. アルゴリズムと計算量

PowerPoint プレゼンテーション

目次 研究目的 背景システム開発について実験および評価結論

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

プログラミング入門1

論理と計算(2)

gengo1-11

プログラミング入門1

43-03‘o’ì’¹‘®”q37†`51†i„¤‰ƒ…m†[…g†j.pwd

Microsoft PowerPoint - 計算機言語 第7回.ppt

PowerPoint プレゼンテーション

Microsoft PowerPoint - kougi9.ppt

Microsoft PowerPoint - 05.pptx

プログラミング基礎

コンピュータ工学講義プリント (7 月 17 日 ) 今回の講義では フローチャートについて学ぶ フローチャートとはフローチャートは コンピュータプログラムの処理の流れを視覚的に表し 処理の全体像を把握しやすくするために書く図である 日本語では流れ図という 図 1 は ユーザーに 0 以上の整数 n

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

Microsoft PowerPoint - lec4.ppt

Microsoft PowerPoint - ca ppt [互換モード]

メソッドのまとめ

第8回 関数

プログラミングA

Microsoft PowerPoint - 10.pptx

融合規則 ( もっとも簡単な形, 選言的三段論法 ) ll mm ll mm これについては (ll mm) mmが推論の前提部になり mmであるから mmは常に偽となることがわかり ll mmはllと等しくなることがわかる 機械的には 分配則より (ll mm) mm (ll mm) 0 ll m

PowerPoint Presentation

例 e 指数関数的に減衰する信号を h( a < + a a すると, それらのラプラス変換は, H ( ) { e } e インパルス応答が h( a < ( ただし a >, U( ) { } となるシステムにステップ信号 ( y( のラプラス変換 Y () は, Y ( ) H ( ) X (

Microsoft PowerPoint - prog03.ppt

プログラミングA

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

Microsoft PowerPoint - Prog05.ppt

情報量と符号化

cp-7. 配列

解析力学B - 第11回: 正準変換

講習No.9

org/ghc/ Windows Linux RPM 3.2 GHCi GHC gcc javac ghc GHCi(ghci) GHCi Prelude> GHCi :load file :l file :also file :a file :reload :r :type expr :t exp

PowerPoint Presentation

Microsoft PowerPoint - ad11-09.pptx

Microsoft PowerPoint - mp11-02.pptx

Microsoft PowerPoint - sakurada3.pptx

Microsoft PowerPoint L07-Imperative Programming Languages-4-students ( )

Taro-再帰関数Ⅲ(公開版).jtd

Microsoft PowerPoint - C_Programming(3).pptx

文法と言語 ー文脈自由文法とLR構文解析2ー

Microsoft Word ã‡»ã…«ã‡ªã…¼ã…‹ã…žã…‹ã…³ã†¨åłºæœ›å•¤(佒芤喋çfl�)

Microsoft Word - 03

C#の基本

JavaプログラミングⅠ

1/2

今回のプログラミングの課題 ( 前回の課題で取り上げた )data.txt の要素をソートして sorted.txt というファイルに書出す ソート (sort) とは : 数の場合 小さいものから大きなもの ( 昇順 ) もしくは 大きなものから小さなもの ( 降順 ) になるよう 並び替えること

2-1 / 語問題 項書換え系 4.0. 準備 (3.1. 項 代入 等価性 ) 定義 3.1.1: - シグネチャ (signature): 関数記号の集合 (Σ と書く ) - それぞれの関数記号は アリティ (arity) と呼ばれる自然数が定められている - Σ (n) : アリ

オートマトン 形式言語及び演習 3. 正規表現 酒井正彦 正規表現とは 正規表現 ( 正則表現, Regular Expression) オートマトン : 言語を定義する機械正規表現 : 言語

荳也阜轣ス螳ウ蝣ア蜻・indd

1_sugata

MacOSX印刷ガイド

Œ{Ł¶/1flà

9 chapter

* ライブラリ関数 islower(),toupper() を使ったプログラム 1 /* 2 Program : trupper.c 3 Student-ID : K 4 Author : TOUME, Kouta 5 Comments : Used Library function i

論理と計算(2)

Microsoft PowerPoint - mp13-07.pptx

千葉大学 ゲーム論II

情報科学 (12) いろいろなプログラミング言語 1

スライド 1

プログラミング入門1

Information Theory

PowerPoint プレゼンテーション

Microsoft PowerPoint - handout07.ppt [互換モード]

Microsoft PowerPoint - Pro110111

マークアップ言語

Taro-再帰関数Ⅰ(公開版).jtd

PowerPoint プレゼンテーション

Microsoft PowerPoint - kougi10.ppt

<4D F736F F D20332E322E332E819C97AC91CC89F090CD82A982E78CA982E9466F E393082CC8D5C91A291CC90AB945C955D89BF5F8D8296D85F F8D F5F E646F63>

Microsoft PowerPoint - lec10.ppt

パソコンシミュレータの現状

経営統計学

第10回 モジュール

arduino プログラミング課題集 ( Ver /06/01 ) arduino と各種ボードを組み合わせ 制御するためのプログラミングを学 ぼう! 1 入出力ポートの設定と利用方法 (1) 制御( コントロール ) する とは 外部装置( ペリフェラル ) が必要とする信号をマイ

概要 プログラミング論 変数のスコープ, 記憶クラス. メモリ動的確保. 変数のスコープ 重要. おそらく簡単. 記憶クラス 自動変数 (auto) と静的変数 (static). スコープほどではないが重要.

PowerPoint プレゼンテーション - 物理学情報処理演習

2015年度 信州大・医系数学

C#の基本2 ~プログラムの制御構造~

Transcription:

PROGRAMMING IN HASKELL プログラミング Haskell Chapter 12 Lazy Evaluation 遅延評価 愛知県立大学情報科学部計算機言語論 ( 山本晋一郎 大久保弘崇 2011 年 ) 講義資料オリジナルは http://www.cs.nott.ac.uk/~gmh/book.html を参照のこと 0

用語 評価 (evaluation, evaluate) と簡約 (reduction, reduce) 同じと考えて良い 評価 : 式の値を求めること 簡約 : 数学では 式をより簡単な式に置き換えること a * x + a * y a (x + y) Haskell では 関数を適用し本体で置き換えること 展開 (unfold) も関数の本体で置き換える意味で用いられる 簡約可能式 ( リデックス redex) 評価戦略 リデックスの集合から実際に簡約する式を選択する指針 最内簡約 最外簡約 遅延評価 遅延簡約とは ( なぜか ) 言わない 1

導入 ここまで Haskell の式がどのように評価されるのかの詳細に触れなかった 実際のところ 式は以下の 3 つの性質を満たす単純な方法で評価される : 1. 不要な評価をしない 2. 評価順序を気にしないでプログラムを書ける 3. 無限リストを扱える この評価方法は遅延評価 (lazy evaluation) と呼ばれ Haskell は遅延関数型プログラミング言語である 2

式の評価 基本的に 式は簡約できなくなるまで 関数定義を順に適用することにより評価される 例えば 定義 square n = n * n を考えると 式 square (3 + 4) は以下のように評価される : square (3 + 4) {+ を適用 } = square 7 {square を適用 } = 7 * 7 {* を適用 } = 49 3

しかし これは唯一の評価方法ではなく 他の方法も考えられる : square (3 + 4) {square を適用 } = (3 + 4) * (3 + 4) { 最初の + を適用 } = 7 * (3 + 4) {+ を適用 } = 7 * 7 {* を適用 } = 49 + より先に square を適用しても 結果は等しい FACT: Haskell において 同じ式に対する 2 つの異なる評価方法が停止するならば その結果は等しい 望ましい性質だが 手続き型言語では成り立たない 4

評価戦略 (Reduction Strategies) 式を評価するとき 複数の部分式に関数を適用できることがある このような式をリデックス ( 簡約可能式 ) と呼ぶ 評価するリデックスを選択するための よく知られた 2 つの戦略 : 1. 最内簡約最も内側の ( 複数の場合 最左の ) リデックスを簡約する 2. 最外簡約最も外側の ( 最左 ) リデックスを簡約する 2 つの戦略はどう違うのか? 正確には最左最内簡約 教科書では 簡約可能式 を使っているが スライドでは リデックス を使う 5

停止性 (Termination) 以下の定義を考えてみる loop = tail loop 式 fst (1, loop) を 2 つの評価戦略で評価してみる : 1. 最内簡約 fst (1, loop) = fst (1, tail loop) = fst (1, tail (tail loop)) = 評価は停止しない 6

2. 最外簡約 fst (1, loop) = 1 1 ステップで結果が出る FACTS 最内簡約が停止しないときでも 最外簡約は停止することがある ある式に対して停止する評価系列があるならば 最外簡約も停止して同じ結果となる 最外簡約は強力 7

簡約の回数 再度 以下の評価系列を考えてみる : 最内簡約 (3ステップ): 最外簡約 (4ステップ): square (3 + 4) square (3 + 4) = square 7 = (3 + 4) * (3 + 4) = 7 * 7 = 7 * (3 + 4) = 49 = 7 * 7 = 49 最外簡約は効率が悪い : square の評価で複製された部分式 3 + 4 が 2 回評価される FACT: 最外簡約のステップ数は 最内簡約よりも多くなることがある ここで効率は時間効率 ( ステップ数 ) であり とりあえず空間効率は考えない 8

この問題は 評価中に式をポインターで指して共有することで解決される : 改良された新しい評価戦略 : 遅延評価 = 最外簡約 + 式の共有 (Sharing) FACTS 遅延評価のステップ数は最 [ 内外 ] 簡約よりも多くならない Haskell は遅延評価を採用している 最外簡約の強力な停止性と式の共有による効率を兼ね備えている 9

無限リスト 最外簡約から受け継いだ停止性に関する有利さに加えて 遅延評価のおかげで無限リストを使ったプログラムが可能となる! 以下の再帰的な定義を考えてみる ones :: [Int] ones = 1 : ones 再帰の展開を数回行ってみる : ones = 1 : ones = 1 : 1 : ones = 1 : 1 : 1 : ones = ones は 1 の無限リストである 10

最内簡約と遅延評価で head ones を評価してみる : 1. 最内簡約 head ones = head (1 : ones) = head (1 : 1 : ones) = head (1 : 1 : 1 : ones) = 評価は停止しない 2. 遅延評価 head ones = head (1 : ones) = 1 結果は 1 となる 11

遅延評価により 無限リスト ones における最初の値だけが実際に求められているのは これが式 head ones を評価するのに必要な全てであるから 一般化したスローガン : 遅延評価により 式の結果を求めるのに必要な部分だけを評価しよう ここで ones = 1 : ones は無限リストではなく それが使用された文脈が要求する部分だけが評価される潜在的な無限リストだと分かる 12

モジュラープログラミング 無限リストから いくつかの要素を抜き出せば 有限なリストを生成できる 例えば :? take 5 ones [1,1,1,1,1]? take 5 [1..] [1,2,3,4,5] モジュラー : 組み合わせが容易になるように規格化されているという意味 制御 : データを参照する側データ : データを生成する側 制御とデータを分離することにより 遅延評価はプログラムをよりモジュラーにする : take 5 [1..] 制御 データ 遅延評価により 制御から要求される分だけデータが評価される 13

例 : 素数の生成 素数の無限リストを生成する簡単な手続き : 1. 無限リスト 2,3,4, を生成する 2. リストの先頭の値 p を素数として印を付ける 3. p の倍数をリストから除く 4. ステップ 2 に戻る 最初の数ステップを以下に示す : 2 3 4 5 6 7 8 9 10 11 12 3 5 7 9 11 5 7 11 7 11 11 14

この手続きは 考案者であるギリシャの数学者に因んで エラトステネスのふるい と呼ばれる 手続きはそのまま Haskell に変換できる : primes :: [Int] primes = sieve [2..] sieve :: [Int] -> [Int] sieve (p:xs) = p:sieve [x x xs, x `mod` p 0] 以下のように実行できる :? primes [2,3,5,7,11,13,17,19,23,29,31, 37,41,43,47,53,59,61,67, 15

どこまで計算するかという制約から素数の生成を解き放つことにより モジュラーな定義が可能となり 状況に応じた異なる制約を与えることもできる 最初の 10 個の素数を選択 :? take 10 primes [2,3,5,7,11,13,17,19,23,29] 15 未満の素数を選択 :? takewhile (< 15) primes [2,3,5,7,11,13] 遅延評価は強力なプログラミングツール! 16

まとめ (12 章 ) 簡約可能式 ( リデックス ) 評価戦略 リデックスの集合から実際に簡約する式を選択する指針 最内簡約 : 値渡し (C や Java が採用 ) 最外簡約 : 名前渡し ( 字面渡し ) 停止する評価系列があるならば 停止して同じ結果となる 最内簡約よりも効率が悪いことがある 遅延評価 : 最外簡約 + 式の共有 (Haskell が採用 ) 停止性の有利さはそのままに 式の共有により効率化 遅延評価の効率は最 [ 内外 ] 簡約と同等以上 無限リストとモジュラー性 遅延評価により 潜在的な無限リストが可能になる 制御 ( 消費側制約 ) とデータ ( 生成 ) を分離して見通しを向上 17

練習問題 12 章 1. フィボナッチ数列の無限リスト [0,1,1,2,3,5,8,13,21,34, を生成する関数 fibs :: [Integer] を 以下の簡単な手続きに従って定義せよ : a. 数列の最初の 2 つは 0 と 1 である b. 次の数は直前の 2 つの数の和である c. ステップ b に戻る 2. フィボナッチ数列の n 番目を求める関数 fib :: Int Integer を定義せよ 18

19

= = = square (3 + 4) ( * ) (3 + 4) ( * ) 7 49