| author | wenzelm | 
| Sun, 26 Mar 2023 15:02:08 +0200 | |
| changeset 77714 | be0b9396604e | 
| parent 69913 | ca515cf61651 | 
| child 81332 | f94b30fa2b6c | 
| permissions | -rw-r--r-- | 
| 62692 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 1 | (* Title: HOL/Library/BNF_Corec.thy | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 2 | Author: Jasmin Blanchette, Inria, LORIA, MPII | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 3 | Author: Aymeric Bouzy, Ecole polytechnique | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 4 | Author: Dmitriy Traytel, ETH Zurich | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 5 | Copyright 2015, 2016 | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 6 | |
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 7 | Generalized corecursor sugar ("corec" and friends).
 | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 8 | *) | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 9 | |
| 62700 | 10 | section \<open>Generalized Corecursor Sugar (corec and friends)\<close> | 
| 62692 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 11 | |
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 12 | theory BNF_Corec | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 13 | imports Main | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 14 | keywords | 
| 69913 | 15 | "corec" :: thy_defn and | 
| 16 | "corecursive" :: thy_goal_defn and | |
| 17 | "friend_of_corec" :: thy_goal_defn and | |
| 62692 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 18 | "coinduction_upto" :: thy_decl | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 19 | begin | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 20 | |
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 21 | lemma obj_distinct_prems: "P \<longrightarrow> P \<longrightarrow> Q \<Longrightarrow> P \<Longrightarrow> Q" | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 22 | by auto | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 23 | |
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 24 | lemma inject_refine: "g (f x) = x \<Longrightarrow> g (f y) = y \<Longrightarrow> f x = f y \<longleftrightarrow> x = y" | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 25 | by (metis (no_types)) | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 26 | |
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 27 | lemma convol_apply: "BNF_Def.convol f g x = (f x, g x)" | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 28 | unfolding convol_def .. | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 29 | |
| 67399 | 30 | lemma Grp_UNIV_id: "BNF_Def.Grp UNIV id = (=)" | 
| 62692 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 31 | unfolding BNF_Def.Grp_def by auto | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 32 | |
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 33 | lemma sum_comp_cases: | 
| 67091 | 34 | assumes "f \<circ> Inl = g \<circ> Inl" and "f \<circ> Inr = g \<circ> Inr" | 
| 62692 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 35 | shows "f = g" | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 36 | proof (rule ext) | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 37 | fix a show "f a = g a" | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 38 | using assms unfolding comp_def fun_eq_iff by (cases a) auto | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 39 | qed | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 40 | |
| 67091 | 41 | lemma case_sum_Inl_Inr_L: "case_sum (f \<circ> Inl) (f \<circ> Inr) = f" | 
| 62692 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 42 | by (metis case_sum_expand_Inr') | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 43 | |
| 67091 | 44 | lemma eq_o_InrI: "\<lbrakk>g \<circ> Inl = h; case_sum h f = g\<rbrakk> \<Longrightarrow> f = g \<circ> Inr" | 
| 62692 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 45 | by (auto simp: fun_eq_iff split: sum.splits) | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 46 | |
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 47 | lemma id_bnf_o: "BNF_Composition.id_bnf \<circ> f = f" | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 48 | unfolding BNF_Composition.id_bnf_def by (rule o_def) | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 49 | |
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 50 | lemma o_id_bnf: "f \<circ> BNF_Composition.id_bnf = f" | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 51 | unfolding BNF_Composition.id_bnf_def by (rule o_def) | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 52 | |
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 53 | lemma if_True_False: | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 54 | "(if P then True else Q) \<longleftrightarrow> P \<or> Q" | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 55 | "(if P then False else Q) \<longleftrightarrow> \<not> P \<and> Q" | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 56 | "(if P then Q else True) \<longleftrightarrow> \<not> P \<or> Q" | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 57 | "(if P then Q else False) \<longleftrightarrow> P \<and> Q" | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 58 | by auto | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 59 | |
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 60 | lemma if_distrib_fun: "(if c then f else g) x = (if c then f x else g x)" | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 61 | by simp | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 62 | |
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 63 | |
| 62700 | 64 | subsection \<open>Coinduction\<close> | 
| 62692 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 65 | |
| 67091 | 66 | lemma eq_comp_compI: "a \<circ> b = f \<circ> x \<Longrightarrow> x \<circ> c = id \<Longrightarrow> f = a \<circ> (b \<circ> c)" | 
| 62692 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 67 | unfolding fun_eq_iff by simp | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 68 | |
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 69 | lemma self_bounded_weaken_left: "(a :: 'a :: semilattice_inf) \<le> inf a b \<Longrightarrow> a \<le> b" | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 70 | by (erule le_infE) | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 71 | |
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 72 | lemma self_bounded_weaken_right: "(a :: 'a :: semilattice_inf) \<le> inf b a \<Longrightarrow> a \<le> b" | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 73 | by (erule le_infE) | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 74 | |
| 67613 | 75 | lemma symp_iff: "symp R \<longleftrightarrow> R = R\<inverse>\<inverse>" | 
| 62692 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 76 | by (metis antisym conversep.cases conversep_le_swap predicate2I symp_def) | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 77 | |
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 78 | lemma equivp_inf: "\<lbrakk>equivp R; equivp S\<rbrakk> \<Longrightarrow> equivp (inf R S)" | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 79 | unfolding equivp_def inf_fun_def inf_bool_def by metis | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 80 | |
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 81 | lemma vimage2p_rel_prod: | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 82 | "(\<lambda>x y. rel_prod R S (BNF_Def.convol f1 g1 x) (BNF_Def.convol f2 g2 y)) = | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 83 | (inf (BNF_Def.vimage2p f1 f2 R) (BNF_Def.vimage2p g1 g2 S))" | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 84 | unfolding vimage2p_def rel_prod.simps convol_def by auto | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 85 | |
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 86 | lemma predicate2I_obj: "(\<forall>x y. P x y \<longrightarrow> Q x y) \<Longrightarrow> P \<le> Q" | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 87 | by auto | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 88 | |
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 89 | lemma predicate2D_obj: "P \<le> Q \<Longrightarrow> P x y \<longrightarrow> Q x y" | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 90 | by auto | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 91 | |
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 92 | locale cong = | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 93 |   fixes rel :: "('a \<Rightarrow> 'a \<Rightarrow> bool) \<Rightarrow> ('b \<Rightarrow> 'b \<Rightarrow> bool)"
 | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 94 | and eval :: "'b \<Rightarrow> 'a" | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 95 |     and retr :: "('a \<Rightarrow> 'a \<Rightarrow> bool) \<Rightarrow> ('a \<Rightarrow> 'a \<Rightarrow> bool)"
 | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 96 | assumes rel_mono: "\<And>R S. R \<le> S \<Longrightarrow> rel R \<le> rel S" | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 97 | and equivp_retr: "\<And>R. equivp R \<Longrightarrow> equivp (retr R)" | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 98 | and retr_eval: "\<And>R x y. \<lbrakk>(rel_fun (rel R) R) eval eval; rel (inf R (retr R)) x y\<rbrakk> \<Longrightarrow> | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 99 | retr R (eval x) (eval y)" | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 100 | begin | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 101 | |
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 102 | definition cong :: "('a \<Rightarrow> 'a \<Rightarrow> bool) \<Rightarrow> bool" where
 | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 103 | "cong R \<equiv> equivp R \<and> (rel_fun (rel R) R) eval eval" | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 104 | |
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 105 | lemma cong_retr: "cong R \<Longrightarrow> cong (inf R (retr R))" | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 106 | unfolding cong_def | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 107 | by (auto simp: rel_fun_def dest: predicate2D[OF rel_mono, rotated] | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 108 | intro: equivp_inf equivp_retr retr_eval) | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 109 | |
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 110 | lemma cong_equivp: "cong R \<Longrightarrow> equivp R" | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 111 | unfolding cong_def by simp | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 112 | |
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 113 | definition gen_cong :: "('a \<Rightarrow> 'a \<Rightarrow> bool) \<Rightarrow> 'a \<Rightarrow> 'a \<Rightarrow> bool" where
 | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 114 | "gen_cong R j1 j2 \<equiv> \<forall>R'. R \<le> R' \<and> cong R' \<longrightarrow> R' j1 j2" | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 115 | |
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 116 | lemma gen_cong_reflp[intro, simp]: "x = y \<Longrightarrow> gen_cong R x y" | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 117 | unfolding gen_cong_def by (auto dest: cong_equivp equivp_reflp) | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 118 | |
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 119 | lemma gen_cong_symp[intro]: "gen_cong R x y \<Longrightarrow> gen_cong R y x" | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 120 | unfolding gen_cong_def by (auto dest: cong_equivp equivp_symp) | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 121 | |
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 122 | lemma gen_cong_transp[intro]: "gen_cong R x y \<Longrightarrow> gen_cong R y z \<Longrightarrow> gen_cong R x z" | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 123 | unfolding gen_cong_def by (auto dest: cong_equivp equivp_transp) | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 124 | |
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 125 | lemma equivp_gen_cong: "equivp (gen_cong R)" | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 126 | by (intro equivpI reflpI sympI transpI) auto | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 127 | |
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 128 | lemma leq_gen_cong: "R \<le> gen_cong R" | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 129 | unfolding gen_cong_def[abs_def] by auto | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 130 | |
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 131 | lemmas imp_gen_cong[intro] = predicate2D[OF leq_gen_cong] | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 132 | |
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 133 | lemma gen_cong_minimal: "\<lbrakk>R \<le> R'; cong R'\<rbrakk> \<Longrightarrow> gen_cong R \<le> R'" | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 134 | unfolding gen_cong_def[abs_def] by (rule predicate2I) metis | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 135 | |
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 136 | lemma congdd_base_gen_congdd_base_aux: | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 137 | "rel (gen_cong R) x y \<Longrightarrow> R \<le> R' \<Longrightarrow> cong R' \<Longrightarrow> R' (eval x) (eval y)" | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 138 | by (force simp: rel_fun_def gen_cong_def cong_def dest: spec[of _ R'] predicate2D[OF rel_mono, rotated -1, of _ _ _ R']) | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 139 | |
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 140 | lemma cong_gen_cong: "cong (gen_cong R)" | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 141 | proof - | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 142 |   { fix R' x y
 | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 143 | have "rel (gen_cong R) x y \<Longrightarrow> R \<le> R' \<Longrightarrow> cong R' \<Longrightarrow> R' (eval x) (eval y)" | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 144 | by (force simp: rel_fun_def gen_cong_def cong_def dest: spec[of _ R'] | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 145 | predicate2D[OF rel_mono, rotated -1, of _ _ _ R']) | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 146 | } | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 147 | then show "cong (gen_cong R)" by (auto simp: equivp_gen_cong rel_fun_def gen_cong_def cong_def) | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 148 | qed | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 149 | |
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 150 | lemma gen_cong_eval_rel_fun: | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 151 | "(rel_fun (rel (gen_cong R)) (gen_cong R)) eval eval" | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 152 | using cong_gen_cong[of R] unfolding cong_def by simp | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 153 | |
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 154 | lemma gen_cong_eval: | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 155 | "rel (gen_cong R) x y \<Longrightarrow> gen_cong R (eval x) (eval y)" | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 156 | by (erule rel_funD[OF gen_cong_eval_rel_fun]) | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 157 | |
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 158 | lemma gen_cong_idem: "gen_cong (gen_cong R) = gen_cong R" | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 159 | by (simp add: antisym cong_gen_cong gen_cong_minimal leq_gen_cong) | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 160 | |
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 161 | lemma gen_cong_rho: | 
| 67091 | 162 | "\<rho> = eval \<circ> f \<Longrightarrow> rel (gen_cong R) (f x) (f y) \<Longrightarrow> gen_cong R (\<rho> x) (\<rho> y)" | 
| 62692 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 163 | by (simp add: gen_cong_eval) | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 164 | lemma coinduction: | 
| 67399 | 165 | assumes coind: "\<forall>R. R \<le> retr R \<longrightarrow> R \<le> (=)" | 
| 62692 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 166 | assumes cih: "R \<le> retr (gen_cong R)" | 
| 67399 | 167 | shows "R \<le> (=)" | 
| 62692 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 168 | apply (rule order_trans[OF leq_gen_cong mp[OF spec[OF coind]]]) | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 169 | apply (rule self_bounded_weaken_left[OF gen_cong_minimal]) | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 170 | apply (rule inf_greatest[OF leq_gen_cong cih]) | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 171 | apply (rule cong_retr[OF cong_gen_cong]) | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 172 | done | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 173 | |
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 174 | end | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 175 | |
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 176 | lemma rel_sum_case_sum: | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 177 | "rel_fun (rel_sum R S) T (case_sum f1 g1) (case_sum f2 g2) = (rel_fun R T f1 f2 \<and> rel_fun S T g1 g2)" | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 178 | by (auto simp: rel_fun_def rel_sum.simps split: sum.splits) | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 179 | |
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 180 | context | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 181 | fixes rel eval rel' eval' retr emb | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 182 | assumes base: "cong rel eval retr" | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 183 | and step: "cong rel' eval' retr" | 
| 67091 | 184 | and emb: "eval' \<circ> emb = eval" | 
| 62692 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 185 | and emb_transfer: "rel_fun (rel R) (rel' R) emb emb" | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 186 | begin | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 187 | |
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 188 | interpretation base: cong rel eval retr by (rule base) | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 189 | interpretation step: cong rel' eval' retr by (rule step) | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 190 | |
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 191 | lemma gen_cong_emb: "base.gen_cong R \<le> step.gen_cong R" | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 192 | proof (rule base.gen_cong_minimal[OF step.leq_gen_cong]) | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 193 | note step.gen_cong_eval_rel_fun[transfer_rule] emb_transfer[transfer_rule] | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 194 | have "(rel_fun (rel (step.gen_cong R)) (step.gen_cong R)) eval eval" | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 195 | unfolding emb[symmetric] by transfer_prover | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 196 | then show "base.cong (step.gen_cong R)" | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 197 | by (auto simp: base.cong_def step.equivp_gen_cong) | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 198 | qed | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 199 | |
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 200 | end | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 201 | |
| 64379 
71f42dcaa1df
additional user-specified simp (naturality) rules used in friend_of_corec
 traytel parents: 
64378diff
changeset | 202 | named_theorems friend_of_corec_simps | 
| 
71f42dcaa1df
additional user-specified simp (naturality) rules used in friend_of_corec
 traytel parents: 
64378diff
changeset | 203 | |
| 69605 | 204 | ML_file \<open>../Tools/BNF/bnf_gfp_grec_tactics.ML\<close> | 
| 205 | ML_file \<open>../Tools/BNF/bnf_gfp_grec.ML\<close> | |
| 206 | ML_file \<open>../Tools/BNF/bnf_gfp_grec_sugar_util.ML\<close> | |
| 207 | ML_file \<open>../Tools/BNF/bnf_gfp_grec_sugar_tactics.ML\<close> | |
| 208 | ML_file \<open>../Tools/BNF/bnf_gfp_grec_sugar.ML\<close> | |
| 209 | ML_file \<open>../Tools/BNF/bnf_gfp_grec_unique_sugar.ML\<close> | |
| 62692 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 210 | |
| 64378 | 211 | method_setup transfer_prover_eq = \<open> | 
| 212 | Scan.succeed (SIMPLE_METHOD' o BNF_GFP_Grec_Tactics.transfer_prover_eq_tac) | |
| 213 | \<close> "apply transfer_prover after folding relator_eq" | |
| 214 | ||
| 62692 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 215 | method_setup corec_unique = \<open> | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 216 | Scan.succeed (SIMPLE_METHOD' o BNF_GFP_Grec_Unique_Sugar.corec_unique_tac) | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 217 | \<close> "prove uniqueness of corecursive equation" | 
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 218 | |
| 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 blanchet parents: diff
changeset | 219 | end |