証明しながらプログラミングしてみよう From mathcomp Require Import ssreflect. Variables A B C : Type. Hypothesis HA_to_B : A -> B. (* 仮定A -> B *) Hypothesis HB_to_C : B -> C. (* 仮定B -> C *) HA_to_Bは A型を受け取ってB型を返す関数 であり AならばBという仮定 HB_to_Cも B型を受け取ってC型を返す関数 であり BならばCという仮定 8
生成されたプログラム max = fun x y : nat => ((if y <=? x as b return ((y <=? x) = b -> nat) then fun _ : (y <=? x) = true => x else fun _ : (y <=? x) = false => y) : (y <=? x) = (y <=? x) -> nat) eq_refl : nat -> nat -> nat 16
ちょっと型エラーが出るので余計なやつを削り・・・ Definition max' := fun x y : nat => if y <=? x as b return ((y <=? x) = b -> nat) (* returnの後のは型が書いてあります *) then fun _ : (y <=? x) = true => x (* trueの場合、xを返す *) else fun _ : (y <=? x) = false => y. (* falseの場合、yを返す *) 実行! Eval compute in max' 3 2 _. (* = 3 : nat *) 17