2 OCaml toplevel basics
今回からしばらく
『HOL Light Tutorial (for version 2.20)』
http://www.cl.cam.ac.uk/~jrh13/hol-light/tutorial_220.pdf
に従って話を進めます.なお,リファレンスはこちら
『The HOL Light System REFERENCE』
(For HOL Light 2.20++ November 2, 2011)
http://www.cl.cam.ac.uk/~jrh13/hol-light/reference.pdf
です.
まずは,HOL Lightが乗っているOCamlのtoplevel loopについてです.
toplevel loopとは,ユーザーの入力をOCamlに送り,その結果をユーザーに返す作業を繰り返す,Mathematicaで言えばフロントエンドに相当するものです.
toplevel loopで行えることは,大まかに言って次の3つです.以下は,OCamlのtoplevel loopをocamlとして起動後,#use "hol.ml";;と入力,ロードが完了
Camlp4 Parsing version 3.09.0
と表示された状態からの例です.
(1)issue directives
例えば,Libraryディレクトリにあるanalysis.mlというファイルをロードするには
#use "Library/analysis.ml" ;;
システムのコマンドを実行するには
Sys.command("システムのコマンド") ;;
loopを終了するには
#quit ;;
とします.
(2)evaluate expressions
例えば
2 + 2;;
val it : int = 4
と評価されて,直前の結果は,itとして参照でき,今の場合
it * it;;
val it : int = 16
となります.このit:intというのはitつまり16のtypeがintであるということで
16.;;
val it : float = 16.
"16";;
val it : string = "16"
といった違いがあり,例えば,floatの割り算は
16. /. 2. ;;
val it : float = 8.
stringの結合は
"ABC" ^ " to " ^ "XYZ" ;;
val it : string = "ABC to XYZ"
といった具合です.また
2=1;;
val it : bool = false
2=1+1;;
val it : bool = true
2>1;;
val it : bool = true
のような評価もできます.
(3)make definitions
ある本体に名前を付けて,参照できるようにするには
let 名前 = 本体
とします.例えば,
let x = 1 and y = 2;;
val x : int = 1
val y : int = 2
x+y;;
val it : int = 3
let x = x+y;;
val x : int = 3
となり,inを用いて
let x = 0 in x+y;;
val it : int = 2
x;;
val it : int = 3
のようにローカルな処理もできます.
引数に値を対応させる関数に名前を名付けるには
let 名前 引数 = 値 ;;
あるいは
let 名前 = fun 引数 -> 値 ;;
と入力します.例えば,f1(x)=x*xと定義するには
let f1 x = x * x;;
val f1 : int -> int =
とすればよく,この
f1 : int -> int =
とは,f1のtypeは,intにintを対応させる関数ということです.使い方は,括弧なしで
f1 5;;
val it : int = 25
とすればよく,結合の強さは
f1 5 + 5;;
val it : int = 30
のように,f1(5)+5となります.2変数関数は,例えば
let f2 x y = x * y;;
val f2 : int -> int -> int =
となり,f2のtypeは,intとintにintを対応させる関数ということです.使い方は,同じく
f2 5 7;;
val it : int = 35
ですが,例えば,上で定義した1変数関数f1の合成による5の像f1(f1(5))を括弧なしで書くと
f1 f1 5;;
Characters 0-2:
f1 f1 5;;
^^
This function is applied to too many arguments,
maybe you forgot a `;'
のようにf1 5が左側のf1の引数と見なされてしまいますので,ここは
f1 (f1 5);;
val it : int = 625
あるいは,合成の記号として o(小文字のオー)を用いて
# let f x = x+1 and g x = 2 * x ;;
val f : int -> int =
val g : int -> int =
# f o g 3;;
Characters 4-7:
f o g 3;;
^^^
This expression has type int but is here used with type 'a -> int
# (f o g) 3 = f ( g 3 );;
val it : bool = true
とすることになります.
なお,OCamlについての詳しくは
http://ocaml.jp/FrontPage
あるいは
http://www.sato.kuis.kyoto-u.ac.jp/~igarashi/class/isle4/mltext/ocaml.html
などが参考になります.