1 / 19

関数型言語の基礎

関数型言語の基礎. 型なし l 計算 型理論 構成的プログラミング GUI にあらわれる関数概念 PBD VL VSL (Visual Scripting Language). l 計算. 手続き型言語では add1( x )= x +1 (1) によって関数 add1 を定義する。これは add1 の関数としての振る舞いは定義するが、関数そのもの表現を与えない。 「 x をもらって x +1 を返す関数 」そのものの表現として l x . x +1 をもちいる。関数を構成する操作を l 抽象 とよぶ。 これにより、 (1) は

hans
Download Presentation

関数型言語の基礎

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 関数型言語の基礎 • 型なしl計算 • 型理論 • 構成的プログラミング • GUIにあらわれる関数概念 • PBD • VL • VSL (Visual Scripting Language)

  2. l計算 手続き型言語では add1(x)=x+1 (1) によって関数add1を定義する。これはadd1の関数としての振る舞いは定義するが、関数そのもの表現を与えない。「xをもらってx+1を返す関数」そのものの表現として lx.x+1 をもちいる。関数を構成する操作をl抽象とよぶ。 これにより、(1)は add1= lx.x+1 と等価で、add1を単独でデータとして用いることができる。

  3. 関数適用 実引数3を渡して値を計算するのに add1(3) のよう表現するのと同様、 (lx.x+1)(3) のように表す。この(関数呼び出しの)操作を関数適用という。 実際に実引数を関数本体に代入する操作 (lx.x+1)(3) ⇒  3+1 をb簡約 (b-conversionあるいはb-reduction) という。

  4. 高階関数 n引数関数 f(x1,…,xn) は lx1.(lx2.(…(lxn. f(x1,…,xn))…)) とあらわせる。(カリー化Currying) 問い  (2項演算の)足し算を高階関数で表せ。

  5. l計算の構文 Var ::= v | Var’ Term ::= Var | (Term Term) | (l Var. Term) Termはl項(lterm)という。 略記法 M1M2M3… Mn は ((…((M1M2) M3 )…) Mn) l x1x2 …xn. Mは (l x1. (lx2 . (…(xn. M )…))) の略記法 例:  l xyz. xz(yz)は ( l x .(l y .(l z. (( xz)(yz)))))

  6. 束縛変数と自由変数 lx. y(ly. xy) 1 23 1のyは自由変数 2,3のx,yは束縛変数

  7. 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]

  8. b-簡約の定義 代入をつかってb-簡約の定義の定義を書くと (lx.M)N ⇒M[x:=N] この両辺を等しいものと考え (lx.M)N =M[x:=N] と書く。等号=の公理は他に

  9. l計算による算術プログラミング

  10. 数の表現 cn≡lfx . fn(x) ここで、 Mn(N) ≡ M(M(…(M N) …)) n個 c0≡lfx . xとする チャーチ数(Church numeral)

  11. 算術演算 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

  12. 条件式 true ≡lxy . x false≡lxy . y ifLthenMelseN ≡LMN とすると、 iftruethenMelseN = M iffalsethenMelseN = N

  13. [M, N] ≡lz . zMN fst ≡lx . x true snd ≡lx . x false とすると fst [M, N]=M snd [M, N]=N

  14. 不動点演算子 階乗をもとめる関数factの再帰的定義: fact(n) = ifn=0 then 1 elsen*fact(n-1) 高階関数Fの定義: F(f)(n) = ifn=0 then 1 elsen*f(n-1) とすると、 factは f に関する方程式 F(f) = f の解。このときf はFの不動点という。関数にたいしてその不動点を求める関数(不動点演算子)をFixと書くと、 Fix(F) = F(Fix(F))

  15. 不動点コンビネータ Y ≡ lf.(lx . f(xx))(lx . f(xx)) とすると任意のl式Mについて M (Y M) = Y M このYを不動点コンビネータという。 不動点コンビネータはl式を関数とみたときの不動点演算子

  16. 帰納的定義 任意のl式Mにたいして、 H = lx1…xn.M[h:=H] を満たすl式Hが存在する。 証明:H ≡ Y (lhx1…xn.M)とせよ。

  17. 算術関数 「0」 ≡ lx.x 「n+1」 ≡ [false, 「n」] succ ≡ lx .[false, x] pred≡ lx.x false iszero ≡ lx.x ture

  18. Church数に対する算術関数 succC≡ lxyz.y(xyz) predC≡ lxyz.x(lpq.q (py))(lv.z)(lv.v) iszeroC≡lx.x succ 「0」 true

  19. 関数の表現 fact をl式で書け

More Related