Microsoft PowerPoint - ProD0107.ppt

Similar documents
Programming D 1/15

Functional Programming

第8回 関数

プログラミングD - Java

PowerPoint Presentation

Copyright c 2006 Zhenjiang Hu, All Right Reserved.

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

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

プログラミングD - Java

2018 年度前期プロジェクト活動 Ritsumeikan Compiler Construction 班活動報告書 佐々木章徳青木雅典西見元希松本幸大

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

Microsoft PowerPoint - enshu4.ppt [äº™æ‘łã…¢ã…¼ã…›]

PowerPoint プレゼンテーション

Functional Programming

4 ソフトウェア工学 Software Engineering 抽象データ型 ABSTRACT DATA TYPE データ抽象 (data abstraction) 目的 : データ構造を ( 実装に依存せずに ) 抽象的に定義 方法 : データにアクセス (read, write) する関数の仕様

program7app.ppt

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

VDM-SL VDM VDM-SL Toolbox VDM++ Toolbox 1 VDM-SL VDM++ Web bool

Microsoft PowerPoint - lectureNote13.ppt

memo

Taro-リストⅠ(公開版).jtd

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

# let st1 = {name = "Taro Yamada"; id = };; val st1 : student = {name="taro Yamada"; id=123456} { 1 = 1 ;...; n = n } # let string_of_student {n

第12回 モナドパーサ

2

sinfI2005_VBA.doc

Microsoft PowerPoint - 05.pptx

「計算と論理」 Software Foundations その3

計算機プログラミング

メソッドのまとめ

微分方程式 モデリングとシミュレーション

Microsoft PowerPoint - ruby_instruction.ppt

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

第 1 章 条件分岐 この章では 条件に応じて処理を分岐する方法について説明します 1. CASE 式で複雑な条件分岐を実現 2. 関数を使用した条件分岐 3. MERGE 文による条件に応じた DML の実行

haskell.gby

論理と計算(2)

memo

プログラミングA

コンパイラ演習第 11 回 2006/1/19 大山恵弘 佐藤秀明 今回の内容 バリアント / レコード 表現方法 型付け パターンマッチ 型付け switch 文への変換 簡単な最適化 マッチング漏れ 以降のフェーズでの処理 発展 exhaustivenessinformation の利用 パター

プログラミング基礎

Microsoft PowerPoint - 10control.ppt

Taro-リストⅢ(公開版).jtd

PowerPoint プレゼンテーション

