ML 演習 第 1 回 佐藤 春旗, 山下 諒蔵, 前田 俊行 May 30, 2006.

Slides:



Advertisements
Similar presentations
プログラミング演習B ML編 第1回 2006/6/20 (通信コース) 2006/6/28 (情報コース) 住井 ~sumii/class/proenb2006/ml1/
Advertisements

2.5 プログラムの構成要素 (1)文字セット ① ASCII ( American Standard Code for Interchange ) JIS コードと同じ ② EBCDIC ( Extended Binary Coded Decimal for Information Code ) 1.
アルゴリズムとデータ構造 第2回 線形リスト(復習).
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第3回 配列(1) 情報・知能工学系 山本一公
2006/10/26 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第5回 関数(1) 情報・知能工学系 山本一公
(Rubyistのための) 超音速:ML入門
プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
2006/11/9 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第4回 配列(2) 情報・知能工学系 山本一公
ML 演習 第 8 回 2007/07/17 飯塚 大輔, 後藤 哲志, 前田 俊行
ソフトウェア基礎科学 授業資料: 論理関係(logical relations)のお話
2006/11/30 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
6/19 前回復習 for文による繰り返し計算 演習1:1から10まで足して画面に結果を表示する 提出者: 1人
プログラミング演習Ⅱ 第12回 文字列とポインタ(1)
オブジェクト指向言語論 知能情報学部 新田直也.
プログラミング基礎I(再) 山元進.
2006/10/12 山下 諒蔵 佐藤 春旗 前田俊行 大山 恵弘 佐藤 秀明 住井 英二郎
プログラミング言語論 第6回 型 情報工学科 篠埜 功.
プログラミング演習II 2004年10月19日(第1回) 理学部数学科・木村巌.
プログラミング言語論 理工学部 情報システム工学科 新田直也.
2007/1/18 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
第8回 プログラミングⅡ 第8回
2006/10/19 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井英二郎
2006/11/02 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
条件式 (Conditional Expressions)
2006/11/16 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎

~sumii/class/proenb2010/ml4/
オブジェクト指向 プログラミング 第一回 知能情報学部 新田直也.
2007/1/11 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
ML 演習 第 7 回 新井淳也、中村宇佑、前田俊行 2011/05/31.
ML 演習 第 3 回 新井淳也、中村宇佑、前田俊行 2011/04/26.
プログラミング言語論 第12回 関数型プログラミング 情報工学科 篠埜 功.
ML 演習 第 4 回 末永 幸平, 遠藤 侑介, 大山 恵弘 2005/06/21.
2007/6/5(通信コース)2007/6/6(情報コース) 住井
プログラミング言語論 第2回 情報工学科 篠埜 功.
~sumii/class/proenb2010/ml1/
プログラミング言語入門 手続き型言語としてのJava
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
暗黙的に型付けされる構造体の Java言語への導入
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第2回 ファイル処理 情報・知能工学系 山本一公
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
~sumii/class/proenb2009/ml1/
地域情報学 C言語プログラミング 第1回 導入、変数、型変換、printf関数 2016年11月11日
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
2007/6/12(通信コース)2007/6/13(情報コース) 住井
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
PROGRAMMING IN HASKELL
~sumii/class/proenb2010/ml2/
~sumii/class/proenb2009/ml4/
2006/7/18(通信コース)2006/7/26(情報コース) 住井
2006/6/27(通信コース)2006/7/5(情報コース) 住井
2008/7/16(情報コース)2008/7/22(通信コース) 住井
~sumii/class/proenb2009/ml6/
PROGRAMMING IN HASKELL
第6回放送授業.
~sumii/class/proenb2010/ml5/
オブジェクト指向言語論 第二回 知能情報学部 新田直也.
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
PROGRAMMING IN HASKELL
オブジェクト指向言語論 第一回 知能情報学部 新田直也.
プログラミング演習II 2003年12月10日(第7回) 木村巌.
プログラミング入門2 第3回 条件分岐(2) 繰り返し文 篠埜 功.
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
プログラミング言語Ⅰ(実習を含む。), 計算機言語Ⅰ・計算機言語演習Ⅰ, 情報処理言語Ⅰ(実習を含む。)
2007/6/26(通信コース)2007/6/27(情報コース) 住井
Presentation transcript:

ML 演習 第 1 回 佐藤 春旗, 山下 諒蔵, 前田 俊行 May 30, 2006

今日から ML 演習 担当者 佐藤 春旗, 山下 諒蔵, 前田 俊行 (米澤研) {haruki, yamashita, tosh} @yl.is.s.u-tokyo.ac.jp 質問用アドレス: ml-query@yl.is.s.u-tokyo.ac.jp 提出用アドレス: ml-report@yl.is.s.u-tokyo.ac.jp 講義はおおむね佐藤、山下が担当

演習の内容 第1回~第4回 ML 言語を学ぼう 本演習では ML の一派である Objective Caml を使用 第5回~第7回 第8回~第9回 最終課題: リバーシ思考ルーチンの実装 (予定)

