From 07c51b1801bd701bef61cedd571a944d9bd37e8b Mon Sep 17 00:00:00 2001 From: Josh Chen Date: Wed, 8 Jul 2020 15:55:48 +0200 Subject: 1. Initial `Definition` keyword. 2. ifelse. --- spartan/core/Spartan.thy | 25 +++++++++++------------ spartan/core/goals.ML | 9 +++++++++ spartan/lib/List.thy | 18 ++++++++--------- spartan/lib/Maybe.thy | 2 +- spartan/lib/More_Types.thy | 50 ++++++++++++++++++++++++++++++++++++++++++---- 5 files changed, 76 insertions(+), 28 deletions(-) diff --git a/spartan/core/Spartan.thy b/spartan/core/Spartan.thy index 0a5fe4c..ed21934 100644 --- a/spartan/core/Spartan.thy +++ b/spartan/core/Spartan.thy @@ -6,7 +6,7 @@ imports "HOL-Eisbach.Eisbach" "HOL-Eisbach.Eisbach_Tools" keywords - "Theorem" "Lemma" "Corollary" "Proposition" :: thy_goal_stmt and + "Theorem" "Lemma" "Corollary" "Proposition" "Definition" :: thy_goal_stmt and "focus" "\" "\<^item>" "\<^enum>" "~" :: prf_script_goal % "proof" and "congruence" "print_coercions" :: thy_decl and "rhs" "derive" "prems" "vars" :: quasi_command @@ -150,28 +150,29 @@ axiomatization where \ \ \x: A. B x \ \x: A. B' x" -section \Proof commands\ +section \Infrastructure\ + +ML_file \lib.ML\ +ML_file \types.ML\ + +subsection \Proof commands\ named_theorems typechk -ML_file \lib.ML\ ML_file \goals.ML\ ML_file \focus.ML\ -ML_file \types.ML\ - -section \Congruence automation\ +subsection \Congruence automation\ consts "rhs" :: \'a\ ("..") ML_file \congruence.ML\ - -section \Methods\ - ML_file \elimination.ML\ \ \elimination rules\ ML_file \cases.ML\ \ \case reasoning rules\ +subsection \Methods\ + named_theorems intros and comps lemmas [intros] = PiF PiI SigF SigI and @@ -275,8 +276,7 @@ setup \map_theory_simpset (fn ctxt => ctxt addSolver (mk_solver "" typechk method reduce uses add = (simp add: comps add | subst comps)+ - -section \Implicit notations\ +subsection \Implicits\ text \ \?\ is used to mark implicit arguments in definitions, while \{}\ is expanded @@ -301,8 +301,7 @@ text \Automatically insert inhabitation judgments where needed:\ syntax inhabited :: \o \ prop\ ("(_)") translations "inhabited A" \ "CONST has_type {} A" - -section \Lambda coercion\ +subsection \Lambda coercion\ \ \Coerce object lambdas to meta-lambdas\ abbreviation (input) lambda :: \o \ o \ o\ diff --git a/spartan/core/goals.ML b/spartan/core/goals.ML index 9f394f0..4b53a7f 100644 --- a/spartan/core/goals.ML +++ b/spartan/core/goals.ML @@ -204,11 +204,20 @@ fun theorem spec descr = schematic_theorem_cmd (case opt_derive of SOME "derive" => true | _ => false) long descr NONE (K I) binding includes elems concl)) + +fun definition spec descr = + Outer_Syntax.local_theory_to_proof' spec "definition via proof" + ((long_statement || short_statement) >> + (fn (long, binding, includes, elems, concl) => schematic_theorem_cmd + true long descr NONE (K I) binding includes elems concl)) + + in val _ = theorem \<^command_keyword>\Theorem\ "Theorem" val _ = theorem \<^command_keyword>\Lemma\ "Lemma" val _ = theorem \<^command_keyword>\Corollary\ "Corollary" val _ = theorem \<^command_keyword>\Proposition\ "Proposition" +val _ = definition \<^command_keyword>\Definition\ "Definition" end diff --git a/spartan/lib/List.thy b/spartan/lib/List.thy index 1798a23..11b8406 100644 --- a/spartan/lib/List.thy +++ b/spartan/lib/List.thy @@ -50,7 +50,7 @@ lemmas abbreviation "ListRec A C \ ListInd A (\_. C)" -Lemma (derive) ListCase: +Lemma list_cases [cases]: assumes "xs: List A" and nil_case: "c\<^sub>0: C (nil A)" and @@ -59,8 +59,6 @@ Lemma (derive) ListCase: 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\ @@ -84,7 +82,7 @@ section \Standard functions\ subsection \Head and tail\ -Lemma (derive) head: +Definition head: assumes "A: U i" "xs: List A" shows "Maybe A" proof (cases xs) @@ -92,7 +90,7 @@ proof (cases xs) show "\x. x: A \ some x: Maybe A" by intro qed -Lemma (derive) tail: +Definition tail: assumes "A: U i" "xs: List A" shows "List A" proof (cases xs) @@ -115,7 +113,7 @@ Lemma head_type [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 + unfolding head_def by reduce Lemma tail_type [typechk]: assumes "A: U i" "xs: List A" @@ -125,11 +123,11 @@ Lemma tail_type [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 + unfolding tail_def by reduce subsection \Append\ -Lemma (derive) app: +Definition app: assumes "A: U i" "xs: List A" "ys: List A" shows "List A" apply (elim xs) @@ -144,7 +142,7 @@ translations "app" \ "CONST List.app A" subsection \Map\ -Lemma (derive) map: +Definition map: assumes "A: U i" "B: U i" "f: A \ B" "xs: List A" shows "List B" proof (elim xs) @@ -166,7 +164,7 @@ Lemma map_type [typechk]: subsection \Reverse\ -Lemma (derive) rev: +Definition rev: assumes "A: U i" "xs: List A" shows "List A" apply (elim xs) diff --git a/spartan/lib/Maybe.thy b/spartan/lib/Maybe.thy index 1efbb95..6729812 100644 --- a/spartan/lib/Maybe.thy +++ b/spartan/lib/Maybe.thy @@ -17,7 +17,7 @@ lemma Maybe_some: "a: A \ some A a: Maybe A" unfolding Maybe_def none_def some_def by typechk+ -Lemma (derive) MaybeInd: +Definition MaybeInd: assumes "A: U i" "\m. m: Maybe A \ C m: U i" diff --git a/spartan/lib/More_Types.thy b/spartan/lib/More_Types.thy index 1d7abb9..38ba2aa 100644 --- a/spartan/lib/More_Types.thy +++ b/spartan/lib/More_Types.thy @@ -1,5 +1,3 @@ -chapter \Some standard types\ - theory More_Types imports Spartan @@ -96,9 +94,53 @@ Lemma Bool_false: "false: Bool" unfolding Bool_def true_def false_def by typechk+ -lemmas [intros] = BoolF Bool_true Bool_false +\ \Definitions like these should be handled by a future function package\ +Definition ifelse [rotated 1]: + assumes *[unfolded Bool_def true_def false_def]: + "\x. x: Bool \ C x: U i" + "x: Bool" + "a: C true" + "b: C false" + shows "C x" + by (elim x) (elim, rule *)+ + +Lemma if_true: + assumes + "\x. x: Bool \ C x: U i" + "a: C true" + "b: C false" + shows "ifelse C true a b \ a" + unfolding ifelse_def true_def + supply assms[unfolded Bool_def true_def false_def] + by reduce + +Lemma if_false: + assumes + "\x. x: Bool \ C x: U i" + "a: C true" + "b: C false" + shows "ifelse C false a b \ b" + unfolding ifelse_def false_def + supply assms[unfolded Bool_def true_def false_def] + by reduce + +lemmas + [intros] = BoolF Bool_true Bool_false and + [comps] = if_true if_false and + [elims ?x] = ifelse +lemmas + BoolE = ifelse + +subsection \Notation\ + +definition ifelse_i ("if _ then _ else _") + where [implicit]: "if x then a else b \ ifelse ? x a b" + +no_translations "if x then a else b" \ "CONST ifelse C x a b" + +subsection \Logical connectives\ -\ \Can define if-then-else etc.\ +definition not ("!_") where "not x \ ifelse (K Bool) x false true" end -- cgit v1.2.3