From 69bf0744a5ce3ba144f59564ebf74d7d2f56b748 Mon Sep 17 00:00:00 2001 From: Josh Chen Date: Mon, 15 Jun 2020 11:52:19 +0200 Subject: rename folders --- spartan/lib/List.thy | 192 +++++++++++++++++++++++++++++++++++++++++++++ spartan/lib/Maybe.thy | 76 ++++++++++++++++++ spartan/lib/More_Types.thy | 104 ++++++++++++++++++++++++ 3 files changed, 372 insertions(+) create mode 100644 spartan/lib/List.thy create mode 100644 spartan/lib/Maybe.thy create mode 100644 spartan/lib/More_Types.thy (limited to 'spartan/lib') diff --git a/spartan/lib/List.thy b/spartan/lib/List.thy new file mode 100644 index 0000000..1798a23 --- /dev/null +++ b/spartan/lib/List.thy @@ -0,0 +1,192 @@ +chapter \Lists\ + +theory List +imports Maybe + +begin + +(*TODO: Inductive type and recursive function definitions. The ad-hoc + axiomatization below should be subsumed once general inductive types are + properly implemented.*) + +axiomatization + List :: \o \ o\ and + nil :: \o \ o\ and + cons :: \o \ o \ o \ o\ and + ListInd :: \o \ (o \ o) \ o \ (o \ o \ o \ o) \ o \ o\ +where + ListF: "A: U i \ List A: U i" and + + List_nil: "A: U i \ nil A: List A" and + + List_cons: "\x: A; xs: List A\ \ cons A x xs: List A" and + + ListE: "\ + xs: List A; + c\<^sub>0: C (nil A); + \x xs rec. \x: A; xs: List A; rec: C xs\ \ f x xs rec: C (cons A x xs); + \xs. xs: List A \ C xs: U i + \ \ ListInd A (\xs. C xs) c\<^sub>0 (\x xs rec. f x xs rec) xs: C xs" and + + List_comp_nil: "\ + c\<^sub>0: C (nil A); + \x xs rec. \x: A; xs: List A; rec: C xs\ \ f x xs rec: C (cons A x xs); + \xs. xs: List A \ C xs: U i + \ \ ListInd A (\xs. C xs) c\<^sub>0 (\x xs rec. f x xs rec) (nil A) \ c\<^sub>0" and + + List_comp_cons: "\ + xs: List A; + c\<^sub>0: C (nil A); + \x xs rec. \x: A; xs: List A; rec: C xs\ \ f x xs rec: C (cons A x xs); + \xs. xs: List A \ C xs: U i + \ \ + ListInd A (\xs. C xs) c\<^sub>0 (\x xs rec. f x xs rec) (cons A x xs) \ + f x xs (ListInd A (\xs. C xs) c\<^sub>0 (\x xs rec. f x xs rec) xs)" + +lemmas + [intros] = ListF List_nil List_cons and + [elims "?xs"] = ListE and + [comps] = List_comp_nil List_comp_cons + +abbreviation "ListRec A C \ ListInd A (\_. C)" + +Lemma (derive) ListCase: + assumes + "xs: List A" and + nil_case: "c\<^sub>0: C (nil A)" and + cons_case: "\x xs. \x: A; xs: List A\ \ f x xs: C (cons A x xs)" and + "\xs. xs: List A \ C xs: U i" + shows "?List_cases A (\xs. C xs) c\<^sub>0 (\x xs. f x xs) xs: C xs" + by (elim xs) (fact nil_case, rule cons_case) + +lemmas List_cases [cases] = ListCase[unfolded ListCase_def] + + +section \Notation\ + +definition nil_i ("[]") + where [implicit]: "[] \ nil ?" + +definition cons_i (infixr "#" 120) + where [implicit]: "x # xs \ cons ? x xs" + +translations + "[]" \ "CONST List.nil A" + "x # xs" \ "CONST List.cons A x xs" +syntax + "_list" :: \args \ o\ ("[_]") +translations + "[x, xs]" \ "x # [xs]" + "[x]" \ "x # []" + + +section \Standard functions\ + +subsection \Head and tail\ + +Lemma (derive) head: + assumes "A: U i" "xs: List A" + shows "Maybe A" +proof (cases xs) + show "none: Maybe A" by intro + show "\x. x: A \ some x: Maybe A" by intro +qed + +Lemma (derive) tail: + assumes "A: U i" "xs: List A" + shows "List A" +proof (cases xs) + show "[]: List A" by intro + show "\xs. xs: List A \ xs: List A" . +qed + +definition head_i ("head") where [implicit]: "head xs \ List.head ? xs" +definition tail_i ("tail") where [implicit]: "tail xs \ List.tail ? xs" + +translations + "head" \ "CONST List.head A" + "tail" \ "CONST List.tail A" + +Lemma head_type [typechk]: + assumes "A: U i" "xs: List A" + shows "head xs: Maybe A" + unfolding head_def by typechk + +Lemma head_of_cons [comps]: + assumes "A: U i" "x: A" "xs: List A" + shows "head (x # xs) \ some x" + unfolding head_def ListCase_def by reduce + +Lemma tail_type [typechk]: + assumes "A: U i" "xs: List A" + shows "tail xs: List A" + unfolding tail_def by typechk + +Lemma tail_of_cons [comps]: + assumes "A: U i" "x: A" "xs: List A" + shows "tail (x # xs) \ xs" + unfolding tail_def ListCase_def by reduce + +subsection \Append\ + +Lemma (derive) app: + assumes "A: U i" "xs: List A" "ys: List A" + shows "List A" + apply (elim xs) + \ by (fact \ys:_\) + \ prems vars x _ rec + proof - show "x # rec: List A" by typechk qed + done + +definition app_i ("app") where [implicit]: "app xs ys \ List.app ? xs ys" + +translations "app" \ "CONST List.app A" + +subsection \Map\ + +Lemma (derive) map: + assumes "A: U i" "B: U i" "f: A \ B" "xs: List A" + shows "List B" +proof (elim xs) + show "[]: List B" by intro + next fix x ys + assume "x: A" "ys: List B" + show "f x # ys: List B" by typechk +qed + +definition map_i ("map") where [implicit]: "map \ List.map ? ?" + +translations "map" \ "CONST List.map A B" + +Lemma map_type [typechk]: + assumes "A: U i" "B: U i" "f: A \ B" "xs: List A" + shows "map f xs: List B" + unfolding map_def by typechk + + +subsection \Reverse\ + +Lemma (derive) rev: + assumes "A: U i" "xs: List A" + shows "List A" + apply (elim xs) + \ by (rule List_nil) + \ prems vars x _ rec proof - show "app rec [x]: List A" by typechk qed + done + +definition rev_i ("rev") where [implicit]: "rev \ List.rev ?" + +translations "rev" \ "CONST List.rev A" + +Lemma rev_type [typechk]: + assumes "A: U i" "xs: List A" + shows "rev xs: List A" + unfolding rev_def by typechk + +Lemma rev_nil [comps]: + assumes "A: U i" + shows "rev (nil A) \ nil A" + unfolding rev_def by reduce + + +end diff --git a/spartan/lib/Maybe.thy b/spartan/lib/Maybe.thy new file mode 100644 index 0000000..1efbb95 --- /dev/null +++ b/spartan/lib/Maybe.thy @@ -0,0 +1,76 @@ +chapter \Maybe type\ + +theory Maybe +imports More_Types + +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+ + +Lemma (derive) 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 "?MaybeInd A (\m. C m) c\<^sub>0 (\a. f a) m: C m" + supply assms[unfolded Maybe_def none_def some_def] + apply (elim m) + \ unfolding Maybe_def . + \ by (rule \_ \ _: C (inl _ _ _)\) + \ by elim (rule \_: C (inr _ _ _)\) + 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 (\m. C m) c\<^sub>0 (\a. f a) (none A) \ c\<^sub>0" + supply assms[unfolded Maybe_def some_def none_def] + unfolding MaybeInd_def none_def by reduce + +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 (\m. C m) c\<^sub>0 (\a. f a) (some A a) \ f a" + supply assms[unfolded Maybe_def some_def none_def] + unfolding MaybeInd_def some_def by (reduce add: Maybe_def) + +lemmas + [intros] = MaybeF Maybe_none Maybe_some and + [comps] = Maybe_comp_none Maybe_comp_some and + MaybeE [elims "?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 diff --git a/spartan/lib/More_Types.thy b/spartan/lib/More_Types.thy new file mode 100644 index 0000000..1d7abb9 --- /dev/null +++ b/spartan/lib/More_Types.thy @@ -0,0 +1,104 @@ +chapter \Some standard types\ + +theory More_Types +imports Spartan + +begin + +section \Sum type\ + +axiomatization + Sum :: \o \ o \ o\ and + inl :: \o \ o \ o \ o\ and + inr :: \o \ o \ o \ o\ and + SumInd :: \o \ o \ (o \ o) \ (o \ o) \ (o \ o) \ o \ o\ + +notation Sum (infixl "\" 50) + +axiomatization where + SumF: "\A: U i; B: U i\ \ A \ B: U i" and + + Sum_inl: "\a: A; B: U i\ \ inl A B a: A \ B" and + + Sum_inr: "\b: B; A: U i\ \ inr A B b: A \ B" and + + SumE: "\ + s: A \ B; + \s. s: A \ B \ C s: U i; + \a. a: A \ c a: C (inl A B a); + \b. b: B \ d b: C (inr A B b) + \ \ SumInd A B (\s. C s) (\a. c a) (\b. d b) s: C s" and + + Sum_comp_inl: "\ + a: A; + \s. s: A \ B \ C s: U i; + \a. a: A \ c a: C (inl A B a); + \b. b: B \ d b: C (inr A B b) + \ \ SumInd A B (\s. C s) (\a. c a) (\b. d b) (inl A B a) \ c a" and + + Sum_comp_inr: "\ + b: B; + \s. s: A \ B \ C s: U i; + \a. a: A \ c a: C (inl A B a); + \b. b: B \ d b: C (inr A B b) + \ \ SumInd A B (\s. C s) (\a. c a) (\b. d b) (inr A B b) \ d b" + +lemmas + [intros] = SumF Sum_inl Sum_inr and + [elims ?s] = SumE and + [comps] = Sum_comp_inl Sum_comp_inr + +method left = rule Sum_inl +method right = rule Sum_inr + + +section \Empty and unit types\ + +axiomatization + Top :: \o\ and + tt :: \o\ and + TopInd :: \(o \ o) \ o \ o \ o\ +and + Bot :: \o\ and + BotInd :: \(o \ o) \ o \ o\ + +notation Top ("\") and Bot ("\") + +axiomatization where + TopF: "\: U i" and + + TopI: "tt: \" and + + TopE: "\a: \; \x. x: \ \ C x: U i; c: C tt\ \ TopInd (\x. C x) c a: C a" and + + Top_comp: "\\x. x: \ \ C x: U i; c: C tt\ \ TopInd (\x. C x) c tt \ c" +and + BotF: "\: U i" and + + BotE: "\x: \; \x. x: \ \ C x: U i\ \ BotInd (\x. C x) x: C x" + +lemmas + [intros] = TopF TopI BotF and + [elims ?a] = TopE and + [elims ?x] = BotE and + [comps] = Top_comp + + +section \Booleans\ + +definition "Bool \ \ \ \" +definition "true \ inl \ \ tt" +definition "false \ inr \ \ tt" + +Lemma + BoolF: "Bool: U i" and + Bool_true: "true: Bool" and + Bool_false: "false: Bool" + unfolding Bool_def true_def false_def by typechk+ + +lemmas [intros] = BoolF Bool_true Bool_false + +\ \Can define if-then-else etc.\ + + +end -- cgit v1.2.3