関数型言語の基礎 1. 2. 3. 4. 型なしl計算 型理論 構成的プログラミング GUIにあらわれる関数概念 1. PBD 2. VL 3. VSL (Visual Scripting Language) l計算 手続き型言語では add1(x)=x+1 (1) によって関数add1を定義する。これはadd1の関数としての 振る舞いは定義するが、関数そのもの表現を与えない。 「xをもらってx+1を返す関数」そのものの表現として lx.x+1 をもちいる。関数を構成する操作をl抽象とよぶ。 これにより、(1)は add1= lx.x+1 と等価で、add1を単独でデータとして用いることができる。 関数適用 実引数3を渡して値を計算するのに add1(3) のよう表現するのと同様、 (lx.x+1)(3) のように表す。この(関数呼び出しの)操作を関数 適用という。 実際に実引数を関数本体に代入する操作 (lx.x+1)(3) ⇒ 3+1 をb簡約 (b-conversion あるいはb-reduction) という。 高階関数 n引数関数 f(x1,…,xn) は lx1.(lx2.(…(lxn. f(x1,…,xn))…)) とあらわせる。(カリー化 Currying) 問い (2項演算の)足し算を高階関数で表せ。 l計算の構文 Var ::= v | Var ’ Term ::= Var | (Term Term) | (l Var. Term) Termはl項(lterm)という。 略記法 M1 M2 M3… Mn は ((…((M1 M2) M3 ) …) Mn) l x1 x2 … xn . Mは (l x1. (l x2 . ( …( xn . M )…))) の略記法 例: l xyz . xz(yz)は ( l x . ( l y . ( l z . (( xz)(yz))))) 束縛変数と自由変数 lx . y(ly . xy) 1 23 1のyは自由変数 2,3のx,yは束縛変数 a同値と代入 束縛変数の名前だけが違うものは同一視する (a同値)。またa同値なものに置き換える操作を a変換(a-conversion)という。 l項Mの自由変数xをl 項 Nでおきかえる操作を代 入という。結果をM[x:=N]と書く。 おきかえの際、 Nが自由変数yをもち、 Mの束縛変数yのl束縛のスコープに自由変数x があれば、 あらかじめMの束縛変数yをべつの名 前に換える。 問: l y.xy [x:=lx . xy] b-簡約の定義 代入をつかってb-簡約の定義の定義を書くと (lx.M)N ⇒ M[x:=N] この両辺を等しいものと考え (lx.M)N = M[x:=N] と書く。等号=の公理は他に M N M N M N , , lx.M lx.M ML NL LM LN l計算による算術プログラミング 1. 数の表現 cn≡lfx . fn(x) ここで、 Mn(N) ≡ M(M(…(M N) …)) n個 c0≡lfx . xとする チャーチ数 (Church numeral) 2. 算術演算 A+ ≡ lxypq . xp(ypq) A* ≡ lxyz . x (yz) Aexp ≡ lxy . yx とすると、 A+ cm cn = cm+n A* cm cn = cm* n A^ cm cn= cm^ n 3. 条件式 true ≡ lxy . x false≡ lxy . y if L then M else N ≡LMN とすると、 if true then M else N = M if false then M else N = N 4. 組 [M, N] ≡ lz . zMN fst ≡ lx . x true snd ≡ lx . x false とすると fst [M, N]=M snd [M, N]=N 不動点演算子 階乗をもとめる関数factの再帰的定義: fact(n) = if n=0 then 1 else n*fact(n-1) 高階関数Fの定義: F(f)(n) = if n=0 then 1 else n*f(n-1) とすると、 factは f に関する方程式 F(f) = f の解。このときf はFの不動点という。関数にたい してその不動点を求める関数(不動点演算子) をFixと書くと、 Fix(F) = F(Fix(F)) 不動点コンビネータ Y ≡ lf.(lx . f(xx))(lx . f(xx)) とすると任意のl式Mについて M (Y M) = Y M このYを不動点コンビネータという。 不動点コンビネータはl式を関数とみたとき の不動点演算子 5. 帰納的定義 任意のl式Mにたいして、 H = lx1…xn.M[h:=H] を満たすl式Hが存在する。 証明: H ≡ Y (lhx1…xn.M)とせよ。 算術関数 「0」 ≡ lx.x 「n+1」 ≡ [false, 「n」] succ ≡ lx .[false, x] pred≡ lx.x false iszero ≡ lx.x ture Church数に対する算術関数 succC ≡ lxyz.y(xyz) predC ≡ lxyz.x(lpq.q (py))(lv.z)(lv.v) iszeroC ≡lx.x succ 「0」 true 関数の表現 fact をl式で書け
© Copyright 2024 ExpyDoc