chapter \Maybe type\ theory Maybe imports Prelude begin text \Defined as a sum.\ definition "Maybe A \ A \ \" definition "none A \ inr A \ tt" definition "some A a \ inl A \ a" lemma MaybeF: "A: U i \ Maybe A: U i" and Maybe_none: "A: U i \ none A: Maybe A" and Maybe_some: "a: A \ some A a: Maybe A" unfolding Maybe_def none_def some_def by typechk+ Definition MaybeInd: assumes "A: U i" "\m. m: Maybe A \ C m: U i" "c\<^sub>0: C (none A)" "\a. a: A \ f a: C (some A a)" "m: Maybe A" shows "C m" using assms[unfolded Maybe_def none_def some_def, type] apply (elim m) apply fact apply (elim, fact) done Lemma Maybe_comp_none: assumes "A: U i" "c\<^sub>0: C (none A)" "\a. a: A \ f a: C (some A a)" "\m. m: Maybe A \ C m: U i" shows "MaybeInd A C c\<^sub>0 f (none A) \ c\<^sub>0" using assms unfolding Maybe_def MaybeInd_def none_def some_def by compute Lemma Maybe_comp_some: assumes "A: U i" "a: A" "c\<^sub>0: C (none A)" "\a. a: A \ f a: C (some A a)" "\m. m: Maybe A \ C m: U i" shows "MaybeInd A C c\<^sub>0 f (some A a) \ f a" using assms unfolding Maybe_def MaybeInd_def none_def some_def by compute lemmas [form] = MaybeF and [intr, intro] = Maybe_none Maybe_some and [comp] = Maybe_comp_none Maybe_comp_some and MaybeE [elim "?m"] = MaybeInd[rotated 4] lemmas Maybe_cases [cases] = MaybeE abbreviation "MaybeRec A C \ MaybeInd A (K C)" definition none_i ("none") where [implicit]: "none \ Maybe.none {}" definition some_i ("some") where [implicit]: "some a \ Maybe.some {} a" translations "none" \ "CONST Maybe.none A" "some a" \ "CONST Maybe.some A a" end