演習資料について ML演習ホームページ http://www.yl.is.s.u-tokyo.ac.jp/~yamashita/lecture/caml-enshu/ 講義資料 演習で使用するソースファイル 参考資料へのリンク

参考資料 OCaml の本家サイト http://caml.inria.fr/ マニュアル・紹介など 第1章のチュートリアルは簡潔でよい 処理系のダウンロード (Windows 版など) Developing Applications With Objective Caml Online pre-release http://caml.inria.fr/oreilly-book/ その他フランス語書籍はやまほど…

今日の内容 Objective Caml とは? インタプリタの使い方 基本的な値と文法 評価について

今日の内容 Objective Caml とは? インタプリタの使い方 基本的な値と文法 評価について

Objective Caml とは? 関数型言語 ML の1流派 強力な型システム 柔軟なデータ型定義とパターンマッチ 強力なモジュールシステム オブジェクト指向プログラミングのサポート

Standard ML Haskell Scheme OCaml Common Lisp Java Smalltalk C++ Pascal 関数型 Standard ML Haskell Scheme OCaml オブジェクト指向 Common Lisp Java Smalltalk 手続き型 C++ Pascal 論理型 Prolog C LiLFeS (Figure courtesy of E. Sumii)

MLの型システムの特徴 強い静的な型付け (Strong Static Typing) “強い” = 型整合を強制する 弱い型付け (e.g. C, C++) “静的な” = コンパイル時に型をチェックする 動的な型付け (e.g. Scheme, Perl) 型推論 プログラマは変数の型を書かなくてよい 型の明示的な指定 (e.g. C, C++) 型多相 (Parametric Polymorphism) 第2回で解説

今日の内容 Objective Caml とは? インタプリタの使い方 基本的な値と文法 評価について

インタプリタを使うには 地下環境にはインストール済み 自分のマシンを使う場合は各自でインストール Unix パッケージを利用する ソースからコンパイルする Windows 配布されているバイナリを利用する cygwin ならインストーラを使えば入れられる 自前でソースからコンパイル (VC, mingw32)

インタプリタの使い方 [haruki@tuba] ~> ocaml Objective Caml version 3.08.2 # 1 + 2;; - : int = 3 1+2 という式を評価すると 結果の型は int (整数型) で 値は 3 になる

ファイルに書いたプログラムの利用 # #use “test.ml”;; - : int = 3 - : float = 3. # ^D 1 + 2;; 1.0 +. 2.0;; Ctrl + D(EOF) で インタプリタを抜ける

float 型の式が int 型の使われるべき場所に現れている 型エラーの例 # 1 + 2.0;; This expression has type float but is here used with type int float 型の式が int 型の使われるべき場所に現れている

今日の内容 Objective Caml とは? インタプリタの使い方 基本的な値と文法 評価について コメントの書き方 変数定義 組み込み型 int, float, bool, string, tuple 関数型 その他の構文 (条件分岐, 再帰関数の定義, 相互再帰) 評価について

コメントの書き方 (* と *) の間はコメントとして無視される なんと, 入れ子にもできる (Cのコメントではダメ) # (* comment *) 2 + 3;; - : int = 5 なんと, 入れ子にもできる (Cのコメントではダメ) # 1 (* + 2 + (* 3 + *) 4 *) + 2;; - : int = 3

変数を定義して使う方法 let 式: トップレベルの定義 # let a = 3;; (* 変数の定義 *) val a : int = 3 # let f x = x + 1;; (* 関数の定義 *) val f : int -> int = <fun> # a + a;; - : int = 6 # f a;; (* 関数適用 *) - : int = 4

変数を定義して使う方法 let ... in 式: ローカルな宣言 # let x = 2;; x : int = 2 # let x = 3 in x + x ;; - : int = 6 # x;; - : int = 2 # let f x = x + x in f 2;; - : int = 4 x = 3 はこの範囲のみで有効

組み込み型 (1) 整数 (int) # (3 + 5) * 8 / -4;; - : int = -16 # 5 / 4;; # 5 mod 4;; # 3 < 2;; - : bool = false

組み込み型 (2) 実数 (float) # (3.0 +. 5.0) *. 8.0 /. -3.0;; # 1.41421356 ** 2.0;; - : float = 1.99999999328787381 # 3.0 < 2.0;; - : bool = false

組み込み型 (3) 真偽値 (bool) # 2 < 3 && 2.0 >= 3.0;; - : bool = false # 2 < 3 || 2.0 = 3.0;; - : bool = true # not (3 < 2);;

組み込み型 (4) 文字列 (string) # “Str” ^ “ing”;; - : string = “String” # print_string “Hello\nWorld\n”;; Hello World - : unit = ()

組み込み型 (5) 組 (tuple) # (3 + 5, 5.0 -. 1.0);; - : int * float = (8, 4.) # fst (3, 2);; - : int = 3 # snd (3, 2);; - : int = 2 # (3, true, “A”);; - : int * bool * string = (3,true,“A”)

関数型 (1) 関数 (function) # let f x = x + 2;; val f : int -> int = <fun> # f 2;; - : int = 4 # fun x -> x + 2;; (* 匿名関数 *) - : int -> int = <fun> # (fun x -> x + 2) 2;;

