SICPのEx 2.4 をCoqで解いてみた
SICPを読んでいたら 検証せよ という問題があったので、Coqで検証してみた。
問題はペア構造のチャーチエンコーディングの話。
Scheme (untyped λ) に比べて Coq (λC) は型が厳格なので、問題の定式化がちょっと大変だったけど、問題自体は簡単に証明できた。
CoqのコードからSchemeのコードを出力してみたら、問題で与えられているコードとだいたい一緒だったから大丈夫だろう。
Section SICP_EX_2_4. (* このセクションで使う二つの型 A, B を仮定する *) Variable A B : Type. Definition pair (X:Type) : Type := (A->B->X) -> X. Definition cons (X:Type) (x:A) (y:B) : pair X := (fun m => m x y). Implicit Arguments cons [X]. Definition car (z: pair A) : A := z (fun p q => p). (* Exercise 2.4 その1 任意の引数 x y に対して car (cons x y) が x となる事を検証する *) Theorem exercise_2_4_car : forall x y, car (cons x y) = x. Proof. auto. Qed. Definition cdr (z: pair B) : B := z (fun p q => q). (* Exercise 2.4 その2 任意の引数 x y に対して cdr (cons x y) が y となる事を検証する *) Theorem exercise_2_4_cdr : forall x y, cdr (cons x y) = y. Proof. auto. Qed. End SICP_EX_2_4. Extraction Language Scheme. Extraction cons. Extraction car. Extraction cdr.
コンパイル結果 (Coq 8.1 pl2)
(define cons (lambdas (x y m) (@ m x y))) (define car0 (lambda (z) (z (lambdas (p q) p)))) (define cdr0 (lambda (z) (z (lambdas (p q) q))))