From e6473c383b479610cee4c0119e5811a12a938cf9 Mon Sep 17 00:00:00 2001 From: Josh Chen Date: Tue, 14 Aug 2018 17:43:03 +0200 Subject: Well-formation rules are back in the methods; new theory synthesizing the natural number predecessor function. --- scratch.thy | 158 ++++++++++++++++++++++++++---------------------------------- 1 file changed, 69 insertions(+), 89 deletions(-) (limited to 'scratch.thy') diff --git a/scratch.thy b/scratch.thy index 25d2ca7..8800b1a 100644 --- a/scratch.thy +++ b/scratch.thy @@ -1,101 +1,81 @@ +(* Title: HoTT/ex/Synthesis.thy + Author: Josh Chen + Date: Aug 2018 + +Examples of inhabitant synthesis. +*) + + theory scratch imports HoTT - begin -lemma - assumes "\x:A. B(x): U(i)" ": \x:A. B(x)" - shows "a : A" -proof -oops - - -abbreviation pred where "pred \ \<^bold>\n. ind\<^sub>\(\n c. n) 0 n" - -schematic_goal "?a: (pred`0) =\<^sub>\ 0" -apply (subst comp) -apply (rule Nat_intro) -prefer 2 apply (subst comp) -apply (rule Nat_form) -apply assumption -apply (rule Nat_intro) -apply (rule Equal_intro) -apply (rule Nat_intro) -apply (rule Nat_elim) -apply (rule Nat_form) -apply assumption -apply (rule Nat_intro1) -apply assumption -done -schematic_goal "?a : \n:\. (pred`(succ n)) =\<^sub>\ n" -apply (rule Prod_intro) -apply (rule Nat_form) -apply (subst comp) -apply (rule Nat_intro) -apply assumption -prefer 2 apply (subst comp) -apply (rule Nat_form) -apply assumption -apply (rule Nat_intro) -apply assumption -apply (rule Equal_intro) -apply assumption -apply (rule Nat_elim) -apply (rule Nat_form) -apply assumption -apply (rule Nat_intro) -apply assumption +section \Synthesis of the predecessor function\ + +text " + In this example we try, with the help of Isabelle, to synthesize a predecessor function for the natural numbers. + + This +" + +text " + First we show that the property we want is well-defined: +" + +lemma pred_welltyped: "\pred:\\\ . ((pred`0) =\<^sub>\ 0) \ (\n:\. (pred`(succ n)) =\<^sub>\ n): U(O)" +by simple + +text " + Now look for an inhabitant. + Observe that we're looking for a lambda term \pred\ satisfying \(pred`0) =\<^sub>\ 0\ and \\n:\. (pred`(succ n)) =\<^sub>\ n\. + What if we require **definitional** equality instead of just propositional equality? +" + +schematic_goal "?p`0 \ 0" and "\n. n: \ \ (?p`(succ n)) \ n" +apply (subst comp, rule Nat_rules) +prefer 3 apply (subst comp, rule Nat_rules) +prefer 3 apply (rule Nat_rules) +prefer 8 apply (rule Nat_rules | assumption)+ done -schematic_goal "?a : \p:\\\. \n:\. (p`(succ n)) =\<^sub>\ n" -apply (rule Sum_intro) -apply (rule Prod_form) -apply (rule Nat_form)+ -apply (rule Prod_form) -apply (rule Nat_form) -apply (rule Equal_form) -apply (rule Nat_form) -apply (rule Prod_elim) -apply assumption -apply (elim Nat_intro2) -apply assumption -prefer 2 apply (rule Prod_intro) -apply (rule Nat_form) -prefer 3 apply (rule Prod_intro) -apply (rule Nat_form)+ -prefer 3 apply (rule Nat_elim) -back -oops - - -(* Now try to derive pred directly *) -schematic_goal "?a : \pred:?A . ((pred`0) =\<^sub>\ 0) \ (\n:\. (pred`(succ n)) =\<^sub>\ n)" -(* At some point need to perform induction *) -apply (rule Sum_intro) -defer -apply (rule Sum_form) -apply (rule Equal_form) -apply (rule Nat_form) -apply (rule Prod_elim) -defer -apply (rule Nat_intro1)+ -prefer 5 apply assumption -prefer 4 apply (rule Prod_form) -apply (rule Nat_form)+ -apply (rule Prod_form) -apply (rule Nat_form) -apply (rule Equal_form) -apply (rule Nat_form) -apply (rule Prod_elim) -apply assumption -apply (rule Nat_intro2) -apply assumption+ -(* Now begins the hard part *) -prefer 2 apply (rule Sum_rules) -prefer 2 apply (rule Prod_rules) +text " + The above proof finds the candidate \\<^bold>\n. ind\<^sub>\ (\a b. a) n n\. + We prove this has the required type and properties. +" + +definition pred :: Term where "pred \ \<^bold>\n. ind\<^sub>\ (\a b. a) n n" + +lemma pred_type: "pred: \ \ \" unfolding pred_def by simple + +lemma pred_props: "\n. refl(n)>: ((pred`0) =\<^sub>\ 0) \ (\n:\. (pred`(succ n)) =\<^sub>\ n)" +proof (simple lem: pred_type) + have *: "pred`0 \ 0" unfolding pred_def + proof (subst comp) + show "\n. n: \ \ ind\<^sub>\ (\a b. a) n n: \" by simple + show "ind\<^sub>\ (\a b. a) 0 0 \ 0" + proof (rule Nat_comps) + show "\: U(O)" .. + qed simple + qed rule + then show "refl(0): (pred`0) =\<^sub>\ 0" by (subst *) simple + show "\<^bold>\n. refl(n): \n:\. (pred`(succ(n))) =\<^sub>\ n" + unfolding pred_def proof + show "\n. n: \ \ refl(n): ((\<^bold>\n. ind\<^sub>\ (\a b. a) n n)`succ(n)) =\<^sub>\ n" + proof (subst comp) + show "\n. n: \ \ ind\<^sub>\ (\a b. a) n n: \" by simple + show "\n. n: \ \ refl(n): ind\<^sub>\ (\a b. a) (succ n) (succ n) =\<^sub>\ n" + proof (subst comp) + show "\: U(O)" .. + qed simple + qed rule + qed rule +qed +theorem + "\n. refl(n)>>: \pred:\\\ . ((pred`0) =\<^sub>\ 0) \ (\n:\. (pred`(succ n)) =\<^sub>\ n)" +by (simple lem: pred_welltyped pred_type pred_props) end \ No newline at end of file -- cgit v1.2.3