¥×¥í¥°¥é¥ß¥ó¥°±é½¬I Exercise on Programming I [1zh] ` `%%%`#`&12_`__~~~ alse

「計算と論理」 Software Foundations その4

オートマトンと言語

Taro-cshプログラミングの応用.jt

PowerPoint Template

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

プログラミングA

break 文 switch ブロック内の実行中の処理を強制的に終了し ブロックから抜けます switch(i) 強制終了 ソースコード例ソースファイル名 :Sample7_1.java // 入力値の判定 import java.io.*; class Sample7_1 public stati

Functional Programming

.NETプログラマー早期育成ドリル ~VB編 付録 文法早見表~

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

JavaプログラミングⅠ

Microsoft Word - Cプログラミング演習(12)

プログラミング基礎

PowerPoint プレゼンテーション

Microsoft PowerPoint - 6.pptx

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdiu.h> #define InFile "data.txt" #define OutFile "surted.txt" #def

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

kantan_C_1_iro3.indd

Parametric Polymorphism

kiso2-09.key

ソフトウェア基礎 Ⅰ Report#2 提出日 : 2009 年 8 月 11 日 所属 : 工学部情報工学科 学籍番号 : K 氏名 : 當銘孔太

Javaによるアルゴリズムとデータ構造

Scilab 勉強会 ( 第 3 回 ) 高橋一馬, 十文字俊裕, 柏倉守 平成 17 年 11 月 15 日 関数 ファイルはエディタを用いて作成する.Scilab にはエディタ SciPad が附属している.SciPad では なく他のエディタを利用してもよい. 作成した関数は Scilab に

はじめに コースの概要と目的条件分岐の方法や複雑な集計の手法など SQL のコーディングの幅を広げるためのテクニックについて説明します また パフォーマンスを考慮した記述方法や正しい結果を取得するための記述方法などについても あわせて説明します 本コースでは 実践的な SQL の記述手法を広く浅く紹

プログラミングI第10回

An Automated Proof of Equivalence on Quantum Cryptographic Protocols


Java プログラミング Ⅰ 7 回目 switch 文と論理演算子 条件判断文 3 switch 文 switch 文式が case の値と一致した場合 そこから直後の break; までを処理し どれにも一致しない場合 default; から直後の break; までを処理する 但し 式や値 1

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdio.h> #define InFile "data.txt" #define OutFile "sorted.txt" #def

Microsoft PowerPoint - kougi9.ppt

テキスト処理第 2 回 田中哲産業技術総合研究所情報技術研究部門 akira/textprocess/

monad.gby

77

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

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

ML 演習 第 4 回

論理と計算(2)

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

Slide 1

slide9.dvi

基礎計算機演習 実習課題No6

fp.gby

Microsoft Word - 03

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

プログラミング入門1

Microsoft PowerPoint - C_Programming(3).pptx

PowerPoint Presentation

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

_unix_text_command.pptx

Java プログラミング Ⅰ 7 回目 switch 文と論理演算子 今日の講義講義で学ぶ内容 switch 文 論理演算子 条件演算子 条件判断文 3 switch 文 switch 文 式が case のラベルと一致する場所から直後の break; まで処理しますどれにも一致致しない場合 def

PowerPoint Presentation

Microsoft Word _VBAProg1.docx

Microsoft PowerPoint - lec4.ppt

Microsoft PowerPoint - 5Chap15.ppt

Microsoft PowerPoint - exp2-02_intro.ppt [互換モード]

Transcription:

プログラミング D M 講義資料 教科書 :6 章 中田明夫 nakata@ist.osaka-u.ac.jp 2005/1/7 プログラミング D -M- 1 2005/1/7 プログラミング D -M- 2 リスト 1 リスト : 同じ型の値の並び val h=[10,6,7,8,~8,5,9]; val h = [10,6,7,8,~8,5,9]: int list val g=[1.0,4.5, 5.6]; val g=[1.0, 4.5, 5.6]: real list val h2=5::h; val h2=[5,10, 6,7,8,~8,5,9]: int list val g2=6.87::g; val g2=[6.87, 1.0, 4.5, 5.6]: real list 2005/1/7 プログラミング D -M- 3 リスト 2 hd と tl hd hd g; val it= 1.0:real hd g2; val it=6.85:real tl g2; val it=[1.0, 4.5, 5.6]: real list 2005/1/7 プログラミング D -M- 4 tl リスト 3 hd [3]; val it=3:int tl [3]; val it=[]: int list hd []; tl []; いずれもエラー []; val it =[]: a list 2005/1/7 プログラミング D -M- 5 リスト 4 @ : リスト同士の連結 [1,2,3] @ [4,5,6]; val it=[1,2,3,4,5,6]:int list [1]@[2,3,4]; val it=[1,2,3,4]: int list 1@[2,3,4]; エラー 1::[2,3,4]; val it =[1,2,3,4]: int list 2005/1/7 プログラミング D -M- 6 1

リスト 5 [] の代わりに nilも可 [1,2,3] @ nil val it=[1,2,3]:int list 一般に [x1,x2,x3,..,xn] = x1::x2::x3:: ::xn::nil 4::3::2::1::nil val it=[4,3,2,1]: int list 2005/1/7 プログラミング D -M- 7 リスト処理関数の例 引数のリストを逆順にする関数 reverse reverse([1,2,3]); val it = [3,2,1]: int list reverse([true, true, false]); val it = [false, true, true]: bool list fun reverse = if = nil then nil else reverse (tl ) @ [(hd )]; val reverse = fn: a list -> a list # 訳 :reverse は任意の型のリストを引数にとり任意の型 但し引数と同じ型 のリストを返す関数 2005/1/7 プログラミング D -M- 8 hd reverse の考え方 基底段階 =nil の場合 そのまま nil を値にすればよい 帰納段階 nil の tail がすでにひっくり返っていると仮定すると の head を後ろにもってくれば全体がひっくり返る tail reverse reverse 2005/1/7 プログラミング D -M- 9 nil reverse の等式トレース reverse([1,2,3]) == if [1,2,3]=nil then nil else reverse (tl [1,2,3]) @ [(hd [1,2,3])] == reverse([2,3]) @ [1] == (if [2,3]=nil then nil else reverse(tl [2,3]) @ [(hd [2,3])]) @ [1] == reverse([3]) @ [2] @ [1] == (if [3]=nil then nil else reverse(tl [3]) @ [(hd [3])]) @ [2] @ [1] == reverse(nil)@[3]@[2]@[1] == (if nil=nil then nil else reverse(tl nil) @ [(hd nil)])@[3]@[2]@[1] == nil @[3]@[2]@[1] == [3,2,1] 2005/1/7 プログラミング D -M- 10 パターンマッチングによるリストの分解 リスト処理の基本 与えられたリストが空か否か? 空でなければ先頭要素と残りのリストに分解 パターンマッチングにより簡潔に記述 case of nil => E1 (h::t) => E2(h,t) E1 : が空のときに返す式 E2(h,t) : が空でないときに返す式 (の先頭要素 hおよび残りのリストtから計算 ) と nil, (h::t) をそれぞれパターンマッチング と一致するようにh,tに値が束縛される 2005/1/7 プログラミング D -M- 11 パターンマッチングによるリストの分解 fun length = case of nil => 0 (h::t) => 1+length t; リストの長さを計算する関数 以下の定義とほぼ等価 fun length = if =nil then 0 else 1+length (tl ); ただし 型推論により リストの要素はeqtype =nilより リストはeqtype リストは 要素の型がeqtypeであるときのみeqtype パターンマッチングを使うと リストの要素が eqtype でなくても適用可能 2005/1/7 プログラミング D -M- 12 2

パターンマッチングによるリストの分解 パターンマッチングを用いない場合 fun length = if =nil then 0 else 1+length (tl ); val length = fn : ''a list -> int length [1.0,2.0,3.0]; エラーメッセージ real list は eqtype ではないので パターンマッチングによるリストの分解 パターンマッチングを用いた場合 fun length = case of nil => 0 (h::t) => 1+length t; val length = fn : 'a list -> int length [1.0,2.0,3.0]; val it = 3 : int 2005/1/7 プログラミング D -M- 13 2005/1/7 プログラミング D -M- 14 case 文 case exp of pat1 => exp1 pat2 => exp2 patn => expn 式 exp とパターン pat1,,patn を順番にパターンマッチングし pati がマッチしたら expi を評価して返す expi 以外は評価されない ( 特殊構文 ) リストのパターン nil 定数 変数 pat1::pat2 [pat1,,patn] _ 匿名パターン ( 任意の式にマッチ ) 2005/1/7 プログラミング D -M- 15 2005/1/7 プログラミング D -M- 16 組とリストのパターン fun zip x = case x of (h1::t1,h2::t2) => (h1,h2) :: zip (t1,t2) _ => nil; リストの組 x を組のリストに変換して返す zip ([1,2,3],[4,5,6]); val it = [(1,4),(2,5),(3,6)] 組とリストのパターン fun unzip x = case x of (h1,h2)::t => let val (1,2) = unzip t in (h1::1,h2::2) end _ => (nil,nil); zipの逆変換を行う unzip [(1,4),(2,5),(3,6)]; val it = ([1,2,3],[4,5,6]) 2005/1/7 プログラミング D -M- 17 2005/1/7 プログラミング D -M- 18 3

パターンを用いた関数定義 fun 宣言では case 文を省略した以下の記法が使用可 fun f pat1 = exp1 f pat2 = exp2 f patn = expn パターンを用いた関数定義 関数式でも case 文を省略した以下の記法が使用可 fn pat1 = exp1 pat2 = exp2 patn = expn case 文を用いた以下の記述と等価 fun f x = case x of pat1 => exp1 pat2 => exp2 patn => expn 2005/1/7 プログラミング D -M- 19 case 文を用いた以下の記述と等価 fn x = case x of pat1 => exp1 pat2 => exp2 patn => expn 2005/1/7 プログラミング D -M- 20 パターンを用いた関数定義 例 ) fun length nil = 0 length (h::t) = 1 + length t; 練習問題 リストを逆順にして返す関数 reverse を パターンを用いて定義せよ cf.) fun length x = case x of nil => 0 (h::t) => 1 + length t; 2005/1/7 プログラミング D -M- 21 2005/1/7 プログラミング D -M- 22 リスト処理の基本関数 hd : a list -> a リストの先頭要素を返す tl : a list -> a list リストの先頭を除いた残りのリストを返す infixr 5 @ @ : a list * a list -> a list 2 つのリストを結合したリストを返す 2 項演算子 ( 右結合 結合力 5) リスト処理の基本関数 null : a list -> bool リストが空なら真 さもなければ偽を返す rev : a list -> a list リストを逆順にしたものを返す length : a list -> int リストの長さを返す 2005/1/7 プログラミング D -M- 24 2005/1/7 プログラミング D -M- 25 4

リスト処理の基本関数 map : ( a -> b)-> a list -> b list 与えられた関数をリストの各要素に適用し その結果のリストを返す 集合 A の関数 f による像 f(a) を求める 例 ) リストの各要素を 2 倍 map (fn x => x*2) [1,2,3,4]; val it = [2,4,6,8] 2005/1/7 プログラミング D -M- 26 例 : クイックソート qsort [5,4,9,3,6,2,7,5,8] split [4,3,2] [5,5] [9,6,7,8] qsort qsort [2,3, 4] [6,7,8,9] @ @ [2,3,4,5,5,6,7,8,9] 2005/1/7 プログラミング D -M- 27 split の実現 fun split(b, nil) = (nil,nil, nil) split(b, x::xs) = let val (S,M,) =split(b, xs); in if b > x then (x::s, M, ) else if b<x then (S, M, x::) else (S, x::m, ) end; val split = fn: int* int list -> int list * int list * int list split(3, [2,1,4,3,5]); val it = ([2,1],[3],[4,5]) : int list * int list * int list クイックソートの実現 fun qsort(nil) = nil qsort(x::xs) = let val (S,M,) = split(x, x::xs); val S = qsort(s); val = qsort(); in S@M@ end; 2005/1/7 プログラミング D -M- 28 2005/1/7 プログラミング D -M- 29 as を使ったパターン fun qsort(nil) = nil qsort(list as x::xs) = let val (S,M,) = split(x, list); val S = qsort(s); val = qsort(); in S@M@ end; 2 3 5 nil 2005/1/7 プログラミング D -M- 30 2005/1/7 プログラミング D -M- 31 5

nil sum(nil)=0 5 nil sum([5])=5+sum(nil) =5+0=5 2005/1/7 プログラミング D -M- 32 2005/1/7 プログラミング D -M- 33 3 5 nil sum([3,5]) =3+sum([5]) =3+5=8 2005/1/7 プログラミング D -M- 34 2 3 5 nil sum([2,3,5])=2+sum([3,5])=2+8=10 2005/1/7 プログラミング D -M- 35 一般的な構造 リストがnilならば特定の値 Zを返す リストがh::tの形ならば 部分リストtに対する値 Rを再帰的に計算 hとrに対して特定の演算 f(h,r) を適用し 得られた結果を返す sum() の場合 : Z=0 f(h,r)=h+r 練習問題 以下の各関数に対して 対応するZとf(h,R) を与えよ length() null() reverse() map g @ ' [ ヒント :のみに着目する] 2005/1/7 プログラミング D -M- 36 2005/1/7 プログラミング D -M- 37 6

汎用のリスト処理関数 リスト処理の構造を実現する汎用リスト関数 foldr ( 高階関数 ) fun foldr f Z nil = Z foldr f Z (h::t) = f(h,foldr f Z t); sum() の foldr を使った定義 fun sum = foldr (fn (h,r) => h + R) 0 ; 又は fun sum = foldr (op +) 0 ; 2005/1/7 プログラミング D -M- 40 練習問題 以下の各関数を高階関数 foldrを用いて定義せよ length() null() reverse() map g 2005/1/7 プログラミング D -M- 41 7