関数型 (2) 多引数関数 # let f x y = x * (x + y);; val f : int -> int -> int = <fun> # f 2 4;; - : int = 12 # let g = (* 匿名の多引数関数 *) fun x y -> x * (x + y);; val g : int -> int -> int = <fun> # g 2 4;;

関数型 (3) [参考] 多引数関数の型 カリー化 (Curried) 表現 # let f x y = x + y;; val f : int -> int -> int = <fun> # f 2;; - : int -> int = <fun> # (f 2) 4;; - : int = 6

基本的な構文 (1) 局所定義 (let ... in ...) 条件分岐: if # let f x = if x < 2 then “smaller than 2” else “not smaller than 2”;; val f : int -> string = <fun> # f 1;; - : string = “smaller than 2”

基本的な構文 (2) 再帰関数の定義: let rec # let rec fib x = if x < 2 then 1 else fib(x-1) + fib(x-2);; val fib : int -> int = <fun> # fib 10;; - : int = 89

基本的な構文 (3) 再帰関数 (続) # let rec pow x n = if n = 0 then 1 else x * pow x (n-1);; val pow : int -> int -> int = <fun> # pow 3 10;; - : int = 59049

基本的な構文 (4) 相互再帰関数の同時定義 # let rec even x = if x=0 then true else odd(x-1) and odd x = if x=0 then false else even(x-1);; val even : int -> bool = <fun> val odd : int -> bool = <fun> # odd 5423;; - : bool = true

基本的な構文 (5) let と let rec の違い… # let f x = x + 3;; # let f x = f (x-1);; # f 2;; - : int = 4 # let rec f x = f (x-1);; # f 2;; (* 止まらない *)

今日の内容 Objective Caml とは? インタプリタの使い方 基本的な値と文法 評価について

評価について 課題レポート 毎回 5 問程度 出題後 2 週間以内にレポートを提出 締め切り厳守 出来上がっていない場合は, 締め切り日に進捗を 報告すること どこまで分かったか, どこが分からなかったのか… 進捗報告後, こちらから改めて期日を指定 質問大歓迎: ml-query@yl.is.s.u-tokyo.ac.jp

課題の種類 必須 必ず解かなくてはならない課題 レジュメを見返せば必ずできるはず optional 解いても解かなくても良いが, 解いたら加点 ちょっと頭を使えばできるはず special 他の演習の課題も終わって暇になったときにやる マニア向け (とは言わないがちょっと大変?)

レポート提出上の注意 (1) 提出方法: 電子メール 宛先: ml-report@yl.is.s.u-tokyo.ac.jp 受領通知が届くと思うので確認のこと Subject を “Report <レポート番号> <学生証番号>” とすること 今回の場合 “Report 1 610xx” 地下以外から提出する場合, 地下計算機の アカウントを書くこと

レポート提出上の注意 (2) レポート本文に含めるべきもの 氏名, 学生証番号 ソース 添付ファイルにせず, メール本文にコピペすること コメントを適宜補い, 各関数の動作を説明すること 動作例 プログラムが正しく動作することを示すのに ふさわしい例を考えること 考察 考察不要と指定されている場合を除き, 必ず入れる

第1回 課題 締め切り: 6/13 13:00 (日本標準時)

課題1 (必須) 整数 n を受け取って n の階乗を計算して返す関数 fact: int → int を定義せよ 考察不要

課題2 (必須) 非負整数2つの最大公約数を 求める関数 gcd : int → int → int を 定義せよ。 考察不要

課題3 (必須) pow を改良してより高速にせよ。 計算量を引数 n の log オーダにする ヒント: n mod 2 で分岐。 a0 = 1 a2n = (a × a)n [n > 0] a2n+1 = a × (a2n) 自分の書いたプログラムがきちんと log オーダになっていることを考察で示すこと 「時間をはかって示しました」はナシ

課題4 (必須) fib を改良してより高速にせよ。 計算量を引数 n の1次のオーダにする。 ヒント: 3引数の補助関数を作って… 自分の書いたプログラムが1次のオーダになっていることを考察で示すこと 「時間をはかって示しました」はナシ

課題5 (必須) 整数 n を受け取って n が素数であれば true を素数でなければ false を返す関数 isprime: int → bool を書け

課題6 (optional) 関数 f と整数 n を受け取って, f を n 個合成した関数を返す関数 compose を書け # let add2 =(* fun x -> x + 1 を2つ合成 *) compose (fun x -> x + 1) 2;; val add2 : int -> int = <fun> # add2 3;; - : int = 5

課題7 (special) 関数の生成と適用のみを用いて自然数を表現する課題 詳細は別紙参照のこと

レポート提出上の注意 (再掲) 提出方法: 電子メール 宛先: ml-report@yl.is.s.u-tokyo.ac.jp 受領通知が届くと思うので確認のこと Subject を “Report <レポート番号> <学生証番号>” とすること 今回の場合 “Report 1 610xx” 地下以外から提出する場合, 地下計算機の アカウントを書くこと