annotate paper/type.tex @ 38:5d4097922243

Wrote untyped expression
author atton <atton@cr.ie.u-ryukyu.ac.jp>
date Sat, 28 Jan 2017 12:10:35 +0900
parents 881bd1d12a45
children 5b1e3b62e6dc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
28
36ce493604fb Add akasha result
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 \chapter{ラムダ計算と型システム}
36ce493604fb Add akasha result
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 \label{chapter:type}
36ce493604fb Add akasha result
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 \ref{chapter:cbc} では CbC のモデル検査的検証アプローチとして、akasha を用いた有限の要素数の挿入時の仕様の検証を行なった。
36ce493604fb Add akasha result
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 しかし、さらに多くの要素を検証したり無限回の挿入を検証するには状態の抽象化や CbC 側に記号実行の機構を組み込んだり証明を行なう必要がある。
36ce493604fb Add akasha result
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 CbC は直接自身を証明する機構が存在しない。
36ce493604fb Add akasha result
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 プログラムの性質を証明するには CbC の形式的な定義が必須となる。
36ce493604fb Add akasha result
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 \ref{chapter:type} 章ではCbC の項の形式的な定義の一つとして、部分型を用いて CbC の CodeSegment と DataSegment が定義できることを示していく。
30
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
8 また、型システムの別の利用方法として命題が型で表現できる Curry-Howard 対応を利用した証明が存在するが、その利用方法については\ref{chapter:agda}章で述べる。
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
9
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
10 % {{{ 型システムとは
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
11 \section{型システムとは}
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
12 型システムとは、計算する値を分類することにでプログラムがある種の振舞いを行なわないことを保証する機構の事である\cite{Pierce:2002:TPL:509043}\cite{pierce2013型システム入門プログラミング言語と型の理論}。
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
13 ある種の振舞いとはプログラム中の評価不可能な式や、言語として未定義な式などが当て嵌まる。
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
14 例えば、gcc や clang といったコンパイラは関数定義時に指定された引数の型と呼び出し時の値の型が異なる時に警告を出す。
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
15 % TODO: C の warning?
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
16 この警告は関数が受けつける範囲以外の値をプログラマが渡してしまった場合などに有効に働く。
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
17 加えて、関数を定義する側も受け付ける値の範囲を限定できるため関数内部の処理を記述しやすい。
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
18
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
19 型システムで行なえることには以下のようなものが存在する。
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
20
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
21 \begin{itemize}
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
22 \item エラーの検出
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
23
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
24 文字列演算を行なう関数に整数を渡してしまったり、データの単位を間違えてしまったり、複雑な場合分けで境界条件を見落すなど、プログラマの不注意が型の不整合となって早期に指摘できる。
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
25 この指摘できる詳細さは、型システムの表現力とプログラムの内容に依存する。
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
26 多用なデータ構造を扱うプログラム(コンパイラのような記号処理アプリケーションなど)は数値計算のような数種類の単純な型しか使わないプログラムよりも型検査器から受けられる恩恵が大きい。
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
27 他にも、ある種のプログラムにとっては型は保守のためのツールともなる。
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
28 複雑なデータ構造を変更する時、その構造に関連するソースコードを型検査器は明らかにしてくれる。
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
29
31
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
30 \item 抽象化
30
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
31
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
32 型は大規模プログラムの抽象化の単位にもなる。
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
33 例えば特定のデータ構造に対する処理をモジュール化し、パッケージングすることができる。
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
34 モジュール化されたデータ構造は厳格に定義されたインターフェースを経由して呼び出すことになる。
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
35 このインターフェースは利用する側に取っては呼び出しの規約となり、実装する側にとってはモジュールの要約となる。
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
36
31
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
37 \item ドキュメント化
30
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
38
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
39 型はプログラムを理解する際にも有用である。
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
40 関数やモジュールの型を確認することにより、どのデータを対象としているのかといった情報が手に入る。
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
41 また、型はコンパイラが実行されるために検査されるため、コメントに埋め込まれた情報と異なり常に正しい情報を提供する。
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
42
31
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
43 \item 言語の安全性
30
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
44
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
45 安全性のの定義は言語によって異なるが、型はデータの抽象化によってある種の安全性を確保できる。
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
46 例えば、プログラマは配列をソートする関数があった場合、与えられた配列のみがソートされ、他のデータには影響が無いことを期待するだろう。
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
47 しかし、低水準言語ではメモリを直接扱えるため、予想された処理の範囲を越えてデータを破壊する可能性がある。
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
48 より安全な言語ではメモリアクセスが抽象化し、データを破壊する可能性をプログラマに提供しないという選択肢がある。
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
49
31
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
50 \item 効率性
30
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
51
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
52 そもそも、科学計算機における最初の型システムは Fortran などにおける式の区別であった。% TODO ref fortran
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
53 整数の算術式と実数の算術式を区別し、数値計算の効率化を測るために導入されたのである。
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
54 型の導入により、コンパイラはプリミティブな演算とは異なる表現を用い、実行コードを生成する時に適切な機械語表現を行なえるようになった。
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
55 昨今の高性能コンパイラでは最適化とコード生成のフェーズにおいて型検査器が収集する情報を多く利用している。
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
56
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
57 \end{itemize}
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
58
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
59 型システムの定義には多くの定義が存在する。
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
60 型の表現能力には単純型や総称型、部分型などが存在し、動的型付けや静的型付けなど、言語によってどの型システムを採用するかは言語の設計に依存する。
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
61 例えば C言語では数値と文字を二項演算子 \verb/+/ で加算できるが、Haskell では加算することができない。
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
62 これは Haskell が C言語よりも厳密な型システムを採用しているからである。
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
63 具体的には Haskell は暗黙的な型変換を許さず、 C 言語は言語仕様として暗黙の型変換を持っている。
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
64
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
65 型システムを定義することはプログラミング言語がどのような特徴を持つか決めることにも繋がる。
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
66
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
67 % }}}
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
68
38
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
69 % {{{ 型無し算術式
34
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
70 \section{型無し算術式}
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
71 まず、型システムやその性質について述べるためにプログラミング言語そのものの基本的な性質について述べる。
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
72 プログラムの構文と意味論、推論について考えるために整数とブール値のみで構成される小さな言語を扱いながら考察する。
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
73 この言語は二種類の値しか持たないが、項の帰納的定義や証明、評価、実行時エラーのモデル化を表現することができる。
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
74
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
75 この言語はブール定数 $ true $ と $ false $ 、条件式、数値定数 0 、算術演算子 $ succ $ と $ pred $ 、判定演算子 $ iszero $ のみからなる。
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
76 算術演算子 $ succ $ は与えられた数の次の数を返し、 $ pred $ はその前の数を返す。
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
77 判定演算子$ iszero $ は与えられた項が 0 なら $ true $ を返し、それ以外は $ false $ を返す。
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
78 これらを文法として定義すると以下のリスト\ref{src:expr-term}のようになる。
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
79
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
80 \lstinputlisting[label=src:expr-term, caption=算術式の項定義] {src/expr-term.txt}
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
81
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
82 この定義では算術式の項 $ t $ を定義している。
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
83 $ ::= $ は項の集合の定義を表であり、$ t $ は項の変数のようなものである。
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
84 それに続くすべての行は、構文の選択肢である。
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
85 構文の選択肢内に存在する記号 $ t $ は任意の項を代入できることを表現している。
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
86 このように再帰的に定義することにより、 \verb/ if (ifzero (succ 0)) then true else (pred (succ 0)) / といった項もこの定義に含まれる。
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
87 例において、 $ succ $ 、 $ pred $ 、 $ iszero $ に複合的な引数を渡す場合は読みやすさのために括弧でくくっている。
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
88 括弧の定義は項の定義には含んでいない。
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
89 コンパイラなど具体的な字句をパースする必要がある場合、曖昧な構文を排除するために括弧の定義は必須である。
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
90 しかし、今回は型システムに言及するために曖昧な構文は明示的に括弧で指示することで排除し、抽象的な構文のみを取り扱うこととする。
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
91
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
92 現在、項と式という用語は同一である。
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
93 型のような別の構文表現を持つ計算体系においては式はあらゆる種類の構文を表す。
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
94 項は計算の構文的表現という意味である。
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
95
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
96 この言語におけるプログラムとは上述の文法で与えられた形からなる項である。
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
97 評価の結果は常にブール定数か自然数のどちらかになる。
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
98 これら項は値と呼ばれ、項の評価順序の形式化において区別が必要となる。
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
99
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
100 なお、この項の定義においては \verb/succ true/ といった怪しい項の形成を許してしまう。
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
101 実際、これらのプログラムは無意味なものであり、このような項表現を排除するために型システムを利用する。
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
102
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
103 ある言語の構文を定義する際に、他の表現かいくつか存在する。
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
104 先程の定義は次の帰納的な定義のためのコンパクトな記法である。
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
105
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
106 \begin{definition}
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
107 項の集合とは以下の条件を満たす最小の集合 $ T $ である。
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
108 \begin{eqnarray*}
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
109 \label{eq:expr}
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
110 \{true , false , 0\} \subseteq T \\
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
111 t_1 \in T ならば \{succ \; t_1 , pred \; t_1 , iszero \; t_1\} \subseteq T \\
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
112 t_1 \in T かつ t_2 \in T かつ t_3 \in T ならば if \; t_1 \; then \; t_2 else \; t_3 \subseteq T
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
113 \end{eqnarray*}
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
114 \end{definition}
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
115
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
116 まず1つめの条件は、$ T $ に属する3つの式を挙げている。
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
117 2つめと3つめの条件は、ある種の複合的な式が $ T $ に属することを判断するための規則を表している。
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
118 最後の「最小」という単語は $ T $ がこの3つの条件によって要求される要素以外の要素を持たないことを表している。
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
119
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
120 また、項の帰納的表現の略記法として、二次元の推論規則形式を用いる方法もある。
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
121 これは論理体系を自然演繹スタイルで表現するためによく使われる。
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
122 自然演繹による証明は\ref{agda}章内で触れるが、今回は項表現として導入する。
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
123
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
124 \begin{definition}
36
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
125 項の集合は次の規則によって定義される。
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
126
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
127 \begin{prooftree}
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
128 \AxiomC{$ true \in T $}
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
129 \end{prooftree}
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
130
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
131 \begin{prooftree}
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
132 \AxiomC{$ false \in T $}
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
133 \end{prooftree}
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
134
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
135 \begin{prooftree}
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
136 \AxiomC{$ 0 \in T $}
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
137 \end{prooftree}
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
138
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
139 \begin{prooftree}
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
140 \AxiomC{$ t_1 \in T $}
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
141 \UnaryInfC{$ succ \; t_1 \in T$}
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
142 \end{prooftree}
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
143
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
144 \begin{prooftree}
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
145 \AxiomC{$ t_1 \in T $}
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
146 \UnaryInfC{$ pred \; t_1 \in T$}
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
147 \end{prooftree}
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
148
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
149 \begin{prooftree}
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
150 \AxiomC{$ t_1 \in T $}
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
151 \UnaryInfC{$ iszero \; t_1 \in T$}
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
152 \end{prooftree}
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
153
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
154 \begin{prooftree}
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
155 \AxiomC{$ t_1 \in T $}
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
156 \AxiomC{$ t_2 \in T $}
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
157 \AxiomC{$ t_3 \in T $}
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
158 \TrinaryInfC{$ if \; t_1 \; then \; t_2 \; else \; t_3 \in T$}
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
159 \end{prooftree}
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
160
34
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
161 \end{definition}
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
162
36
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
163 最初の$ true, \; false, \; 0 $の3つ規則は再帰的定義の1つめの条件と同じである。
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
164 それ以外の4つの規則は再帰的定義の2つめと3つめの条件と同じである。
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
165 それぞれの規則は「もし線の上に列挙して前提が成立するのならば、線の下の結論を導出できる」と読む。
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
166 $ T $ がこれらの規則を満たす最小の集合である事実は明示的に述べられない。
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
167
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
168 言語の構文は定義できたので、次は項がどう評価されるかの意味論について触れていく。
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
169 意味論の形式化には操作的意味論や表示的意味論、公理的意味論やゲーム意味論などがあるが、ここでは操作的意味論について述べる。
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
170 操作的意味論とは、言語の抽象機械を定義することにより言語の振舞いを規程する。
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
171 この抽象機械が示す抽象とは、扱う命令がプロセッサの命令セットなどの具体的なものでないことを表している。
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
172 単純な言語の抽象機械における状態は単なる項であり、機械の振舞いは遷移関数で定義される。
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
173 この関数は各状態において項の単純化ステップを実行して次の状態を与えるか、機械を停止させる。
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
174 ここで項 $ t $ の意味は、$ t $ を初期状態として動き始めた機械が達する最終状態である。
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
175
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
176 なお、一つの言語に複数の操作的意味論を与えることもある。
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
177 例えば、プログラマが扱う項に似た機械状態を持つ意味論の他に、コンパイラの内部表現やインタプリタが扱う意味論を定義する。
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
178 これらの振舞いが同じプログラムを実行した時に何かしらの意味であれば、結果としてその言語の実装の正しさを証明することに繋がる。
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
179
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
180 まずはブール式のみの操作的意味論を定義する。
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
181
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
182 \begin{definition}
37
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
183 ブール値(B)
36
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
184
38
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
185
36
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
186 \begin{align*}
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
187 t ::= && \text{項} \\
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
188 true && \text{定数真} \\
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
189 false && \text{定数偽} \\
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
190 if \; t \; then \; t \; else \; t && \text{条件式}
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
191 \end{align*}
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
192
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
193
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
194 \begin{align*}
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
195 v ::= && \text{値} \\
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
196 true && \text{真} \\
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
197 false && \text{偽}
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
198 \end{align*}
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
199
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
200 評価
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
201 \begin{align*}
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
202 if \; true \; then \; t_2 \; else t_3 \rightarrow t_2 && \text{(E-IFTRUE)} \\
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
203 if \; false \; then \; t_2 \; else t_3 \rightarrow t_3 && \text{(E-IFFALSE)} \\
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
204 \AxiomC{$ t_1 \rightarrow t_1'$}
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
205 \UnaryInfC{$ if \; t_1 \; then \; t_2 \; else \; t_3 \rightarrow if \; t_1' \; then t_2 \; else \;t_3 $}
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
206 \DisplayProof
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
207 && \text{(E-IF)}
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
208 \end{align*}
37
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
209
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
210 \end{definition}
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
211
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
212 評価の最終結果になりえる項である値は定数 $ true $ と $ false $ のみである。
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
213 評価の定義は評価関係の定義である。
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
214 評価関係 $ t \rightarrow t' $ は「$ t $ が1ステップで $ t' $ に評価される」と読む。
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
215 直感的には抽象機械の状態が $ t $ ならば $ t' $ が手に入るという意味である。
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
216
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
217 評価関係は3つあるが、2つは前提を持たないため、2つの公理と1つの規則から成る。
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
218 1つめの規則 E-IFTRUE の意味は、評価の対象となる項の条件式が定数 $ true $ である時に、then 節にある $ t_2 $ を残して他の全ての項を捨てるという意味である。
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
219 E-EIFFALSE も同様に条件式が $ false $ の時に $ t_3 $ のみを残す。
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
220 3つ目の規則 E-IF は条件式の評価である。
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
221 条件式 $ t $ が $ t'$ に評価されうるのならば then 節と else 節を変えずに条件部のみを評価する。
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
222
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
223 評価の定義から分かることの中に、if の中の then節 と else 節は条件部より先に評価されないことがある。
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
224 よって、この言語は条件式の評価に対し条件部から評価が優先されるという評価戦略を持つことが分かる。
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
225
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
226 \begin{definition}
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
227 推論規則のインスタンスとは、規則の結論や前提に対し、一貫して同じ項による書き換えを行なったものである。
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
228 \end{definition}
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
229
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
230 例えば、
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
231
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
232 \verb/if true then true else (if false then false else false)/
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
233
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
234 は E-IFTRUE のインスタンスであり、 E-IFTRUEの $ t_2 $ が \verb/true/ かつ $ t_3 $ が \verb/if false then false else false/ の時である。
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
235
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
236 \begin{definition}
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
237 1ステップ評価関係 $ \rightarrow $ とは、3つの評価の規則を満たす、項に関する最小の二項関係である。
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
238 $ (t, \; t') $ がこの関係の元である時、「評価関係式 $ t \rightarrow t'$ は導出可能である」と言う。
36
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
239 \end{definition}
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
240
37
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
241 ここで「最小」という言葉が表れるため、評価関係式 $ t \rightarrow t'$ が導出可能である時かつその時に限り、その関係式は規則によって正当化される。
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
242 すなわち評価関係式は公理 E-IFTRUE か E-IFFALSE 、前提が成り立つ時の E-IF のインスタンスとなる。
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
243 与えられた評価関係式が導出可能であることを証明するには、葉が E-IFTRUE か E-IFFALSE であり、内部ノードのラベルが E-IF のインスタンスである導出木が示せれば良い。
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
244 例えば以下の略記の元 $ if \; t \; then \; false \; then \; false \rightarrow if \; u \; then \; false \; else \; false $ の導出可能性は以下のような導出木によって示せる。
36
34812c1b33c2 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
245
37
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
246 \begin{itemize}
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
247 \item $ s = if \; true \; then \; false \; else \; false $
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
248 \item $ t = if \; s \; then \; true \; else \; true $
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
249 \item $ u = if \; false \; then \; true \; else \; true $
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
250 \end{itemize}
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
251
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
252
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
253 \begin{prooftree}
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
254 \AxiomC{}
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
255 \RightLabel{E-IFTRUE}
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
256 \UnaryInfC{ $ s \rightarrow true $ }
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
257 \RightLabel{E-IF}
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
258 \UnaryInfC{ $ t \rightarrow u $}
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
259 \RightLabel{E-IF}
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
260 \UnaryInfC{ $ if \; t \; then \; false \; then \; false/ \rightarrow if \; u \; then \; false \; else \; false $}
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
261 \end{prooftree}
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
262
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
263 1ステップ評価関係は与えられた項に対して抽象機械の状態遷移を定義する。
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
264 この時、機械がそれ以上ステップを進められない時にそれが最終結果となる。
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
265
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
266 \begin{definition}
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
267 正規形
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
268
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
269 項 $ t $ が正規形であるとは、$ t \rightarrow t'$となる評価規則が存在しないことである。
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
270 \end{definition}
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
271
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
272 この言語において $ true $ や $ false $ は正規形である。
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
273 逆に言えば、構文的に正しい if が用いられている場合は評価することが可能なため正規形ではない。
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
274 極端に言えばこの言語における全ての値は正規形なのである。
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
275 しかし、他の言語における値は一般的に正規形ではない。
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
276 実のところ、値でない正規形は実行時エラーとなって表れる。
881bd1d12a45 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
277
38
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
278 実際にこの言語に整数を導入し、値では無い正規形を確認していく。
34
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
279
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
280
38
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
281 \begin{definition}
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
282 算術式BN (B の拡張) の項
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
283 \begin{align*}
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
284 t ::= && \text{項} \\
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
285 true && \text{定数真} \\
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
286 false && \text{定数偽} \\
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
287 if \; t \; then \; t \; else \; t && \text{条件式} \\
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
288 0 && \text{定数ゼロ} \\
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
289 succ \; t && \text{後者値} \\
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
290 pred \; t && \text{前者値} \\
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
291 iszero \; t && \text{ゼロ判定}
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
292 \end{align*}
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
293 \end{definition}
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
294
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
295 \begin{definition}
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
296 算術式BN の値
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
297 \begin{align*}
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
298 v ::= && \text{値} \\
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
299 true && \text{真} \\
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
300 false && \text{偽} \\
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
301 nv && \text{数値} \\
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
302 \end{align*}
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
303 \end{definition}
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
304
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
305 \begin{definition}
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
306 算術式BNの数値
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
307 \begin{align*}
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
308 nv ::= && \text{数値} \\
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
309 0 && \text{ゼロ} \\
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
310 succ nv && \text{後者値}
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
311 \end{align*}
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
312 \end{definition}
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
313
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
314 \begin{definition}
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
315 算術式BNの評価($ t \rightarrow t' $)
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
316 \begin{align*}
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
317 if \; true \; then \; t_2 \; else t_3 \rightarrow t_2 && \text{(E-IFTRUE)} \\
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
318 if \; false \; then \; t_2 \; else t_3 \rightarrow t_3 && \text{(E-IFFALSE)} \\
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
319 \AxiomC{$ t_1 \rightarrow t_1'$}
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
320 \UnaryInfC{$ if \; t_1 \; then \; t_2 \; else \; t_3 \rightarrow if \; t_1' \; then t_2 \; else \;t_3 $}
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
321 \DisplayProof && \text{(E-IF)} \\
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
322 \AxiomC{$ pred \; 0 \rightarrow 0$}
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
323 \DisplayProof && \text{(E-PREDZERO)} \\
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
324 \AxiomC{$ pred \; (succ \; nv_1) \rightarrow nv_1$}
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
325 \DisplayProof && \text{(E-PREDSUCC)} \\
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
326 \AxiomC{$ t_1 \rightarrow t_1'$}
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
327 \UnaryInfC{$ pred \; t_1 \rightarrow pred \; t_1'$}
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
328 \DisplayProof && \text{(E-PRED)} \\
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
329 \AxiomC{$ iszero \; 0 \rightarrow true$}
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
330 \DisplayProof && \text{(E-ISZEROZERO)} \\
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
331 \AxiomC{$ iszero \; (succ \; nv_1) \rightarrow false$}
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
332 \DisplayProof && \text{(E-ISZEROSUCC)} \\
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
333 \AxiomC{$ t_1 \rightarrow t_1'$}
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
334 \UnaryInfC{$ iszero \; t_1 \rightarrow iszero \; t_1'$}
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
335 \DisplayProof && \text{(E-ISZERO)} \\
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
336 \end{align*}
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
337 \end{definition}
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
338
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
339 今回値の定義に数値を表す構文要素が追加されている。
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
340 数は0かある数に後者関数を適用したもののどちらかである。
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
341 評価規則 E-PREDZERO、E-PREDSUCC、E-ISZEROZERO、E-ISZEROSUCC は演算 \verb/pred/ と \verb/iszero/ が数に適用された時にどう振る舞うかを定義している。
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
342 E-SUCC 、 E-PRED 、 E-ISZERO の合同規則も E-IF のように部分項から先に評価することを示している。
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
343
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
344 数値の構文要素(nv)はこの定義によって重要な役割をはたす。
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
345 例えば、 E-PREDSUCC 規則が適用できる項は任意の項 $ t $ ではなく数値 $nv_1$である。
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
346 これは $ pred \; (succ \; (pred \; 0)) $ を $ pred 0 $ に評価できないことを意味する。
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
347 なぜなら $ pred \; 0 $ は数値に含まれないからである。
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
348
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
349 ここで言語の操作的意味論について考える時、すべての項に関する振舞いを定義する必要がある。
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
350 すべての項には $ pred \; 0 $ や $ succ false $ のような項も含まれる。
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
351 しかし、 $ succ $ を $ false $ に適用する評価結果は定義されていないため、 $ succ \; false $ は正規形である。
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
352 このような、正規形であるが値でない項は行き詰まり状態であるという。
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
353 つまり、実行時エラーとは行き詰まり状態の項を指す。
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
354 直感的な解釈としてはプログラムが無意味な状態になったこと示しておい、操作的意味論が次に何も行なえないことを特徴付けているのである。
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
355 プログラング言語において実行時エラーはセグメンテーションフォールトや不正な命令などいくつかのものが挙げられるが、型システムを考える際にはこれらのエラーは行き詰まり状態という単一の概念で表す。
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
356
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
357 % }}}
34
9800586284e1 Writing expression ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
358
32
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
359 % {{{ 型なしラムダ計算
30
55f67e448dcc Add type system description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
360 \section{型なしラムダ計算}
38
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
361 計算とは何か、エラーとは何か、を算術式を定義することによって示してきた。
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
362 ここで、プログラミング言語における計算を形式的に定義していく。
31
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
363 プログラミング言語は複雑だが、その計算はある本質的な仕組みからの派生形式として定式化可能であることを Peter Ladin が示した。 % TODO: ref TaPL 61
38
5d4097922243 Wrote untyped expression
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
364 この時 Landin が使った本質的な仕組みとしての核計算がラムダ計算であった。
31
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
365 ラムダ計算は Alonzo Church が発明した形式的体系の一つである。 % TODO: ref
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
366 ラムダ計算では全ての計算が関数定義と関数適用の基本的な演算に帰着される。
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
367 ラムダ計算はプログラミング言語の機能の仕様記述や、言語設計と実装、型システムの研究に多く使われている。
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
368 この計算体系の重要な点は、ラムダ計算内部で計算が記述できるプログラミング言語であると同時に、それ自身について厳格な証明が可能な数学的対象としてみなせる点にある。
28
36ce493604fb Add akasha result
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
369
31
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
370 ラムダ計算はいろいろな方法で拡張できる。
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
371 数や組やレコードなどはラムダ計算そのもので模倣することができるが、記述が冗長になってしまう。
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
372 それらの機能のための具体的な特殊構文を加えることは言語の利用者の視点で便利である。
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
373 他にも書き換え可能な参照セルや非局所的な例外といった複雑な機能を表現することもできるが、膨大な変換を用いなければモデル化できない。
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
374 それらを言語として備えた拡張に ML や Haskell といったものがある。 % TODO: ref
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
375
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
376 ラムダ計算(または $ \lambda $ 計算) とは、関数定義と関数適用を純粋な形で表現する。
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
377 ラムダ計算においてはすべてが関数である。
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
378 関数によって受け付ける引数も関数であり、関数が返す結果もまた関数である。
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
379
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
380 ラムダ計算の項は変数と抽象と適用の3種類の項からなり、以下の文法に要約される。
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
381 変数 $ x $ は項であり、項 $ t_1 $ から変数 $ x $ を抽象化した $ \lambda x . t_1 $ も項であり、項 $ t_1 $ を他の項 $ t_2 $ に適用した $ t_1 t_2 $ も項である。
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
382
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
383 \begin{multline*}
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
384 t ::= \\
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
385 x \\
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
386 \lambda x . t \\
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
387 t \, t \\
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
388 \end{multline*}
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
389
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
390 ラムダ計算において関数適用は左結合とする。
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
391 つまり、 $ s \, t \, u $ は $ (s \, t) \, u $ となる。
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
392
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
393 また、抽象の本体はできる限り右側へと拡大する。
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
394 例えば $ \lambda x . \; \lambda y . \; x \, y \, x $ は $ \lambda x . (\lambda . y ((x \, y) \, x)) $ となる。
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
395
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
396 ラムダ計算には変数のスコープが存在する。
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
397 抽象 $ \lambda x . t $ の本体 $ t $ の中に変数 $ x $ がある時、 $ x $ の出現は束縛されていると言う。
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
398 同様に、 $ \lambda x $ は $ t $ をスコープとする束縛子であると言う。
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
399 なお、 $ x $ を囲む抽象によって束縛されていない場所の $ x $ の出現は自由であると言う。
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
400 例えば $ x \; y $ や $ \lambda y . \; x \; y $ における $ x $ の出現は自由だが、 $ \lambda x . x $ や $ \lambda z . \lambda x . \lambda y . x (y \; z) $ における $ x $ の出現は束縛されている。
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
401 $ (\lambda x . x) \;x $ においては、最初の $ x $ の出現は束縛されているが、2つ目の出現は自由である。
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
402
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
403 ラムダ計算において、計算とは引数に対する関数の適用である。
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
404 抽象に対して項を適用した場合、抽象の本体に存在する束縛変数に適用する項を代入したもので書き換える。
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
405 図式的には
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
406
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
407 \begin{equation*}
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
408 (\lambda x . t_{12}) t_2 \rightarrow [ x \mapsto t_2] t_{12}
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
409 \end{equation*}
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
410
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
411 と記述する。
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
412 ここで $ [ x \mapsto t_2] t_{12} $ とは、$ t_12 $ 中の自由な $ x $ を全て $ t_2 $ で置換した項を意味する。
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
413 例えば、 $ (\lambda x . x) \; y $ は $ y $ となり、項 $ (\lambda x . x (\lambda x . x)) (y \; z) $ は $ y \; z \; (\lambda x . x) $ となる。
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
414
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
415 なお、 $ (\lambda x . t_{12}) t_2 $ という形の項を簡約基(redex, reducible expression) と呼び、上記の規則で簡約基を置換する操作をベータ簡約と呼ぶ。
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
416 ラムダ計算のための評価戦略には数種類の戦略がある。
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
417
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
418 \begin{itemize}
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
419 \item 完全ベータ簡約
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
420
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
421 任意の簡約基がいつでも簡約されうる。
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
422 つまり項の中からどの順番で簡約しても良い。
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
423
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
424 \item 正規順序簡約
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
425
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
426 最も左で最も外側の簡約基が最初に簡約される。
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
427
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
428 \item 名前呼び
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
429
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
430 正規順序の中でも抽象の内部での簡約を許さない。
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
431 名前呼びの変種は Algol-60 や Haskell で利用されている。
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
432 なお、Haskell においては必要呼びという最適化された変種を利用している。
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
433
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
434 \item 値呼び
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
435
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
436 ほとんどの言語はこの戦略を用いている。
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
437 基本的には最も左の簡約基をを簡約するが、右側が既に値(計算が終了してもう簡約できない閉じた項)になっている簡約基のみを簡約する。
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
438 \end{itemize}
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
439
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
440 値呼び戦略は関数の引数が本体で使われるかに関わらず評価され、これは正格と呼ばれる。
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
441 名前呼びなどの非正格な戦略は引数が使われる時のみ評価され、これは遅延評価とも呼ばれる。
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
442
9dc9c50a28bd Writing lambda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
443 ラムダ計算において、複数の引数は、関数を返り値として返す高階関数として定義できる。
32
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
444 項 $ s $ が二つの自由変数 $ x $ と $ y $ を含むとすれば、 $ \lambda x . \lambda y . s $ と書くことで二つの引数を持つ関数を表現できる。
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
445 これは $ x $ に $ v $ が与えられた時、$ y $ を受けとり、 $ s $ の抽象内の自由な $ x $ を $ v $ に置き換えた部分を置換する関数、を返す。
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
446 例えば $ (\lambda x . \lambda y . s) \; v \; w $ は $ (\lambda y . [x \mapsto v] s) w $ に簡約され、 $ [y \mapsto w][x \mapsto v]s $ に簡約される。
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
447 なお、複数の引数を取る関数を高階関数に変換することはカリー化と呼ばれる。
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
448
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
449 代入の操作は直感的には置換であるが、変数の束縛に注意しなくてはならない。
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
450 例えば抽象への代入を以下のように定義する。
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
451
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
452 \begin{equation*}
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
453 [ x \mapsto s ] (\lambda y . t_1) = \lambda y . [ x \mapsto s] t_1
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
454 \end{equation*}
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
455
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
456 この場合、束縛変数の名前によっては定義が破綻してしまう。例えば以下のようになる。
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
457
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
458 \begin{equation*}
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
459 [x \mapsto y](\lambda x . x) = \lambda x . y
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
460 \end{equation*}
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
461
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
462 $ \lambda $ よって束縛されているはずの $ x $ が書き変わっている。
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
463 これはスコープとして振る舞っていないので誤っている。
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
464 この問題は項 $ t $ 内の変数 $ x $ の自由な出現と束縛された出現を区別しなかったために出現した誤りである。
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
465
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
466 そこで、$ x $ を束縛する項に対しては置換行なわないように定義を変える。
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
467
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
468 \begin{itemize}
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
469 \item $ y = x $ の場合
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
470 \begin{equation*}
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
471 [ x \mapsto s ] (\lambda y . t_1) = \lambda y . t_1
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
472 \end{equation*}
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
473
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
474 \item $ y \neq x $ の場合
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
475 \begin{equation*}
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
476 [ x \mapsto s ] (\lambda y . t_1) = \lambda y . [ x \mapsto s] t_1
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
477 \end{equation*}
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
478 \end{itemize}
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
479
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
480 この場合は束縛された変数を上書きしないが、逆に自由変数を束縛するケースが発生する。
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
481 具体的には以下である。
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
482
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
483 \begin{equation*}
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
484 [ x \mapsto z] (\lambda z . x) = \lambda z . z
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
485 \end{equation*}
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
486
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
487 項 $ s $ 中の自由変数が項 $ t $ に代入されて束縛される現象は変数捕獲と呼ばれる。
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
488 これを避けるためには $ t $ の束縛変数の名前が $ s $ の自由変数の名前と異なることを保証する必要がある。
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
489 変数捕獲を回避した代入操作は捕獲回避代入と呼ばれる。
33
74a29a48575a Update lambda description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 32
diff changeset
490 代入における名前の衝突を回避するために項の束縛変数の名前を一貫して変更することで変数捕獲を回避する方法も存在する。
74a29a48575a Update lambda description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 32
diff changeset
491 束縛変数の名前を一貫して変更することをアルファ変換と呼ばれる。
74a29a48575a Update lambda description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 32
diff changeset
492 これは関数抽象に対する束縛変数は問わないという直感からくるもので、 $ \lambda x . x $ も $ \lambda y . y $ も振舞いとしては同じ関数であるとみなすものである。
32
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
493 捕獲回避の条件を追加した代入の定義は以下のような定義となる。
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
494
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
495 \begin{itemize}
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
496 \item 変数への代入
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
497
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
498 \begin{equation*}
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
499 [ x \mapsto s ] x = s
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
500 \end{equation*}
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
501
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
502 \item 存在しない変数への代入($ y \neq x $ の時)
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
503
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
504 \begin{equation*}
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
505 [ x \mapsto s ] y = y
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
506 \end{equation*}
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
507
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
508 \item 抽象内の項への代入($ y \neq x $ かつ $ y $ が $ s $ の自由変数でない)
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
509
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
510 \begin{equation*}
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
511 [ x \mapsto s ] (\lambda y . t_1) = \lambda y . [ x \mapsto s] t_1
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
512 \end{equation*}
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
513
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
514 \item 適用への代入
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
515
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
516 \begin{equation*}
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
517 [x \mapsto s] (t_1 \; t_2) = (t_1[x\mapsto s])([x \mapsto s] t_2)
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
518 \end{equation*}
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
519
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
520 \end{itemize}
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
521
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
522 この定義は少なくとも代入が行なわれる際には正しく代入が行なえる。
33
74a29a48575a Update lambda description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 32
diff changeset
523 さらに、抽象が束縛している変数を名前では無く数字として扱う名無し表現も存在する。
74a29a48575a Update lambda description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 32
diff changeset
524 これは De Brujin 表現と呼ばれ、コンパイラ内部などでの項表現として用いられる。 % TODO: ref and spell check
32
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
525
33
74a29a48575a Update lambda description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 32
diff changeset
526 最終的に形無しラムダ計算 $ \lambda $ の項の定義と評価の要約を示す。
74a29a48575a Update lambda description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 32
diff changeset
527 % TODO: TaPL 54 の図5-3
32
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
528
33
74a29a48575a Update lambda description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 32
diff changeset
529 項は変数かラムダ抽象か関数適用の3つにより構成される。
74a29a48575a Update lambda description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 32
diff changeset
530 また、ラムダ抽象値は全て値である。
74a29a48575a Update lambda description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 32
diff changeset
531 加えて評価は関数適用を行なう E-APPABS 計算規則と、適用の項を書き換える E-APP1 と E-APP2 合同規則により定義される。
74a29a48575a Update lambda description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 32
diff changeset
532
74a29a48575a Update lambda description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 32
diff changeset
533 % TODO: ラムダの再帰とかペアとかの解説
74a29a48575a Update lambda description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 32
diff changeset
534
74a29a48575a Update lambda description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 32
diff changeset
535 %TODO ラムダの操作的意味論の説明。それとも算術式を前のセクションに入れるか?
32
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
536
63bbbf54d541 Writing lambda ...
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 31
diff changeset
537 % }}}
28
36ce493604fb Add akasha result
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
538
33
74a29a48575a Update lambda description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 32
diff changeset
539 \section{単純型}
28
36ce493604fb Add akasha result
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
540 \section{単純型付きラムダ計算}
36ce493604fb Add akasha result
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
541 \section{部分型付け}
36ce493604fb Add akasha result
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
542 \section{部分型と Continuation based C}