Click here to load reader
Upload
sosuke-moriguchi
View
784
Download
0
Embed Size (px)
Citation preview
Curry-Howard同型を使って自然演繹からλ計算の項を作る
chiguri
(A→B) → (B→C) → A → Cを例に
• 自然演繹の証明はこんな感じ
(A→B) → (B→C) → A → C
(B→C) → A → C
A → C
C
[B→C]2 B
[A→B]1 [A]3
→I1
→I2
→I3
→E
→E
型だと思う
• λ計算におけるA→BはAを引数にしてBを返す関数の型だから、→Iはlam(関数抽象)、→Eはapp(関数適用)に対応
(A→B) → (B→C) → A → C
(B→C) → A → C
A → C
C
[B→C]2 B
[A→B]1 [A]3
→I1
→I2
→I3
→E
→E
(A→B) → (B→C) → A → C
(B→C) → A → C
A → C
C
[B→C]2 B
[A→B]1 [A]3
lam1
lam2
lam3
app
app
1とか2とか3じゃまずいから
• 変数っぽくする。1をfに、2をgに、3をxにする。
– この「ラベル=変数」のため、ラベル部分はidに相当。
(A→B) → (B→C) → A → C
(B→C) → A → C
A → C
C
[B→C]2 B
[A→B]1 [A]3
lam1
lam2
lam3
app
app
(A→B) → (B→C) → A → C
(B→C) → A → C
A → C
C
g : B→C B
f : A→B x : A
lam1
lam2
lam3
app
app
対応してる関数抽象の引数を書く
• →I1をfを引数にとる関数抽象だと思う。
– 1はfと対応してたから。2はg、3はxに対応させる。
– 1,2,3のラベルはここで完全消滅。
(A→B) → (B→C) → A → C
(B→C) → A → C
A → C
C
g : B→C B
f : A→B x : A
lam1
lam2
lam3
app
app
λf:A→B. ? : (A→B) → (B→C) → A → C
λg:B→C. ? : (B→C) → A → C
λx:A. ? : A → C
C
g : B→C B
f : A→B x : A
lam
lam
lam
app
app
関数適用の形を作る
• 上から作る。右上のBに具体的な項が定まる。
λf:A→B. ? : (A→B) → (B→C) → A → C
λg:B→C. ? : (B→C) → A → C
λx:A. ? : A → C
C
g : B→C B
f : A→B x : A
lam
lam
lam
app
app
λf:A→B. ? : (A→B) → (B→C) → A → C
λg:B→C. ? : (B→C) → A → C
λx:A. ? : A → C
C
g : B→C f x : B
f : A→B x : A
lam
lam
lam
app
app
同様に、上から順にルールと整合するように項を構成する。
• Cの項をつけた。
λf:A→B. ? : (A→B) → (B→C) → A → C
λg:B→C. ? : (B→C) → A → C
λx:A. ? : A → C
C
g : B→C f x : B
f : A→B x : A
lam
lam
lam
app
app
λf:A→B. ? : (A→B) → (B→C) → A → C
λg:B→C. ? : (B→C) → A → C
λx:A. ? : A → C
g (f x) : C
g : B→C f x : B
f : A→B x : A
lam
lam
lam
app
app
• 一番上のlamの本体はその上にある項。
λf:A→B. ? : (A→B) → (B→C) → A → C
λg:B→C. ? : (B→C) → A → C
λx:A. ? : A → C
g (f x) : C
g : B→C f x : B
f : A→B x : A
lam
lam
lam
app
app
λf:A→B. ? : (A→B) → (B→C) → A → C
λg:B→C. ? : (B→C) → A → C
λx:A. g (f x) : A → C
g (f x) : C
g : B→C f x : B
f : A→B x : A
lam
lam
lam
app
app
もう遷移にはしない。
• 二番目のlamの本体が確定。
λf:A→B. ? : (A→B) → (B→C) → A → C
λg:B→C. λx:A. (g (f x)) : (B→C) → A → C
λx:A. (g (f x)) : A → C
g (f x) : C
g : B→C f x : B
f : A→B x : A
lam
lam
lam
app
app
もう遷移にはしない。
• 最後のlamの本体が確定。
λf:A→B. λg:B→C. λx:A. (g (f x)) : (A→B) → (B→C) → A → C
λg:B→C. λx:A. (g (f x)) : (B→C) → A → C
λx:A. (g (f x)) : A → C
g (f x) : C
g : B→C f x : B
f : A→B x : A
lam
lam
lam
app
app
完成
• λf:A→B. λg:B→C. λx:A. (g (f x))が求める項。
– 型環境が必要な場合は、lamなどの規則に対応するものを下から順に作る。
λf:A→B. λg:B→C. λx:A. (g (f x)) : (A→B) → (B→C) → A → C
λg:B→C. λx:A. (g (f x)) : (B→C) → A → C
λx:A. (g (f x)) : A → C
g (f x) : C
g : B→C f x : B
f : A→B x : A
lam
lam
lam
app
app
ちょっと補足
• 変数は、関数の形をしていたらfやgをつけることが慣習上多い。
– 別に強制ではない。a,b,cでも可。
• 逆に、関数の形をしていない場合はxやyをつけることが多い。
– これまたあくまで多いだけ。