QuotScript.thy
changeset 543 d030c8e19465
parent 542 fe468f8723fc
child 546 8a1f4227dff9
equal deleted inserted replaced
542:fe468f8723fc 543:d030c8e19465
     1 theory QuotScript
     1 theory QuotScript
     2 imports Plain ATP_Linkup
     2 imports Plain ATP_Linkup
     3 begin
     3 begin
     4 
     4 
     5 definition 
     5 definition
     6   "equivp E \<equiv> \<forall>x y. E x y = (E x = E y)" 
     6   "equivp E \<equiv> \<forall>x y. E x y = (E x = E y)"
     7 
     7 
     8 definition
     8 definition
     9   "reflp E \<equiv> \<forall>x. E x x"
     9   "reflp E \<equiv> \<forall>x. E x x"
    10 
    10 
    11 definition 
    11 definition
    12   "symp E \<equiv> \<forall>x y. E x y \<longrightarrow> E y x"
    12   "symp E \<equiv> \<forall>x y. E x y \<longrightarrow> E y x"
    13 
    13 
    14 definition
    14 definition
    15   "transp E \<equiv> \<forall>x y z. E x y \<and> E y z \<longrightarrow> E x z"
    15   "transp E \<equiv> \<forall>x y z. E x y \<and> E y z \<longrightarrow> E x z"
    16 
    16 
    17 lemma equivp_reflp_symp_transp:
    17 lemma equivp_reflp_symp_transp:
    18   shows "equivp E = (reflp E \<and> symp E \<and> transp E)"
    18   shows "equivp E = (reflp E \<and> symp E \<and> transp E)"
    19 unfolding equivp_def reflp_def symp_def transp_def expand_fun_eq
    19   unfolding equivp_def reflp_def symp_def transp_def expand_fun_eq
    20 by (blast)
    20   by (blast)
    21 
    21 
    22 lemma equivp_refl:
    22 lemma equivp_refl:
    23   shows "equivp R \<Longrightarrow> (\<And>x. R x x)"
    23   shows "equivp R \<Longrightarrow> (\<And>x. R x x)"
    24   by (simp add: equivp_reflp_symp_transp reflp_def)
    24   by (simp add: equivp_reflp_symp_transp reflp_def)
    25 
    25 
    31   "part_equivp E \<equiv> (\<exists>x. E x x) \<and> (\<forall>x y. E x y = (E x x \<and> E y y \<and> (E x = E y)))"
    31   "part_equivp E \<equiv> (\<exists>x. E x x) \<and> (\<forall>x y. E x y = (E x x \<and> E y y \<and> (E x = E y)))"
    32 
    32 
    33 lemma equivp_IMP_part_equivp:
    33 lemma equivp_IMP_part_equivp:
    34   assumes a: "equivp E"
    34   assumes a: "equivp E"
    35   shows "part_equivp E"
    35   shows "part_equivp E"
    36 using a unfolding equivp_def part_equivp_def
    36   using a unfolding equivp_def part_equivp_def
    37 by auto
    37   by auto
    38 
    38 
    39 definition
    39 definition
    40   "Quotient E Abs Rep \<equiv> (\<forall>a. Abs (Rep a) = a) \<and> 
    40   "Quotient E Abs Rep \<equiv> (\<forall>a. Abs (Rep a) = a) \<and>
    41                         (\<forall>a. E (Rep a) (Rep a)) \<and> 
    41                         (\<forall>a. E (Rep a) (Rep a)) \<and>
    42                         (\<forall>r s. E r s = (E r r \<and> E s s \<and> (Abs r = Abs s)))"
    42                         (\<forall>r s. E r s = (E r r \<and> E s s \<and> (Abs r = Abs s)))"
    43 
    43 
    44 lemma Quotient_abs_rep:
    44 lemma Quotient_abs_rep:
    45   assumes a: "Quotient E Abs Rep"
    45   assumes a: "Quotient E Abs Rep"
    46   shows "Abs (Rep a) = a" 
    46   shows "Abs (Rep a) = a"
    47 using a unfolding Quotient_def
    47   using a unfolding Quotient_def
    48 by simp
    48   by simp
    49 
    49 
    50 lemma Quotient_rep_reflp:
    50 lemma Quotient_rep_reflp:
    51   assumes a: "Quotient E Abs Rep"
    51   assumes a: "Quotient E Abs Rep"
    52   shows "E (Rep a) (Rep a)"
    52   shows "E (Rep a) (Rep a)"
    53 using a unfolding Quotient_def
    53   using a unfolding Quotient_def
    54 by blast
    54   by blast
    55 
    55 
    56 lemma Quotient_rel:
    56 lemma Quotient_rel:
    57   assumes a: "Quotient E Abs Rep"
    57   assumes a: "Quotient E Abs Rep"
    58   shows " E r s = (E r r \<and> E s s \<and> (Abs r = Abs s))"
    58   shows " E r s = (E r r \<and> E s s \<and> (Abs r = Abs s))"
    59 using a unfolding Quotient_def
    59   using a unfolding Quotient_def
    60 by blast
    60   by blast
    61 
    61 
    62 lemma Quotient_rel_rep:
    62 lemma Quotient_rel_rep:
    63   assumes a: "Quotient R Abs Rep"
    63   assumes a: "Quotient R Abs Rep"
    64   shows "R (Rep a) (Rep b) \<equiv> (a = b)"
    64   shows "R (Rep a) (Rep b) \<equiv> (a = b)"
    65 apply (rule eq_reflection)
    65   apply (rule eq_reflection)
    66 using a unfolding Quotient_def
    66   using a unfolding Quotient_def
    67 by metis
    67   by metis
    68 
    68 
    69 lemma Quotient_rep_abs:
    69 lemma Quotient_rep_abs:
    70   assumes a: "Quotient R Abs Rep"
    70   assumes a: "Quotient R Abs Rep"
    71   shows "R r r \<Longrightarrow> R (Rep (Abs r)) r"
    71   shows "R r r \<Longrightarrow> R (Rep (Abs r)) r"
    72 using a unfolding Quotient_def
    72   using a unfolding Quotient_def
    73 by blast
    73   by blast
    74 
    74 
    75 lemma identity_equivp:
    75 lemma identity_equivp:
    76   shows "equivp (op =)"
    76   shows "equivp (op =)"
    77 unfolding equivp_def
    77   unfolding equivp_def
    78 by auto
    78   by auto
    79 
    79 
    80 lemma identity_quotient:
    80 lemma identity_quotient:
    81   shows "Quotient (op =) id id"
    81   shows "Quotient (op =) id id"
    82 unfolding Quotient_def id_def
    82   unfolding Quotient_def id_def
    83 by blast
    83   by blast
    84 
    84 
    85 lemma Quotient_symp:
    85 lemma Quotient_symp:
    86   assumes a: "Quotient E Abs Rep"
    86   assumes a: "Quotient E Abs Rep"
    87   shows "symp E"
    87   shows "symp E"
    88 using a unfolding Quotient_def symp_def
    88   using a unfolding Quotient_def symp_def
    89 by metis
    89   by metis
    90 
    90 
    91 lemma Quotient_transp:
    91 lemma Quotient_transp:
    92   assumes a: "Quotient E Abs Rep"
    92   assumes a: "Quotient E Abs Rep"
    93   shows "transp E"
    93   shows "transp E"
    94 using a unfolding Quotient_def transp_def
    94   using a unfolding Quotient_def transp_def
    95 by metis
    95   by metis
    96 
    96 
    97 fun
    97 fun
    98   prod_rel
    98   prod_rel
    99 where
    99 where
   100   "prod_rel r1 r2 = (\<lambda>(a,b) (c,d). r1 a c \<and> r2 b d)"
   100   "prod_rel r1 r2 = (\<lambda>(a,b) (c,d). r1 a c \<and> r2 b d)"
   102 fun
   102 fun
   103   fun_map
   103   fun_map
   104 where
   104 where
   105   "fun_map f g h x = g (h (f x))"
   105   "fun_map f g h x = g (h (f x))"
   106 
   106 
   107 
       
   108 abbreviation
   107 abbreviation
   109   fun_map_syn (infixr "--->" 55)
   108   fun_map_syn (infixr "--->" 55)
   110 where
   109 where
   111   "f ---> g \<equiv> fun_map f g"
   110   "f ---> g \<equiv> fun_map f g"
   112 
   111 
   113 lemma fun_map_id:
   112 lemma fun_map_id:
   114   shows "(id ---> id) = id"
   113   shows "(id ---> id) = id"
   115 by (simp add: expand_fun_eq id_def)
   114   by (simp add: expand_fun_eq id_def)
   116 
   115 
   117 fun
   116 fun
   118   fun_rel
   117   fun_rel
   119 where
   118 where
   120   "fun_rel E1 E2 f g = (\<forall>x y. E1 x y \<longrightarrow> E2 (f x) (g y))"
   119   "fun_rel E1 E2 f g = (\<forall>x y. E1 x y \<longrightarrow> E2 (f x) (g y))"
   167 where
   166 where
   168   "Respects R x \<equiv> (R x x)"
   167   "Respects R x \<equiv> (R x x)"
   169 
   168 
   170 lemma in_respects:
   169 lemma in_respects:
   171   shows "(x \<in> Respects R) = R x x"
   170   shows "(x \<in> Respects R) = R x x"
   172 unfolding mem_def Respects_def by simp
   171   unfolding mem_def Respects_def by simp
   173 
       
   174 (* TODO: it is the same as APPLY_RSP *)
       
   175 (* q1 and q2 not used; see next lemma *)
       
   176 lemma fun_rel_MP:
       
   177   assumes q1: "Quotient R1 Abs1 Rep1"
       
   178   and     q2: "Quotient R2 Abs2 Rep2"
       
   179   shows "(R1 ===> R2) f g \<Longrightarrow> R1 x y \<Longrightarrow> R2 (f x) (g y)"
       
   180 by simp
       
   181 
       
   182 lemma fun_rel_IMP:
       
   183   shows "(R1 ===> R2) f g \<Longrightarrow> R1 x y \<Longrightarrow> R2 (f x) (g y)"
       
   184 by simp
       
   185 
       
   186 
   172 
   187 lemma equals_rsp:
   173 lemma equals_rsp:
   188   assumes q: "Quotient R Abs Rep"
   174   assumes q: "Quotient R Abs Rep"
   189   and     a: "R xa xb" "R ya yb"
   175   and     a: "R xa xb" "R ya yb"
   190   shows "R xa ya = R xb yb"
   176   shows "R xa ya = R xb yb"
   191 using Quotient_symp[OF q] Quotient_transp[OF q] unfolding symp_def transp_def
   177   using Quotient_symp[OF q] Quotient_transp[OF q] unfolding symp_def transp_def
   192 using a by blast
   178   using a by blast
   193 
   179 
   194 lemma lambda_prs:
   180 lemma lambda_prs:
   195   assumes q1: "Quotient R1 Abs1 Rep1"
   181   assumes q1: "Quotient R1 Abs1 Rep1"
   196   and     q2: "Quotient R2 Abs2 Rep2"
   182   and     q2: "Quotient R2 Abs2 Rep2"
   197   shows "(Rep1 ---> Abs2) (\<lambda>x. Rep2 (f (Abs1 x))) = (\<lambda>x. f x)"
   183   shows "(Rep1 ---> Abs2) (\<lambda>x. Rep2 (f (Abs1 x))) = (\<lambda>x. f x)"
   198 unfolding expand_fun_eq
   184   unfolding expand_fun_eq
   199 using Quotient_abs_rep[OF q1] Quotient_abs_rep[OF q2]
   185   using Quotient_abs_rep[OF q1] Quotient_abs_rep[OF q2]
   200 by simp
   186   by simp
   201 
   187 
   202 lemma lambda_prs1:
   188 lemma lambda_prs1:
   203   assumes q1: "Quotient R1 Abs1 Rep1"
   189   assumes q1: "Quotient R1 Abs1 Rep1"
   204   and     q2: "Quotient R2 Abs2 Rep2"
   190   and     q2: "Quotient R2 Abs2 Rep2"
   205   shows "(Rep1 ---> Abs2) (\<lambda>x. (Abs1 ---> Rep2) f x) = (\<lambda>x. f x)"
   191   shows "(Rep1 ---> Abs2) (\<lambda>x. (Abs1 ---> Rep2) f x) = (\<lambda>x. f x)"
   206 unfolding expand_fun_eq
   192   unfolding expand_fun_eq
   207 using Quotient_abs_rep[OF q1] Quotient_abs_rep[OF q2]
   193   using Quotient_abs_rep[OF q1] Quotient_abs_rep[OF q2]
   208 by simp
   194   by simp
   209 
   195 
   210 lemma rep_abs_rsp:
   196 lemma rep_abs_rsp:
   211   assumes q: "Quotient R Abs Rep"
   197   assumes q: "Quotient R Abs Rep"
   212   and     a: "R x1 x2"
   198   and     a: "R x1 x2"
   213   shows "R x1 (Rep (Abs x2))"
   199   shows "R x1 (Rep (Abs x2))"
   214 using q a by (metis Quotient_rel[OF q] Quotient_abs_rep[OF q] Quotient_rep_reflp[OF q])
   200   using q a by (metis Quotient_rel[OF q] Quotient_abs_rep[OF q] Quotient_rep_reflp[OF q])
   215 
       
   216 (* ----------------------------------------------------- *)
       
   217 (* Quantifiers: FORALL, EXISTS, EXISTS_UNIQUE,           *)
       
   218 (*              Ball, Bex, RES_EXISTS_EQUIV              *)
       
   219 (* ----------------------------------------------------- *)
       
   220 
       
   221 (* bool theory: COND, LET *)
       
   222 
       
   223 lemma IF_PRS:
       
   224   assumes q: "Quotient R Abs Rep"
       
   225   shows "If a b c = Abs (If a (Rep b) (Rep c))"
       
   226 using Quotient_abs_rep[OF q] by auto
       
   227 
       
   228 (* ask peter: no use of q *)
       
   229 lemma IF_RSP:
       
   230   assumes q: "Quotient R Abs Rep"
       
   231   and     a: "a1 = a2" "R b1 b2" "R c1 c2"
       
   232   shows "R (If a1 b1 c1) (If a2 b2 c2)"
       
   233 using a by auto
       
   234 
       
   235 lemma LET_PRS:
       
   236   assumes q1: "Quotient R1 Abs1 Rep1"
       
   237   and     q2: "Quotient R2 Abs2 Rep2"
       
   238   shows "Let x f = Abs2 (Let (Rep1 x) ((Abs1 ---> Rep2) f))"
       
   239 using Quotient_abs_rep[OF q1] Quotient_abs_rep[OF q2] by auto
       
   240 
       
   241 lemma LET_RSP:
       
   242   assumes q1: "Quotient R1 Abs1 Rep1"
       
   243   and     q2: "Quotient R2 Abs2 Rep2"
       
   244   and     a1: "(R1 ===> R2) f g"
       
   245   and     a2: "R1 x y"
       
   246   shows "R2 (Let x f) (Let y g)"
       
   247 using fun_rel_MP[OF q1 q2 a1] a2
       
   248 by auto
       
   249 
       
   250 
       
   251 (* ask peter what are literal_case *)
       
   252 (* literal_case_PRS *)
       
   253 (* literal_case_RSP *)
       
   254 
       
   255 
       
   256 (* FUNCTION APPLICATION *)
       
   257 
   201 
   258 (* In the following theorem R1 can be instantiated with anything,
   202 (* In the following theorem R1 can be instantiated with anything,
   259    but we know some of the types of the Rep and Abs functions;
   203    but we know some of the types of the Rep and Abs functions;
   260    so by solving Quotient assumptions we can get a unique R2 that
   204    so by solving Quotient assumptions we can get a unique R1 that
   261    will be provable; which is why we need to use APPLY_RSP *)
   205    will be provable; which is why we need to use apply_rsp and
       
   206    not the primed version *)
   262 lemma apply_rsp:
   207 lemma apply_rsp:
   263   assumes q: "Quotient R1 Abs1 Rep1"
   208   assumes q: "Quotient R1 Abs1 Rep1"
   264   and     a: "(R1 ===> R2) f g" "R1 x y"
   209   and     a: "(R1 ===> R2) f g" "R1 x y"
   265   shows "R2 ((f::'a\<Rightarrow>'c) x) ((g::'a\<Rightarrow>'c) y)"
   210   shows "R2 ((f::'a\<Rightarrow>'c) x) ((g::'a\<Rightarrow>'c) y)"
   266 using a by (rule fun_rel_IMP)
   211   using a by simp
   267 
   212 
   268 lemma apply_rsp':
   213 lemma apply_rsp':
   269   assumes a: "(R1 ===> R2) f g" "R1 x y"
   214   assumes a: "(R1 ===> R2) f g" "R1 x y"
   270   shows "R2 (f x) (g y)"
   215   shows "R2 (f x) (g y)"
   271 using a by (rule fun_rel_IMP)
   216   using a by simp
   272 
       
   273 
       
   274 (* combinators: I, K, o, C, W *)
       
   275 
       
   276 (* We use id_simps which includes id_apply; so these 2 theorems can be removed *)
       
   277 lemma I_PRS:
       
   278   assumes q: "Quotient R Abs Rep"
       
   279   shows "id e = Abs (id (Rep e))"
       
   280 using Quotient_abs_rep[OF q] by auto
       
   281 
       
   282 lemma I_RSP:
       
   283   assumes q: "Quotient R Abs Rep"
       
   284   and     a: "R e1 e2"
       
   285   shows "R (id e1) (id e2)"
       
   286 using a by auto
       
   287 
       
   288 lemma o_PRS:
       
   289   assumes q1: "Quotient R1 Abs1 Rep1"
       
   290   and     q2: "Quotient R2 Abs2 Rep2"
       
   291   and     q3: "Quotient R3 Abs3 Rep3"
       
   292   shows "f o g = (Rep1 ---> Abs3) (((Abs2 ---> Rep3) f) o ((Abs1 ---> Rep2) g))"
       
   293 using Quotient_abs_rep[OF q1] Quotient_abs_rep[OF q2] Quotient_abs_rep[OF q3]
       
   294 unfolding o_def expand_fun_eq
       
   295 by simp
       
   296 
       
   297 lemma o_RSP:
       
   298   assumes q1: "Quotient R1 Abs1 Rep1"
       
   299   and     q2: "Quotient R2 Abs2 Rep2"
       
   300   and     q3: "Quotient R3 Abs3 Rep3"
       
   301   and     a1: "(R2 ===> R3) f1 f2"
       
   302   and     a2: "(R1 ===> R2) g1 g2"
       
   303   shows "(R1 ===> R3) (f1 o g1) (f2 o g2)"
       
   304 using a1 a2 unfolding o_def expand_fun_eq
       
   305 by (auto)
       
   306 
       
   307 
       
   308 
       
   309 
       
   310 
       
   311 lemma COND_PRS:
       
   312   assumes a: "Quotient R absf repf"
       
   313   shows "(if a then b else c) = absf (if a then repf b else repf c)"
       
   314   using a unfolding Quotient_def by auto
       
   315 
       
   316 
       
   317 
       
   318 
       
   319 
   217 
   320 (* Set of lemmas for regularisation of ball and bex *)
   218 (* Set of lemmas for regularisation of ball and bex *)
       
   219 
   321 lemma ball_reg_eqv:
   220 lemma ball_reg_eqv:
   322   fixes P :: "'a \<Rightarrow> bool"
   221   fixes P :: "'a \<Rightarrow> bool"
   323   assumes a: "equivp R"
   222   assumes a: "equivp R"
   324   shows "Ball (Respects R) P = (All P)"
   223   shows "Ball (Respects R) P = (All P)"
   325   by (metis equivp_def in_respects a)
   224   by (metis equivp_def in_respects a)
   435   shows "Bex (Respects R) ((absf ---> id) f) = Ex f"
   334   shows "Bex (Respects R) ((absf ---> id) f) = Ex f"
   436   using a unfolding Quotient_def
   335   using a unfolding Quotient_def
   437   by (metis COMBC_def Collect_def Collect_mem_eq in_respects fun_map.simps id_apply)
   336   by (metis COMBC_def Collect_def Collect_mem_eq in_respects fun_map.simps id_apply)
   438 
   337 
   439 
   338 
   440 (* UNUSED *)
   339 
       
   340 
       
   341 
       
   342 
       
   343 (******************************************)
       
   344 (* REST OF THE FILE IS UNUSED (until now) *)
       
   345 (******************************************)
   441 lemma Quotient_rel_abs:
   346 lemma Quotient_rel_abs:
   442   assumes a: "Quotient E Abs Rep"
   347   assumes a: "Quotient E Abs Rep"
   443   shows "E r s \<Longrightarrow> Abs r = Abs s"
   348   shows "E r s \<Longrightarrow> Abs r = Abs s"
   444 using a unfolding Quotient_def
   349 using a unfolding Quotient_def
   445 by blast
   350 by blast
   520   and     r1: "Respects (R1 ===> R2) f"
   425   and     r1: "Respects (R1 ===> R2) f"
   521   and     r2: "Respects (R1 ===> R2) g" 
   426   and     r2: "Respects (R1 ===> R2) g" 
   522   shows "((Rep1 ---> Abs2) f = (Rep1 ---> Abs2) g) = (\<forall>x y. R1 x y \<longrightarrow> R2 (f x) (g y))"
   427   shows "((Rep1 ---> Abs2) f = (Rep1 ---> Abs2) g) = (\<forall>x y. R1 x y \<longrightarrow> R2 (f x) (g y))"
   523 apply(rule_tac iffI)
   428 apply(rule_tac iffI)
   524 using fun_quotient[OF q1 q2] r1 r2 unfolding Quotient_def Respects_def
   429 using fun_quotient[OF q1 q2] r1 r2 unfolding Quotient_def Respects_def
   525 apply(metis fun_rel_IMP)
   430 apply(metis apply_rsp')
   526 using r1 unfolding Respects_def expand_fun_eq
   431 using r1 unfolding Respects_def expand_fun_eq
   527 apply(simp (no_asm_use))
   432 apply(simp (no_asm_use))
   528 apply(metis Quotient_rel[OF q2] Quotient_rel_rep[OF q1])
   433 apply(metis Quotient_rel[OF q2] Quotient_rel_rep[OF q1])
   529 done
   434 done
   530 
   435 
   551   and     a: "R x1 x2"
   456   and     a: "R x1 x2"
   552   shows "R x1 (Rep (Abs x2))"
   457   shows "R x1 (Rep (Abs x2))"
   553 using q a by (metis Quotient_rel[OF q] Quotient_abs_rep[OF q] Quotient_rep_reflp[OF q])
   458 using q a by (metis Quotient_rel[OF q] Quotient_abs_rep[OF q] Quotient_rep_reflp[OF q])
   554 
   459 
   555 
   460 
       
   461 
       
   462 (* bool theory: COND, LET *)
       
   463 lemma IF_PRS:
       
   464   assumes q: "Quotient R Abs Rep"
       
   465   shows "If a b c = Abs (If a (Rep b) (Rep c))"
       
   466 using Quotient_abs_rep[OF q] by auto
       
   467 
       
   468 (* ask peter: no use of q *)
       
   469 lemma IF_RSP:
       
   470   assumes q: "Quotient R Abs Rep"
       
   471   and     a: "a1 = a2" "R b1 b2" "R c1 c2"
       
   472   shows "R (If a1 b1 c1) (If a2 b2 c2)"
       
   473 using a by auto
       
   474 
       
   475 lemma LET_PRS:
       
   476   assumes q1: "Quotient R1 Abs1 Rep1"
       
   477   and     q2: "Quotient R2 Abs2 Rep2"
       
   478   shows "Let x f = Abs2 (Let (Rep1 x) ((Abs1 ---> Rep2) f))"
       
   479 using Quotient_abs_rep[OF q1] Quotient_abs_rep[OF q2] by auto
       
   480 
       
   481 lemma LET_RSP:
       
   482   assumes q1: "Quotient R1 Abs1 Rep1"
       
   483   and     a1: "(R1 ===> R2) f g"
       
   484   and     a2: "R1 x y"
       
   485   shows "R2 ((Let x f)::'c) ((Let y g)::'c)"
       
   486 using apply_rsp[OF q1 a1] a2
       
   487 by auto
       
   488 
       
   489 
       
   490 
       
   491 (* ask peter what are literal_case *)
       
   492 (* literal_case_PRS *)
       
   493 (* literal_case_RSP *)
       
   494 
       
   495 
       
   496 
       
   497 
       
   498 
       
   499 (* combinators: I, K, o, C, W *)
       
   500 
       
   501 (* We use id_simps which includes id_apply; so these 2 theorems can be removed *)
       
   502 
       
   503 lemma I_PRS:
       
   504   assumes q: "Quotient R Abs Rep"
       
   505   shows "id e = Abs (id (Rep e))"
       
   506 using Quotient_abs_rep[OF q] by auto
       
   507 
       
   508 lemma I_RSP:
       
   509   assumes q: "Quotient R Abs Rep"
       
   510   and     a: "R e1 e2"
       
   511   shows "R (id e1) (id e2)"
       
   512 using a by auto
       
   513 
       
   514 lemma o_PRS:
       
   515   assumes q1: "Quotient R1 Abs1 Rep1"
       
   516   and     q2: "Quotient R2 Abs2 Rep2"
       
   517   and     q3: "Quotient R3 Abs3 Rep3"
       
   518   shows "f o g = (Rep1 ---> Abs3) (((Abs2 ---> Rep3) f) o ((Abs1 ---> Rep2) g))"
       
   519 using Quotient_abs_rep[OF q1] Quotient_abs_rep[OF q2] Quotient_abs_rep[OF q3]
       
   520 unfolding o_def expand_fun_eq
       
   521 by simp
       
   522 
       
   523 lemma o_RSP:
       
   524   assumes q1: "Quotient R1 Abs1 Rep1"
       
   525   and     q2: "Quotient R2 Abs2 Rep2"
       
   526   and     q3: "Quotient R3 Abs3 Rep3"
       
   527   and     a1: "(R2 ===> R3) f1 f2"
       
   528   and     a2: "(R1 ===> R2) g1 g2"
       
   529   shows "(R1 ===> R3) (f1 o g1) (f2 o g2)"
       
   530 using a1 a2 unfolding o_def expand_fun_eq
       
   531 by (auto)
       
   532 
       
   533 lemma COND_PRS:
       
   534   assumes a: "Quotient R absf repf"
       
   535   shows "(if a then b else c) = absf (if a then repf b else repf c)"
       
   536   using a unfolding Quotient_def by auto
       
   537 
       
   538 
   556 end
   539 end
   557 
   540