14. はじめに ゼミ 授業 おわりに
Coq 楽しいよ Coq
ICFP2009 の B. C. Pierce の招待講演
“Lambda, the Ultimate TA: Using a Proof Assistant
to Teach Programming Language Foundations”
from
Theory of PL for PL geeks
to
Software Foundation to the masses
http://www.cis.upenn.edu/~bcpierce/sf
にわとりかんさつにっき in お茶大 9/24
17. はじめに ゼミ 授業 おわりに
factorial 関数 (CPS)
let rec fac n =
if n <= 0 then 1
else n * fac ( n - 1 )
let rec fac_cps n k =
if n <= 0 then k 1
else
fac_cps ( n - 1 ) ( fun x - > k ( n * x ) )
let main n = fac_cps n ( fun x - > x )
にわとりかんさつにっき in お茶大 12/24
18. はじめに ゼミ 授業 おわりに
factorial 関数 (非関数化)
type cont = C0 | C1 of int * cont
let rec apply k x = match k with
| C0 - > x
| C1 (n , k ) - > apply k ( n * x )
let rec fac_defunc n k =
if n <= 0 then apply k 1
else fac_defunc ( n - 1 ) ( C1 (n , k ) )
let main n = fac_defunc n C0
にわとりかんさつにっき in お茶大 13/24
19. y
はじめに ゼミ 授業 おわりに
時折出る無茶振り (?)
~
じゃ、正当性の
証明は Coq で。
にわとりかんさつにっき in お茶大 14/24
22. はじめに ゼミ 授業 おわりに
CPS 変換の正当性 (factorial)
Theorem
∀n ∈ N, f acds n = f accps n id
にわとりかんさつにっき in お茶大 16/24
23. はじめに ゼミ 授業 おわりに
CPS 変換の正当性 (factorial)
Theorem
∀n ∈ N, f acds n = f accps n id
Lemma
∀n ∈ N, k ∈ N → N,
k (f acds n) = f accps n k
証明: n に関する帰納法
にわとりかんさつにっき in お茶大 16/24
24. はじめに ゼミ 授業 おわりに
CPS 変換の正当性 (factorial)
Theorem
∀n ∈ N, f acds n = f accps n id
Lemma
∀n ∈ N, k ∈ N → N,
k (f acds n) = f accps n k
証明: n に関する帰納法
上の定理は k = id にすれば示せる
にわとりかんさつにっき in お茶大 16/24
25. はじめに ゼミ 授業 おわりに
非関数化の正当性 (factorial)
Theorem
∀n ∈ N, f accps n id = f acdef unc n C0
にわとりかんさつにっき in お茶大 17/24
26. はじめに ゼミ 授業 おわりに
非関数化の正当性 (factorial)
Theorem
∀n ∈ N, f accps n id = f acdef unc n C0
Lemma
∀n ∈ N, k ∈ N → N, c ∈ cont,
(∀a ∈ N, k a = apply c a) → f accps n k = f acdef unc n c
証明: n に関する帰納法
にわとりかんさつにっき in お茶大 17/24
27. はじめに ゼミ 授業 おわりに
非関数化の正当性 (factorial)
Theorem
∀n ∈ N, f accps n id = f acdef unc n C0
Lemma
∀n ∈ N, k ∈ N → N, c ∈ cont,
(∀a ∈ N, k a = apply c a) → f accps n k = f acdef unc n c
証明: n に関する帰納法
上の定理は k = id,c = C0 に
すれば示せる
にわとりかんさつにっき in お茶大 17/24
28. はじめに ゼミ 授業 おわりに
CPS 変換 & 非関数化の正当性 (fibonacci)
let rec fib n =
if n <= 1 then 1
else fib ( n - 1 ) + fib ( n - 2 )
定式化: ほぼ factorial と同じ格好
証明: well founded induction で頑張る
にわとりかんさつにっき in お茶大 18/24
29. はじめに ゼミ 授業 おわりに
CPS 変換 & 非関数化の正当性 (fibonacci)
let rec fib n =
if n <= 1 then 1
else fib ( n - 1 ) + fib ( n - 2 )
定式化: ほぼ factorial と同じ格好
証明: well founded induction で頑張る
?? 非関数化すると apply 関数と相互再帰の形になり
Coq で上手く定義出来ない ... (証明も美しくない)
にわとりかんさつにっき in お茶大 18/24
30. はじめに ゼミ 授業 おわりに
fibonacci (CPS, OCaml)
let rec fib_cps n k =
if n < 2 then k 1
else
fib_cps ( n - 1 ) ( fun x - >
fib_cps ( n - 2 ) ( fun y - > k ( x + y ) ) )
にわとりかんさつにっき in お茶大 19/24
31. はじめに ゼミ 授業 おわりに
fibonacci (defunctionalized, OCaml)
type cont =
| C0
| C1 of int * cont_t
| C2 of int * cont_t
let rec apply k x = match k with
| C0 - > x
| C1 (n , k ) - >
fib_defunc ( n - 2 ) ( C2 (x , k ) )
| C2 ( n1 , k ) - > apply k ( n1 + x )
and fib_defunc n k =
if n < 2 then apply k 1
else fib_defunc ( n - 1 ) ( C1 (n , k ) )
にわとりかんさつにっき in お茶大 20/24
32. はじめに ゼミ 授業 おわりに
fibonacci (Coq)
Fixpoint app ( k : cont_fib ) ( x : nat ) ( count : nat )
{ struct count } : option nat : =
match count with
| O = > None
| S count ’ = >
match k with
| C0_fib = > Some x
| C1_fib n k = >
fib_defunc ( minus n 1 ) ( C2_fib x k ) count ’
| C2_fib n1 k = > app k ( plus n1 x ) count ’
end
end
with fib_defunc ( n : nat ) ( k : cont_fib ) ( count : nat )
{ struct count } : option nat : =
match count with
| O = > None
| S count ’ = >
match n with
| O | S O = > app k 1 count ’
| S m = > fib_defunc m ( C1_fib m k ) count ’
end
end .
にわとりかんさつにっき in お茶大 21/24