src/HOL/Quotient.thy
author traytel
Sun, 19 Jan 2020 07:50:35 +0100
changeset 71393 fce780f9c9c6
parent 71354 c71a44893645
child 71494 cbe0b6b0bed8
permissions -rw-r--r--
new examples of BNF lifting across quotients using a new theory of confluence, which simplifies the relator subdistributivity proof obligation (a few new useful notions were added to HOL; notably the symmetric and equivalence closures of a relation)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
41959
b460124855b8 tuned headers;
wenzelm
parents: 41452
diff changeset
     1
(*  Title:      HOL/Quotient.thy
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
     2
    Author:     Cezary Kaliszyk and Christian Urban
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
     3
*)
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
     4
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 59028
diff changeset
     5
section \<open>Definition of Quotient Types\<close>
35294
0e1adc24722f proper header and subsection headings
huffman
parents: 35236
diff changeset
     6
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
     7
theory Quotient
54555
e8c5e95d338b rationalize imports
blanchet
parents: 53011
diff changeset
     8
imports Lifting
46950
d0181abdbdac declare command keywords via theory header, including strict checking outside Pure;
wenzelm
parents: 46947
diff changeset
     9
keywords
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
    10
  "print_quotmapsQ3" "print_quotientsQ3" "print_quotconsts" :: diag and
69913
ca515cf61651 more specific keyword kinds;
wenzelm
parents: 69605
diff changeset
    11
  "quotient_type" :: thy_goal_defn and "/" and
71262
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
    12
  "quotient_definition" :: thy_goal_defn and
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
    13
  "copy_bnf" :: thy_defn and
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
    14
  "lift_bnf" :: thy_goal_defn
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    15
begin
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    16
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 59028
diff changeset
    17
text \<open>
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    18
  Basic definition for equivalence relations
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    19
  that are represented by predicates.
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 59028
diff changeset
    20
\<close>
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    21
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 59028
diff changeset
    22
text \<open>Composition of Relations\<close>
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    23
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    24
abbreviation
40818
b117df72e56b reorienting iff in Quotient_rel prevents simplifier looping;
haftmann
parents: 40814
diff changeset
    25
  rel_conj :: "('a \<Rightarrow> 'b \<Rightarrow> bool) \<Rightarrow> ('b \<Rightarrow> 'a \<Rightarrow> bool) \<Rightarrow> 'a \<Rightarrow> 'b \<Rightarrow> bool" (infixr "OOO" 75)
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    26
where
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    27
  "r1 OOO r2 \<equiv> r1 OO r2 OO r1"
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    28
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    29
lemma eq_comp_r:
67399
eab6ce8368fa ran isabelle update_op on all sources
nipkow
parents: 67091
diff changeset
    30
  shows "((=) OOO R) = R"
39302
d7728f65b353 renamed lemmas: ext_iff -> fun_eq_iff, set_ext_iff -> set_eq_iff, set_ext -> set_eqI
nipkow
parents: 39198
diff changeset
    31
  by (auto simp add: fun_eq_iff)
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    32
63343
fb5d8a50c641 bundle lifting_syntax;
wenzelm
parents: 61799
diff changeset
    33
context includes lifting_syntax
53011
aeee0a4be6cf introduce locale with syntax for fun_rel and map_fun and make thus ===> and ---> local
kuncar
parents: 51112
diff changeset
    34
begin
aeee0a4be6cf introduce locale with syntax for fun_rel and map_fun and make thus ===> and ---> local
kuncar
parents: 51112
diff changeset
    35
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 59028
diff changeset
    36
subsection \<open>Quotient Predicate\<close>
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    37
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    38
definition
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
    39
  "Quotient3 R Abs Rep \<longleftrightarrow>
40814
fa64f6278568 moved generic definitions about (partial) equivalence relations from Quotient to Equiv_Relations;
haftmann
parents: 40615
diff changeset
    40
     (\<forall>a. Abs (Rep a) = a) \<and> (\<forall>a. R (Rep a) (Rep a)) \<and>
40818
b117df72e56b reorienting iff in Quotient_rel prevents simplifier looping;
haftmann
parents: 40814
diff changeset
    41
     (\<forall>r s. R r s \<longleftrightarrow> R r r \<and> R s s \<and> Abs r = Abs s)"
b117df72e56b reorienting iff in Quotient_rel prevents simplifier looping;
haftmann
parents: 40814
diff changeset
    42
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
    43
lemma Quotient3I:
40818
b117df72e56b reorienting iff in Quotient_rel prevents simplifier looping;
haftmann
parents: 40814
diff changeset
    44
  assumes "\<And>a. Abs (Rep a) = a"
b117df72e56b reorienting iff in Quotient_rel prevents simplifier looping;
haftmann
parents: 40814
diff changeset
    45
    and "\<And>a. R (Rep a) (Rep a)"
b117df72e56b reorienting iff in Quotient_rel prevents simplifier looping;
haftmann
parents: 40814
diff changeset
    46
    and "\<And>r s. R r s \<longleftrightarrow> R r r \<and> R s s \<and> Abs r = Abs s"
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
    47
  shows "Quotient3 R Abs Rep"
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
    48
  using assms unfolding Quotient3_def by blast
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    49
54867
c21a2465cac1 prefer ephemeral interpretation over interpretation in proof contexts;
haftmann
parents: 54555
diff changeset
    50
context
c21a2465cac1 prefer ephemeral interpretation over interpretation in proof contexts;
haftmann
parents: 54555
diff changeset
    51
  fixes R Abs Rep
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
    52
  assumes a: "Quotient3 R Abs Rep"
54867
c21a2465cac1 prefer ephemeral interpretation over interpretation in proof contexts;
haftmann
parents: 54555
diff changeset
    53
begin
c21a2465cac1 prefer ephemeral interpretation over interpretation in proof contexts;
haftmann
parents: 54555
diff changeset
    54
c21a2465cac1 prefer ephemeral interpretation over interpretation in proof contexts;
haftmann
parents: 54555
diff changeset
    55
lemma Quotient3_abs_rep:
c21a2465cac1 prefer ephemeral interpretation over interpretation in proof contexts;
haftmann
parents: 54555
diff changeset
    56
  "Abs (Rep a) = a"
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    57
  using a
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
    58
  unfolding Quotient3_def
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    59
  by simp
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    60
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
    61
lemma Quotient3_rep_reflp:
54867
c21a2465cac1 prefer ephemeral interpretation over interpretation in proof contexts;
haftmann
parents: 54555
diff changeset
    62
  "R (Rep a) (Rep a)"
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    63
  using a
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
    64
  unfolding Quotient3_def
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    65
  by blast
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    66
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
    67
lemma Quotient3_rel:
61799
4cf66f21b764 isabelle update_cartouches -c -t;
wenzelm
parents: 60758
diff changeset
    68
  "R r r \<and> R s s \<and> Abs r = Abs s \<longleftrightarrow> R r s" \<comment> \<open>orientation does not loop on rewriting\<close>
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    69
  using a
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
    70
  unfolding Quotient3_def
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    71
  by blast
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    72
71262
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
    73
lemma Quotient3_refl1:
54867
c21a2465cac1 prefer ephemeral interpretation over interpretation in proof contexts;
haftmann
parents: 54555
diff changeset
    74
  "R r s \<Longrightarrow> R r r"
71262
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
    75
  using a unfolding Quotient3_def
47096
3ea48c19673e generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
kuncar
parents: 47094
diff changeset
    76
  by fast
3ea48c19673e generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
kuncar
parents: 47094
diff changeset
    77
71262
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
    78
lemma Quotient3_refl2:
54867
c21a2465cac1 prefer ephemeral interpretation over interpretation in proof contexts;
haftmann
parents: 54555
diff changeset
    79
  "R r s \<Longrightarrow> R s s"
71262
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
    80
  using a unfolding Quotient3_def
47096
3ea48c19673e generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
kuncar
parents: 47094
diff changeset
    81
  by fast
3ea48c19673e generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
kuncar
parents: 47094
diff changeset
    82
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
    83
lemma Quotient3_rel_rep:
54867
c21a2465cac1 prefer ephemeral interpretation over interpretation in proof contexts;
haftmann
parents: 54555
diff changeset
    84
  "R (Rep a) (Rep b) \<longleftrightarrow> a = b"
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    85
  using a
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
    86
  unfolding Quotient3_def
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    87
  by metis
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    88
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
    89
lemma Quotient3_rep_abs:
54867
c21a2465cac1 prefer ephemeral interpretation over interpretation in proof contexts;
haftmann
parents: 54555
diff changeset
    90
  "R r r \<Longrightarrow> R (Rep (Abs r)) r"
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
    91
  using a unfolding Quotient3_def
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
    92
  by blast
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
    93
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
    94
lemma Quotient3_rel_abs:
54867
c21a2465cac1 prefer ephemeral interpretation over interpretation in proof contexts;
haftmann
parents: 54555
diff changeset
    95
  "R r s \<Longrightarrow> Abs r = Abs s"
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
    96
  using a unfolding Quotient3_def
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    97
  by blast
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    98
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
    99
lemma Quotient3_symp:
54867
c21a2465cac1 prefer ephemeral interpretation over interpretation in proof contexts;
haftmann
parents: 54555
diff changeset
   100
  "symp R"
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   101
  using a unfolding Quotient3_def using sympI by metis
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   102
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   103
lemma Quotient3_transp:
54867
c21a2465cac1 prefer ephemeral interpretation over interpretation in proof contexts;
haftmann
parents: 54555
diff changeset
   104
  "transp R"
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   105
  using a unfolding Quotient3_def using transpI by (metis (full_types))
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   106
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   107
lemma Quotient3_part_equivp:
54867
c21a2465cac1 prefer ephemeral interpretation over interpretation in proof contexts;
haftmann
parents: 54555
diff changeset
   108
  "part_equivp R"
c21a2465cac1 prefer ephemeral interpretation over interpretation in proof contexts;
haftmann
parents: 54555
diff changeset
   109
  by (metis Quotient3_rep_reflp Quotient3_symp Quotient3_transp part_equivpI)
c21a2465cac1 prefer ephemeral interpretation over interpretation in proof contexts;
haftmann
parents: 54555
diff changeset
   110
c21a2465cac1 prefer ephemeral interpretation over interpretation in proof contexts;
haftmann
parents: 54555
diff changeset
   111
lemma abs_o_rep:
67091
1393c2340eec more symbols;
wenzelm
parents: 63343
diff changeset
   112
  "Abs \<circ> Rep = id"
54867
c21a2465cac1 prefer ephemeral interpretation over interpretation in proof contexts;
haftmann
parents: 54555
diff changeset
   113
  unfolding fun_eq_iff
c21a2465cac1 prefer ephemeral interpretation over interpretation in proof contexts;
haftmann
parents: 54555
diff changeset
   114
  by (simp add: Quotient3_abs_rep)
c21a2465cac1 prefer ephemeral interpretation over interpretation in proof contexts;
haftmann
parents: 54555
diff changeset
   115
c21a2465cac1 prefer ephemeral interpretation over interpretation in proof contexts;
haftmann
parents: 54555
diff changeset
   116
lemma equals_rsp:
c21a2465cac1 prefer ephemeral interpretation over interpretation in proof contexts;
haftmann
parents: 54555
diff changeset
   117
  assumes b: "R xa xb" "R ya yb"
c21a2465cac1 prefer ephemeral interpretation over interpretation in proof contexts;
haftmann
parents: 54555
diff changeset
   118
  shows "R xa ya = R xb yb"
c21a2465cac1 prefer ephemeral interpretation over interpretation in proof contexts;
haftmann
parents: 54555
diff changeset
   119
  using b Quotient3_symp Quotient3_transp
c21a2465cac1 prefer ephemeral interpretation over interpretation in proof contexts;
haftmann
parents: 54555
diff changeset
   120
  by (blast elim: sympE transpE)
c21a2465cac1 prefer ephemeral interpretation over interpretation in proof contexts;
haftmann
parents: 54555
diff changeset
   121
c21a2465cac1 prefer ephemeral interpretation over interpretation in proof contexts;
haftmann
parents: 54555
diff changeset
   122
lemma rep_abs_rsp:
c21a2465cac1 prefer ephemeral interpretation over interpretation in proof contexts;
haftmann
parents: 54555
diff changeset
   123
  assumes b: "R x1 x2"
c21a2465cac1 prefer ephemeral interpretation over interpretation in proof contexts;
haftmann
parents: 54555
diff changeset
   124
  shows "R x1 (Rep (Abs x2))"
c21a2465cac1 prefer ephemeral interpretation over interpretation in proof contexts;
haftmann
parents: 54555
diff changeset
   125
  using b Quotient3_rel Quotient3_abs_rep Quotient3_rep_reflp
c21a2465cac1 prefer ephemeral interpretation over interpretation in proof contexts;
haftmann
parents: 54555
diff changeset
   126
  by metis
c21a2465cac1 prefer ephemeral interpretation over interpretation in proof contexts;
haftmann
parents: 54555
diff changeset
   127
c21a2465cac1 prefer ephemeral interpretation over interpretation in proof contexts;
haftmann
parents: 54555
diff changeset
   128
lemma rep_abs_rsp_left:
c21a2465cac1 prefer ephemeral interpretation over interpretation in proof contexts;
haftmann
parents: 54555
diff changeset
   129
  assumes b: "R x1 x2"
c21a2465cac1 prefer ephemeral interpretation over interpretation in proof contexts;
haftmann
parents: 54555
diff changeset
   130
  shows "R (Rep (Abs x1)) x2"
c21a2465cac1 prefer ephemeral interpretation over interpretation in proof contexts;
haftmann
parents: 54555
diff changeset
   131
  using b Quotient3_rel Quotient3_abs_rep Quotient3_rep_reflp
c21a2465cac1 prefer ephemeral interpretation over interpretation in proof contexts;
haftmann
parents: 54555
diff changeset
   132
  by metis
c21a2465cac1 prefer ephemeral interpretation over interpretation in proof contexts;
haftmann
parents: 54555
diff changeset
   133
c21a2465cac1 prefer ephemeral interpretation over interpretation in proof contexts;
haftmann
parents: 54555
diff changeset
   134
end
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   135
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   136
lemma identity_quotient3:
67399
eab6ce8368fa ran isabelle update_op on all sources
nipkow
parents: 67091
diff changeset
   137
  "Quotient3 (=) id id"
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   138
  unfolding Quotient3_def id_def
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   139
  by blast
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   140
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   141
lemma fun_quotient3:
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   142
  assumes q1: "Quotient3 R1 abs1 rep1"
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   143
  and     q2: "Quotient3 R2 abs2 rep2"
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   144
  shows "Quotient3 (R1 ===> R2) (rep1 ---> abs2) (abs1 ---> rep2)"
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   145
proof -
69990
eb072ce80f82 tuned proofs;
wenzelm
parents: 69913
diff changeset
   146
  have "(rep1 ---> abs2) ((abs1 ---> rep2) a) = a" for a
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   147
    using q1 q2 by (simp add: Quotient3_def fun_eq_iff)
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   148
  moreover
69990
eb072ce80f82 tuned proofs;
wenzelm
parents: 69913
diff changeset
   149
  have "(R1 ===> R2) ((abs1 ---> rep2) a) ((abs1 ---> rep2) a)" for a
55945
e96383acecf9 renamed 'fun_rel' to 'rel_fun'
blanchet
parents: 54867
diff changeset
   150
    by (rule rel_funI)
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   151
      (insert q1 q2 Quotient3_rel_abs [of R1 abs1 rep1] Quotient3_rel_rep [of R2 abs2 rep2],
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   152
        simp (no_asm) add: Quotient3_def, simp)
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   153
  moreover
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   154
  have "(R1 ===> R2) r s = ((R1 ===> R2) r r \<and> (R1 ===> R2) s s \<and>
69990
eb072ce80f82 tuned proofs;
wenzelm
parents: 69913
diff changeset
   155
        (rep1 ---> abs2) r  = (rep1 ---> abs2) s)" for r s
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   156
  proof -
55945
e96383acecf9 renamed 'fun_rel' to 'rel_fun'
blanchet
parents: 54867
diff changeset
   157
    have "(R1 ===> R2) r s \<Longrightarrow> (R1 ===> R2) r r" unfolding rel_fun_def
71262
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   158
      using Quotient3_part_equivp[OF q1] Quotient3_part_equivp[OF q2]
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   159
      by (metis (full_types) part_equivp_def)
55945
e96383acecf9 renamed 'fun_rel' to 'rel_fun'
blanchet
parents: 54867
diff changeset
   160
    moreover have "(R1 ===> R2) r s \<Longrightarrow> (R1 ===> R2) s s" unfolding rel_fun_def
71262
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   161
      using Quotient3_part_equivp[OF q1] Quotient3_part_equivp[OF q2]
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   162
      by (metis (full_types) part_equivp_def)
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   163
    moreover have "(R1 ===> R2) r s \<Longrightarrow> (rep1 ---> abs2) r  = (rep1 ---> abs2) s"
69990
eb072ce80f82 tuned proofs;
wenzelm
parents: 69913
diff changeset
   164
      by (auto simp add: rel_fun_def fun_eq_iff)
eb072ce80f82 tuned proofs;
wenzelm
parents: 69913
diff changeset
   165
        (use q1 q2 in \<open>unfold Quotient3_def, metis\<close>)
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   166
    moreover have "((R1 ===> R2) r r \<and> (R1 ===> R2) s s \<and>
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   167
        (rep1 ---> abs2) r  = (rep1 ---> abs2) s) \<Longrightarrow> (R1 ===> R2) r s"
69990
eb072ce80f82 tuned proofs;
wenzelm
parents: 69913
diff changeset
   168
      by (auto simp add: rel_fun_def fun_eq_iff)
eb072ce80f82 tuned proofs;
wenzelm
parents: 69913
diff changeset
   169
        (use q1 q2 in \<open>unfold Quotient3_def, metis map_fun_apply\<close>)
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   170
    ultimately show ?thesis by blast
69990
eb072ce80f82 tuned proofs;
wenzelm
parents: 69913
diff changeset
   171
  qed
eb072ce80f82 tuned proofs;
wenzelm
parents: 69913
diff changeset
   172
  ultimately show ?thesis by (intro Quotient3I) (assumption+)
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   173
qed
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   174
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   175
lemma lambda_prs:
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   176
  assumes q1: "Quotient3 R1 Abs1 Rep1"
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   177
  and     q2: "Quotient3 R2 Abs2 Rep2"
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   178
  shows "(Rep1 ---> Abs2) (\<lambda>x. Rep2 (f (Abs1 x))) = (\<lambda>x. f x)"
39302
d7728f65b353 renamed lemmas: ext_iff -> fun_eq_iff, set_ext_iff -> set_eq_iff, set_ext -> set_eqI
nipkow
parents: 39198
diff changeset
   179
  unfolding fun_eq_iff
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   180
  using Quotient3_abs_rep[OF q1] Quotient3_abs_rep[OF q2]
40814
fa64f6278568 moved generic definitions about (partial) equivalence relations from Quotient to Equiv_Relations;
haftmann
parents: 40615
diff changeset
   181
  by simp
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   182
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   183
lemma lambda_prs1:
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   184
  assumes q1: "Quotient3 R1 Abs1 Rep1"
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   185
  and     q2: "Quotient3 R2 Abs2 Rep2"
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   186
  shows "(Rep1 ---> Abs2) (\<lambda>x. (Abs1 ---> Rep2) f x) = (\<lambda>x. f x)"
39302
d7728f65b353 renamed lemmas: ext_iff -> fun_eq_iff, set_ext_iff -> set_eq_iff, set_ext -> set_eqI
nipkow
parents: 39198
diff changeset
   187
  unfolding fun_eq_iff
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   188
  using Quotient3_abs_rep[OF q1] Quotient3_abs_rep[OF q2]
40814
fa64f6278568 moved generic definitions about (partial) equivalence relations from Quotient to Equiv_Relations;
haftmann
parents: 40615
diff changeset
   189
  by simp
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   190
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 59028
diff changeset
   191
text\<open>
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   192
  In the following theorem R1 can be instantiated with anything,
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   193
  but we know some of the types of the Rep and Abs functions;
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   194
  so by solving Quotient assumptions we can get a unique R1 that
61799
4cf66f21b764 isabelle update_cartouches -c -t;
wenzelm
parents: 60758
diff changeset
   195
  will be provable; which is why we need to use \<open>apply_rsp\<close> and
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 59028
diff changeset
   196
  not the primed version\<close>
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   197
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   198
lemma apply_rspQ3:
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   199
  fixes f g::"'a \<Rightarrow> 'c"
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   200
  assumes q: "Quotient3 R1 Abs1 Rep1"
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   201
  and     a: "(R1 ===> R2) f g" "R1 x y"
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   202
  shows "R2 (f x) (g y)"
55945
e96383acecf9 renamed 'fun_rel' to 'rel_fun'
blanchet
parents: 54867
diff changeset
   203
  using a by (auto elim: rel_funE)
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   204
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   205
lemma apply_rspQ3'':
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   206
  assumes "Quotient3 R Abs Rep"
47096
3ea48c19673e generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
kuncar
parents: 47094
diff changeset
   207
  and "(R ===> S) f f"
3ea48c19673e generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
kuncar
parents: 47094
diff changeset
   208
  shows "S (f (Rep x)) (f (Rep x))"
3ea48c19673e generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
kuncar
parents: 47094
diff changeset
   209
proof -
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   210
  from assms(1) have "R (Rep x) (Rep x)" by (rule Quotient3_rep_reflp)
47096
3ea48c19673e generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
kuncar
parents: 47094
diff changeset
   211
  then show ?thesis using assms(2) by (auto intro: apply_rsp')
3ea48c19673e generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
kuncar
parents: 47094
diff changeset
   212
qed
3ea48c19673e generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
kuncar
parents: 47094
diff changeset
   213
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 59028
diff changeset
   214
subsection \<open>lemmas for regularisation of ball and bex\<close>
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   215
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   216
lemma ball_reg_eqv:
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   217
  fixes P :: "'a \<Rightarrow> bool"
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   218
  assumes a: "equivp R"
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   219
  shows "Ball (Respects R) P = (All P)"
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   220
  using a
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   221
  unfolding equivp_def
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   222
  by (auto simp add: in_respects)
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   223
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   224
lemma bex_reg_eqv:
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   225
  fixes P :: "'a \<Rightarrow> bool"
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   226
  assumes a: "equivp R"
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   227
  shows "Bex (Respects R) P = (Ex P)"
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   228
  using a
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   229
  unfolding equivp_def
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   230
  by (auto simp add: in_respects)
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   231
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   232
lemma ball_reg_right:
44553
4d39b032a021 avoid intermixing set and predicates; dropped lemmas mem_rsp and mem_prs (now in Quotient_Set.thy)
haftmann
parents: 44413
diff changeset
   233
  assumes a: "\<And>x. x \<in> R \<Longrightarrow> P x \<longrightarrow> Q x"
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   234
  shows "All P \<longrightarrow> Ball R Q"
44921
58eef4843641 tuned proofs
huffman
parents: 44553
diff changeset
   235
  using a by fast
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   236
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   237
lemma bex_reg_left:
44553
4d39b032a021 avoid intermixing set and predicates; dropped lemmas mem_rsp and mem_prs (now in Quotient_Set.thy)
haftmann
parents: 44413
diff changeset
   238
  assumes a: "\<And>x. x \<in> R \<Longrightarrow> Q x \<longrightarrow> P x"
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   239
  shows "Bex R Q \<longrightarrow> Ex P"
44921
58eef4843641 tuned proofs
huffman
parents: 44553
diff changeset
   240
  using a by fast
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   241
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   242
lemma ball_reg_left:
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   243
  assumes a: "equivp R"
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   244
  shows "(\<And>x. (Q x \<longrightarrow> P x)) \<Longrightarrow> Ball (Respects R) Q \<longrightarrow> All P"
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   245
  using a by (metis equivp_reflp in_respects)
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   246
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   247
lemma bex_reg_right:
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   248
  assumes a: "equivp R"
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   249
  shows "(\<And>x. (Q x \<longrightarrow> P x)) \<Longrightarrow> Ex Q \<longrightarrow> Bex (Respects R) P"
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   250
  using a by (metis equivp_reflp in_respects)
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   251
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   252
lemma ball_reg_eqv_range:
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   253
  fixes P::"'a \<Rightarrow> bool"
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   254
  and x::"'a"
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   255
  assumes a: "equivp R2"
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   256
  shows   "(Ball (Respects (R1 ===> R2)) (\<lambda>f. P (f x)) = All (\<lambda>f. P (f x)))"
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   257
  apply(rule iffI)
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   258
  apply(rule allI)
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   259
  apply(drule_tac x="\<lambda>y. f x" in bspec)
55945
e96383acecf9 renamed 'fun_rel' to 'rel_fun'
blanchet
parents: 54867
diff changeset
   260
  apply(simp add: in_respects rel_fun_def)
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   261
  apply(rule impI)
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   262
  using a equivp_reflp_symp_transp[of "R2"]
40814
fa64f6278568 moved generic definitions about (partial) equivalence relations from Quotient to Equiv_Relations;
haftmann
parents: 40615
diff changeset
   263
  apply (auto elim: equivpE reflpE)
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   264
  done
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   265
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   266
lemma bex_reg_eqv_range:
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   267
  assumes a: "equivp R2"
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   268
  shows   "(Bex (Respects (R1 ===> R2)) (\<lambda>f. P (f x)) = Ex (\<lambda>f. P (f x)))"
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   269
  apply(auto)
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   270
  apply(rule_tac x="\<lambda>y. f x" in bexI)
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   271
  apply(simp)
55945
e96383acecf9 renamed 'fun_rel' to 'rel_fun'
blanchet
parents: 54867
diff changeset
   272
  apply(simp add: Respects_def in_respects rel_fun_def)
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   273
  apply(rule impI)
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   274
  using a equivp_reflp_symp_transp[of "R2"]
40814
fa64f6278568 moved generic definitions about (partial) equivalence relations from Quotient to Equiv_Relations;
haftmann
parents: 40615
diff changeset
   275
  apply (auto elim: equivpE reflpE)
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   276
  done
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   277
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   278
(* Next four lemmas are unused *)
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   279
lemma all_reg:
67091
1393c2340eec more symbols;
wenzelm
parents: 63343
diff changeset
   280
  assumes a: "\<forall>x :: 'a. (P x \<longrightarrow> Q x)"
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   281
  and     b: "All P"
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   282
  shows "All Q"
44921
58eef4843641 tuned proofs
huffman
parents: 44553
diff changeset
   283
  using a b by fast
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   284
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   285
lemma ex_reg:
67091
1393c2340eec more symbols;
wenzelm
parents: 63343
diff changeset
   286
  assumes a: "\<forall>x :: 'a. (P x \<longrightarrow> Q x)"
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   287
  and     b: "Ex P"
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   288
  shows "Ex Q"
44921
58eef4843641 tuned proofs
huffman
parents: 44553
diff changeset
   289
  using a b by fast
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   290
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   291
lemma ball_reg:
67091
1393c2340eec more symbols;
wenzelm
parents: 63343
diff changeset
   292
  assumes a: "\<forall>x :: 'a. (x \<in> R \<longrightarrow> P x \<longrightarrow> Q x)"
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   293
  and     b: "Ball R P"
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   294
  shows "Ball R Q"
44921
58eef4843641 tuned proofs
huffman
parents: 44553
diff changeset
   295
  using a b by fast
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   296
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   297
lemma bex_reg:
67091
1393c2340eec more symbols;
wenzelm
parents: 63343
diff changeset
   298
  assumes a: "\<forall>x :: 'a. (x \<in> R \<longrightarrow> P x \<longrightarrow> Q x)"
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   299
  and     b: "Bex R P"
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   300
  shows "Bex R Q"
44921
58eef4843641 tuned proofs
huffman
parents: 44553
diff changeset
   301
  using a b by fast
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   302
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   303
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   304
lemma ball_all_comm:
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   305
  assumes "\<And>y. (\<forall>x\<in>P. A x y) \<longrightarrow> (\<forall>x. B x y)"
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   306
  shows "(\<forall>x\<in>P. \<forall>y. A x y) \<longrightarrow> (\<forall>x. \<forall>y. B x y)"
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   307
  using assms by auto
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   308
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   309
lemma bex_ex_comm:
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   310
  assumes "(\<exists>y. \<exists>x. A x y) \<longrightarrow> (\<exists>y. \<exists>x\<in>P. B x y)"
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   311
  shows "(\<exists>x. \<exists>y. A x y) \<longrightarrow> (\<exists>x\<in>P. \<exists>y. B x y)"
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   312
  using assms by auto
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   313
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 59028
diff changeset
   314
subsection \<open>Bounded abstraction\<close>
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   315
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   316
definition
40466
c6587375088e type annotations in specifications; fun_rel_def is no simp rule by default; slightly changed fun_map_def; more on predicates on relation functions; proper HOL equations in definitions
haftmann
parents: 40031
diff changeset
   317
  Babs :: "'a set \<Rightarrow> ('a \<Rightarrow> 'b) \<Rightarrow> 'a \<Rightarrow> 'b"
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   318
where
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   319
  "x \<in> p \<Longrightarrow> Babs p m x = m x"
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   320
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   321
lemma babs_rsp:
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   322
  assumes q: "Quotient3 R1 Abs1 Rep1"
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   323
  and     a: "(R1 ===> R2) f g"
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   324
  shows      "(R1 ===> R2) (Babs (Respects R1) f) (Babs (Respects R1) g)"
55945
e96383acecf9 renamed 'fun_rel' to 'rel_fun'
blanchet
parents: 54867
diff changeset
   325
  apply (auto simp add: Babs_def in_respects rel_fun_def)
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   326
  apply (subgoal_tac "x \<in> Respects R1 \<and> y \<in> Respects R1")
55945
e96383acecf9 renamed 'fun_rel' to 'rel_fun'
blanchet
parents: 54867
diff changeset
   327
  using a apply (simp add: Babs_def rel_fun_def)
e96383acecf9 renamed 'fun_rel' to 'rel_fun'
blanchet
parents: 54867
diff changeset
   328
  apply (simp add: in_respects rel_fun_def)
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   329
  using Quotient3_rel[OF q]
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   330
  by metis
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   331
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   332
lemma babs_prs:
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   333
  assumes q1: "Quotient3 R1 Abs1 Rep1"
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   334
  and     q2: "Quotient3 R2 Abs2 Rep2"
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   335
  shows "((Rep1 ---> Abs2) (Babs (Respects R1) ((Abs1 ---> Rep2) f))) = f"
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   336
  apply (rule ext)
40466
c6587375088e type annotations in specifications; fun_rel_def is no simp rule by default; slightly changed fun_map_def; more on predicates on relation functions; proper HOL equations in definitions
haftmann
parents: 40031
diff changeset
   337
  apply (simp add:)
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   338
  apply (subgoal_tac "Rep1 x \<in> Respects R1")
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   339
  apply (simp add: Babs_def Quotient3_abs_rep[OF q1] Quotient3_abs_rep[OF q2])
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   340
  apply (simp add: in_respects Quotient3_rel_rep[OF q1])
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   341
  done
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   342
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   343
lemma babs_simp:
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   344
  assumes q: "Quotient3 R1 Abs Rep"
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   345
  shows "((R1 ===> R2) (Babs (Respects R1) f) (Babs (Respects R1) g)) = ((R1 ===> R2) f g)"
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   346
  apply(rule iffI)
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   347
  apply(simp_all only: babs_rsp[OF q])
55945
e96383acecf9 renamed 'fun_rel' to 'rel_fun'
blanchet
parents: 54867
diff changeset
   348
  apply(auto simp add: Babs_def rel_fun_def)
68615
3ed4ff0b7ac4 de-applying
paulson <lp15@cam.ac.uk>
parents: 67399
diff changeset
   349
  apply(metis Babs_def in_respects  Quotient3_rel[OF q])
3ed4ff0b7ac4 de-applying
paulson <lp15@cam.ac.uk>
parents: 67399
diff changeset
   350
  done
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   351
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   352
(* If a user proves that a particular functional relation
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   353
   is an equivalence this may be useful in regularising *)
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   354
lemma babs_reg_eqv:
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   355
  shows "equivp R \<Longrightarrow> Babs (Respects R) P = P"
39302
d7728f65b353 renamed lemmas: ext_iff -> fun_eq_iff, set_ext_iff -> set_eq_iff, set_ext -> set_eqI
nipkow
parents: 39198
diff changeset
   356
  by (simp add: fun_eq_iff Babs_def in_respects equivp_reflp)
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   357
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   358
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   359
(* 3 lemmas needed for proving repabs_inj *)
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   360
lemma ball_rsp:
67399
eab6ce8368fa ran isabelle update_op on all sources
nipkow
parents: 67091
diff changeset
   361
  assumes a: "(R ===> (=)) f g"
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   362
  shows "Ball (Respects R) f = Ball (Respects R) g"
55945
e96383acecf9 renamed 'fun_rel' to 'rel_fun'
blanchet
parents: 54867
diff changeset
   363
  using a by (auto simp add: Ball_def in_respects elim: rel_funE)
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   364
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   365
lemma bex_rsp:
67399
eab6ce8368fa ran isabelle update_op on all sources
nipkow
parents: 67091
diff changeset
   366
  assumes a: "(R ===> (=)) f g"
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   367
  shows "(Bex (Respects R) f = Bex (Respects R) g)"
55945
e96383acecf9 renamed 'fun_rel' to 'rel_fun'
blanchet
parents: 54867
diff changeset
   368
  using a by (auto simp add: Bex_def in_respects elim: rel_funE)
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   369
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   370
lemma bex1_rsp:
67399
eab6ce8368fa ran isabelle update_op on all sources
nipkow
parents: 67091
diff changeset
   371
  assumes a: "(R ===> (=)) f g"
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   372
  shows "Ex1 (\<lambda>x. x \<in> Respects R \<and> f x) = Ex1 (\<lambda>x. x \<in> Respects R \<and> g x)"
71262
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   373
  using a by (auto elim: rel_funE simp add: Ex1_def in_respects)
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   374
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   375
(* 2 lemmas needed for cleaning of quantifiers *)
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   376
lemma all_prs:
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   377
  assumes a: "Quotient3 R absf repf"
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   378
  shows "Ball (Respects R) ((absf ---> id) f) = All f"
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   379
  using a unfolding Quotient3_def Ball_def in_respects id_apply comp_def map_fun_def
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   380
  by metis
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   381
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   382
lemma ex_prs:
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   383
  assumes a: "Quotient3 R absf repf"
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   384
  shows "Bex (Respects R) ((absf ---> id) f) = Ex f"
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   385
  using a unfolding Quotient3_def Bex_def in_respects id_apply comp_def map_fun_def
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   386
  by metis
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   387
61799
4cf66f21b764 isabelle update_cartouches -c -t;
wenzelm
parents: 60758
diff changeset
   388
subsection \<open>\<open>Bex1_rel\<close> quantifier\<close>
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   389
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   390
definition
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   391
  Bex1_rel :: "('a \<Rightarrow> 'a \<Rightarrow> bool) \<Rightarrow> ('a \<Rightarrow> bool) \<Rightarrow> bool"
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   392
where
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   393
  "Bex1_rel R P \<longleftrightarrow> (\<exists>x \<in> Respects R. P x) \<and> (\<forall>x \<in> Respects R. \<forall>y \<in> Respects R. ((P x \<and> P y) \<longrightarrow> (R x y)))"
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   394
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   395
lemma bex1_rel_aux:
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   396
  "\<lbrakk>\<forall>xa ya. R xa ya \<longrightarrow> x xa = y ya; Bex1_rel R x\<rbrakk> \<Longrightarrow> Bex1_rel R y"
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   397
  unfolding Bex1_rel_def
68615
3ed4ff0b7ac4 de-applying
paulson <lp15@cam.ac.uk>
parents: 67399
diff changeset
   398
  by (metis in_respects)
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   399
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   400
lemma bex1_rel_aux2:
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   401
  "\<lbrakk>\<forall>xa ya. R xa ya \<longrightarrow> x xa = y ya; Bex1_rel R y\<rbrakk> \<Longrightarrow> Bex1_rel R x"
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   402
  unfolding Bex1_rel_def
68615
3ed4ff0b7ac4 de-applying
paulson <lp15@cam.ac.uk>
parents: 67399
diff changeset
   403
  by (metis in_respects)
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   404
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   405
lemma bex1_rel_rsp:
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   406
  assumes a: "Quotient3 R absf repf"
67399
eab6ce8368fa ran isabelle update_op on all sources
nipkow
parents: 67091
diff changeset
   407
  shows "((R ===> (=)) ===> (=)) (Bex1_rel R) (Bex1_rel R)"
68615
3ed4ff0b7ac4 de-applying
paulson <lp15@cam.ac.uk>
parents: 67399
diff changeset
   408
  unfolding rel_fun_def by (metis bex1_rel_aux bex1_rel_aux2)
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   409
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   410
lemma ex1_prs:
68616
cedf3480fdad de-applying (mostly Quotient)
paulson <lp15@cam.ac.uk>
parents: 68615
diff changeset
   411
  assumes "Quotient3 R absf repf"
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   412
  shows "((absf ---> id) ---> id) (Bex1_rel R) f = Ex1 f"
68616
cedf3480fdad de-applying (mostly Quotient)
paulson <lp15@cam.ac.uk>
parents: 68615
diff changeset
   413
  apply (auto simp: Bex1_rel_def Respects_def)
cedf3480fdad de-applying (mostly Quotient)
paulson <lp15@cam.ac.uk>
parents: 68615
diff changeset
   414
  apply (metis Quotient3_def assms)
cedf3480fdad de-applying (mostly Quotient)
paulson <lp15@cam.ac.uk>
parents: 68615
diff changeset
   415
  apply (metis (full_types) Quotient3_def assms)
cedf3480fdad de-applying (mostly Quotient)
paulson <lp15@cam.ac.uk>
parents: 68615
diff changeset
   416
  by (meson Quotient3_rel assms)
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   417
38702
72fd257f4343 Quotient Package / lemma for regularization of bex1_rel for equivalence relations
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 38317
diff changeset
   418
lemma bex1_bexeq_reg:
72fd257f4343 Quotient Package / lemma for regularization of bex1_rel for equivalence relations
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 38317
diff changeset
   419
  shows "(\<exists>!x\<in>Respects R. P x) \<longrightarrow> (Bex1_rel R (\<lambda>x. P x))"
56073
29e308b56d23 enhanced simplifier solver for preconditions of rewrite rule, can now deal with conjunctions
nipkow
parents: 55945
diff changeset
   420
  by (auto simp add: Ex1_def Bex1_rel_def Bex_def Ball_def in_respects)
71262
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   421
38702
72fd257f4343 Quotient Package / lemma for regularization of bex1_rel for equivalence relations
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 38317
diff changeset
   422
lemma bex1_bexeq_reg_eqv:
72fd257f4343 Quotient Package / lemma for regularization of bex1_rel for equivalence relations
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 38317
diff changeset
   423
  assumes a: "equivp R"
72fd257f4343 Quotient Package / lemma for regularization of bex1_rel for equivalence relations
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 38317
diff changeset
   424
  shows "(\<exists>!x. P x) \<longrightarrow> Bex1_rel R P"
72fd257f4343 Quotient Package / lemma for regularization of bex1_rel for equivalence relations
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 38317
diff changeset
   425
  using equivp_reflp[OF a]
68616
cedf3480fdad de-applying (mostly Quotient)
paulson <lp15@cam.ac.uk>
parents: 68615
diff changeset
   426
  by (metis (full_types) Bex1_rel_def in_respects)
38702
72fd257f4343 Quotient Package / lemma for regularization of bex1_rel for equivalence relations
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 38317
diff changeset
   427
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 59028
diff changeset
   428
subsection \<open>Various respects and preserve lemmas\<close>
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   429
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   430
lemma quot_rel_rsp:
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   431
  assumes a: "Quotient3 R Abs Rep"
67399
eab6ce8368fa ran isabelle update_op on all sources
nipkow
parents: 67091
diff changeset
   432
  shows "(R ===> R ===> (=)) R R"
55945
e96383acecf9 renamed 'fun_rel' to 'rel_fun'
blanchet
parents: 54867
diff changeset
   433
  apply(rule rel_funI)+
68616
cedf3480fdad de-applying (mostly Quotient)
paulson <lp15@cam.ac.uk>
parents: 68615
diff changeset
   434
  by (meson assms equals_rsp)
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   435
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   436
lemma o_prs:
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   437
  assumes q1: "Quotient3 R1 Abs1 Rep1"
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   438
  and     q2: "Quotient3 R2 Abs2 Rep2"
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   439
  and     q3: "Quotient3 R3 Abs3 Rep3"
67399
eab6ce8368fa ran isabelle update_op on all sources
nipkow
parents: 67091
diff changeset
   440
  shows "((Abs2 ---> Rep3) ---> (Abs1 ---> Rep2) ---> (Rep1 ---> Abs3)) (\<circ>) = (\<circ>)"
eab6ce8368fa ran isabelle update_op on all sources
nipkow
parents: 67091
diff changeset
   441
  and   "(id ---> (Abs1 ---> id) ---> Rep1 ---> id) (\<circ>) = (\<circ>)"
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   442
  using Quotient3_abs_rep[OF q1] Quotient3_abs_rep[OF q2] Quotient3_abs_rep[OF q3]
40466
c6587375088e type annotations in specifications; fun_rel_def is no simp rule by default; slightly changed fun_map_def; more on predicates on relation functions; proper HOL equations in definitions
haftmann
parents: 40031
diff changeset
   443
  by (simp_all add: fun_eq_iff)
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   444
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   445
lemma o_rsp:
67399
eab6ce8368fa ran isabelle update_op on all sources
nipkow
parents: 67091
diff changeset
   446
  "((R2 ===> R3) ===> (R1 ===> R2) ===> (R1 ===> R3)) (\<circ>) (\<circ>)"
eab6ce8368fa ran isabelle update_op on all sources
nipkow
parents: 67091
diff changeset
   447
  "((=) ===> (R1 ===> (=)) ===> R1 ===> (=)) (\<circ>) (\<circ>)"
55945
e96383acecf9 renamed 'fun_rel' to 'rel_fun'
blanchet
parents: 54867
diff changeset
   448
  by (force elim: rel_funE)+
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   449
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   450
lemma cond_prs:
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   451
  assumes a: "Quotient3 R absf repf"
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   452
  shows "absf (if a then repf b else repf c) = (if a then b else c)"
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   453
  using a unfolding Quotient3_def by auto
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   454
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   455
lemma if_prs:
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   456
  assumes q: "Quotient3 R Abs Rep"
36123
7f877bbad5b2 add If respectfullness and preservation to Quotient package database
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 36116
diff changeset
   457
  shows "(id ---> Rep ---> Rep ---> Abs) If = If"
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   458
  using Quotient3_abs_rep[OF q]
39302
d7728f65b353 renamed lemmas: ext_iff -> fun_eq_iff, set_ext_iff -> set_eq_iff, set_ext -> set_eqI
nipkow
parents: 39198
diff changeset
   459
  by (auto simp add: fun_eq_iff)
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   460
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   461
lemma if_rsp:
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   462
  assumes q: "Quotient3 R Abs Rep"
67399
eab6ce8368fa ran isabelle update_op on all sources
nipkow
parents: 67091
diff changeset
   463
  shows "((=) ===> R ===> R ===> R) If If"
44921
58eef4843641 tuned proofs
huffman
parents: 44553
diff changeset
   464
  by force
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   465
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   466
lemma let_prs:
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   467
  assumes q1: "Quotient3 R1 Abs1 Rep1"
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   468
  and     q2: "Quotient3 R2 Abs2 Rep2"
37049
ca1c293e521e Let rsp and prs in fun_rel/fun_map format
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 36276
diff changeset
   469
  shows "(Rep2 ---> (Abs2 ---> Rep1) ---> Abs1) Let = Let"
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   470
  using Quotient3_abs_rep[OF q1] Quotient3_abs_rep[OF q2]
39302
d7728f65b353 renamed lemmas: ext_iff -> fun_eq_iff, set_ext_iff -> set_eq_iff, set_ext -> set_eqI
nipkow
parents: 39198
diff changeset
   471
  by (auto simp add: fun_eq_iff)
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   472
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   473
lemma let_rsp:
37049
ca1c293e521e Let rsp and prs in fun_rel/fun_map format
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 36276
diff changeset
   474
  shows "(R1 ===> (R1 ===> R2) ===> R2) Let Let"
55945
e96383acecf9 renamed 'fun_rel' to 'rel_fun'
blanchet
parents: 54867
diff changeset
   475
  by (force elim: rel_funE)
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   476
39669
9e3b035841e4 quotient package: respectfulness and preservation of identity.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 39302
diff changeset
   477
lemma id_rsp:
9e3b035841e4 quotient package: respectfulness and preservation of identity.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 39302
diff changeset
   478
  shows "(R ===> R) id id"
44921
58eef4843641 tuned proofs
huffman
parents: 44553
diff changeset
   479
  by auto
39669
9e3b035841e4 quotient package: respectfulness and preservation of identity.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 39302
diff changeset
   480
9e3b035841e4 quotient package: respectfulness and preservation of identity.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 39302
diff changeset
   481
lemma id_prs:
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   482
  assumes a: "Quotient3 R Abs Rep"
39669
9e3b035841e4 quotient package: respectfulness and preservation of identity.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 39302
diff changeset
   483
  shows "(Rep ---> Abs) id = id"
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   484
  by (simp add: fun_eq_iff Quotient3_abs_rep [OF a])
39669
9e3b035841e4 quotient package: respectfulness and preservation of identity.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 39302
diff changeset
   485
53011
aeee0a4be6cf introduce locale with syntax for fun_rel and map_fun and make thus ===> and ---> local
kuncar
parents: 51112
diff changeset
   486
end
39669
9e3b035841e4 quotient package: respectfulness and preservation of identity.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 39302
diff changeset
   487
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   488
locale quot_type =
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   489
  fixes R :: "'a \<Rightarrow> 'a \<Rightarrow> bool"
44204
3cdc4176638c Quotient Package: make quotient_type work with separate set type
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 42814
diff changeset
   490
  and   Abs :: "'a set \<Rightarrow> 'b"
3cdc4176638c Quotient Package: make quotient_type work with separate set type
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 42814
diff changeset
   491
  and   Rep :: "'b \<Rightarrow> 'a set"
37493
2377d246a631 Quotient package now uses Partial Equivalence instead place of equivalence
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 37049
diff changeset
   492
  assumes equivp: "part_equivp R"
44204
3cdc4176638c Quotient Package: make quotient_type work with separate set type
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 42814
diff changeset
   493
  and     rep_prop: "\<And>y. \<exists>x. R x x \<and> Rep y = Collect (R x)"
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   494
  and     rep_inverse: "\<And>x. Abs (Rep x) = x"
44204
3cdc4176638c Quotient Package: make quotient_type work with separate set type
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 42814
diff changeset
   495
  and     abs_inverse: "\<And>c. (\<exists>x. ((R x x) \<and> (c = Collect (R x)))) \<Longrightarrow> (Rep (Abs c)) = c"
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   496
  and     rep_inject: "\<And>x y. (Rep x = Rep y) = (x = y)"
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   497
begin
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   498
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   499
definition
40466
c6587375088e type annotations in specifications; fun_rel_def is no simp rule by default; slightly changed fun_map_def; more on predicates on relation functions; proper HOL equations in definitions
haftmann
parents: 40031
diff changeset
   500
  abs :: "'a \<Rightarrow> 'b"
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   501
where
44204
3cdc4176638c Quotient Package: make quotient_type work with separate set type
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 42814
diff changeset
   502
  "abs x = Abs (Collect (R x))"
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   503
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   504
definition
40466
c6587375088e type annotations in specifications; fun_rel_def is no simp rule by default; slightly changed fun_map_def; more on predicates on relation functions; proper HOL equations in definitions
haftmann
parents: 40031
diff changeset
   505
  rep :: "'b \<Rightarrow> 'a"
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   506
where
44204
3cdc4176638c Quotient Package: make quotient_type work with separate set type
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 42814
diff changeset
   507
  "rep a = (SOME x. x \<in> Rep a)"
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   508
44204
3cdc4176638c Quotient Package: make quotient_type work with separate set type
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 42814
diff changeset
   509
lemma some_collect:
37493
2377d246a631 Quotient package now uses Partial Equivalence instead place of equivalence
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 37049
diff changeset
   510
  assumes "R r r"
44204
3cdc4176638c Quotient Package: make quotient_type work with separate set type
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 42814
diff changeset
   511
  shows "R (SOME x. x \<in> Collect (R r)) = R r"
3cdc4176638c Quotient Package: make quotient_type work with separate set type
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 42814
diff changeset
   512
  apply simp
3cdc4176638c Quotient Package: make quotient_type work with separate set type
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 42814
diff changeset
   513
  by (metis assms exE_some equivp[simplified part_equivp_def])
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   514
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   515
lemma Quotient:
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   516
  shows "Quotient3 R abs rep"
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   517
  unfolding Quotient3_def abs_def rep_def
37493
2377d246a631 Quotient package now uses Partial Equivalence instead place of equivalence
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 37049
diff changeset
   518
  proof (intro conjI allI)
2377d246a631 Quotient package now uses Partial Equivalence instead place of equivalence
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 37049
diff changeset
   519
    fix a r s
44204
3cdc4176638c Quotient Package: make quotient_type work with separate set type
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 42814
diff changeset
   520
    show x: "R (SOME x. x \<in> Rep a) (SOME x. x \<in> Rep a)" proof -
3cdc4176638c Quotient Package: make quotient_type work with separate set type
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 42814
diff changeset
   521
      obtain x where r: "R x x" and rep: "Rep a = Collect (R x)" using rep_prop[of a] by auto
3cdc4176638c Quotient Package: make quotient_type work with separate set type
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 42814
diff changeset
   522
      have "R (SOME x. x \<in> Rep a) x"  using r rep some_collect by metis
3cdc4176638c Quotient Package: make quotient_type work with separate set type
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 42814
diff changeset
   523
      then have "R x (SOME x. x \<in> Rep a)" using part_equivp_symp[OF equivp] by fast
3cdc4176638c Quotient Package: make quotient_type work with separate set type
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 42814
diff changeset
   524
      then show "R (SOME x. x \<in> Rep a) (SOME x. x \<in> Rep a)"
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 59028
diff changeset
   525
        using part_equivp_transp[OF equivp] by (metis \<open>R (SOME x. x \<in> Rep a) x\<close>)
37493
2377d246a631 Quotient package now uses Partial Equivalence instead place of equivalence
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 37049
diff changeset
   526
    qed
44204
3cdc4176638c Quotient Package: make quotient_type work with separate set type
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 42814
diff changeset
   527
    have "Collect (R (SOME x. x \<in> Rep a)) = (Rep a)" by (metis some_collect rep_prop)
3cdc4176638c Quotient Package: make quotient_type work with separate set type
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 42814
diff changeset
   528
    then show "Abs (Collect (R (SOME x. x \<in> Rep a))) = a" using rep_inverse by auto
3cdc4176638c Quotient Package: make quotient_type work with separate set type
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 42814
diff changeset
   529
    have "R r r \<Longrightarrow> R s s \<Longrightarrow> Abs (Collect (R r)) = Abs (Collect (R s)) \<longleftrightarrow> R r = R s"
44242
a5cb6aa77ffc avoid Collect_def in proof
haftmann
parents: 44204
diff changeset
   530
    proof -
a5cb6aa77ffc avoid Collect_def in proof
haftmann
parents: 44204
diff changeset
   531
      assume "R r r" and "R s s"
a5cb6aa77ffc avoid Collect_def in proof
haftmann
parents: 44204
diff changeset
   532
      then have "Abs (Collect (R r)) = Abs (Collect (R s)) \<longleftrightarrow> Collect (R r) = Collect (R s)"
a5cb6aa77ffc avoid Collect_def in proof
haftmann
parents: 44204
diff changeset
   533
        by (metis abs_inverse)
a5cb6aa77ffc avoid Collect_def in proof
haftmann
parents: 44204
diff changeset
   534
      also have "Collect (R r) = Collect (R s) \<longleftrightarrow> (\<lambda>A x. x \<in> A) (Collect (R r)) = (\<lambda>A x. x \<in> A) (Collect (R s))"
a5cb6aa77ffc avoid Collect_def in proof
haftmann
parents: 44204
diff changeset
   535
        by rule simp_all
a5cb6aa77ffc avoid Collect_def in proof
haftmann
parents: 44204
diff changeset
   536
      finally show "Abs (Collect (R r)) = Abs (Collect (R s)) \<longleftrightarrow> R r = R s" by simp
a5cb6aa77ffc avoid Collect_def in proof
haftmann
parents: 44204
diff changeset
   537
    qed
44204
3cdc4176638c Quotient Package: make quotient_type work with separate set type
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 42814
diff changeset
   538
    then show "R r s \<longleftrightarrow> R r r \<and> R s s \<and> (Abs (Collect (R r)) = Abs (Collect (R s)))"
3cdc4176638c Quotient Package: make quotient_type work with separate set type
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 42814
diff changeset
   539
      using equivp[simplified part_equivp_def] by metis
3cdc4176638c Quotient Package: make quotient_type work with separate set type
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 42814
diff changeset
   540
    qed
44242
a5cb6aa77ffc avoid Collect_def in proof
haftmann
parents: 44204
diff changeset
   541
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   542
end
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   543
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 59028
diff changeset
   544
subsection \<open>Quotient composition\<close>
47096
3ea48c19673e generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
kuncar
parents: 47094
diff changeset
   545
68616
cedf3480fdad de-applying (mostly Quotient)
paulson <lp15@cam.ac.uk>
parents: 68615
diff changeset
   546
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   547
lemma OOO_quotient3:
47096
3ea48c19673e generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
kuncar
parents: 47094
diff changeset
   548
  fixes R1 :: "'a \<Rightarrow> 'a \<Rightarrow> bool"
3ea48c19673e generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
kuncar
parents: 47094
diff changeset
   549
  fixes Abs1 :: "'a \<Rightarrow> 'b" and Rep1 :: "'b \<Rightarrow> 'a"
3ea48c19673e generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
kuncar
parents: 47094
diff changeset
   550
  fixes Abs2 :: "'b \<Rightarrow> 'c" and Rep2 :: "'c \<Rightarrow> 'b"
3ea48c19673e generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
kuncar
parents: 47094
diff changeset
   551
  fixes R2' :: "'a \<Rightarrow> 'a \<Rightarrow> bool"
3ea48c19673e generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
kuncar
parents: 47094
diff changeset
   552
  fixes R2 :: "'b \<Rightarrow> 'b \<Rightarrow> bool"
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   553
  assumes R1: "Quotient3 R1 Abs1 Rep1"
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   554
  assumes R2: "Quotient3 R2 Abs2 Rep2"
47096
3ea48c19673e generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
kuncar
parents: 47094
diff changeset
   555
  assumes Abs1: "\<And>x y. R2' x y \<Longrightarrow> R1 x x \<Longrightarrow> R1 y y \<Longrightarrow> R2 (Abs1 x) (Abs1 y)"
3ea48c19673e generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
kuncar
parents: 47094
diff changeset
   556
  assumes Rep1: "\<And>x y. R2 x y \<Longrightarrow> R2' (Rep1 x) (Rep1 y)"
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   557
  shows "Quotient3 (R1 OO R2' OO R1) (Abs2 \<circ> Abs1) (Rep1 \<circ> Rep2)"
68616
cedf3480fdad de-applying (mostly Quotient)
paulson <lp15@cam.ac.uk>
parents: 68615
diff changeset
   558
proof -
71262
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   559
  have *: "(R1 OOO R2') r r \<and> (R1 OOO R2') s s \<and> (Abs2 \<circ> Abs1) r = (Abs2 \<circ> Abs1) s
68616
cedf3480fdad de-applying (mostly Quotient)
paulson <lp15@cam.ac.uk>
parents: 68615
diff changeset
   560
           \<longleftrightarrow> (R1 OOO R2') r s" for r s
cedf3480fdad de-applying (mostly Quotient)
paulson <lp15@cam.ac.uk>
parents: 68615
diff changeset
   561
    apply safe
cedf3480fdad de-applying (mostly Quotient)
paulson <lp15@cam.ac.uk>
parents: 68615
diff changeset
   562
    subgoal for a b c d
cedf3480fdad de-applying (mostly Quotient)
paulson <lp15@cam.ac.uk>
parents: 68615
diff changeset
   563
      apply simp
cedf3480fdad de-applying (mostly Quotient)
paulson <lp15@cam.ac.uk>
parents: 68615
diff changeset
   564
      apply (rule_tac b="Rep1 (Abs1 r)" in relcomppI)
cedf3480fdad de-applying (mostly Quotient)
paulson <lp15@cam.ac.uk>
parents: 68615
diff changeset
   565
      using Quotient3_refl1 R1 rep_abs_rsp apply fastforce
cedf3480fdad de-applying (mostly Quotient)
paulson <lp15@cam.ac.uk>
parents: 68615
diff changeset
   566
      apply (rule_tac b="Rep1 (Abs1 s)" in relcomppI)
cedf3480fdad de-applying (mostly Quotient)
paulson <lp15@cam.ac.uk>
parents: 68615
diff changeset
   567
       apply (metis (full_types) Rep1 Abs1 Quotient3_rel R2  Quotient3_refl1 [OF R1] Quotient3_refl2 [OF R1] Quotient3_rel_abs [OF R1])
cedf3480fdad de-applying (mostly Quotient)
paulson <lp15@cam.ac.uk>
parents: 68615
diff changeset
   568
      by (metis Quotient3_rel R1 rep_abs_rsp_left)
cedf3480fdad de-applying (mostly Quotient)
paulson <lp15@cam.ac.uk>
parents: 68615
diff changeset
   569
    subgoal for x y
cedf3480fdad de-applying (mostly Quotient)
paulson <lp15@cam.ac.uk>
parents: 68615
diff changeset
   570
      apply (drule Abs1)
cedf3480fdad de-applying (mostly Quotient)
paulson <lp15@cam.ac.uk>
parents: 68615
diff changeset
   571
        apply (erule Quotient3_refl2 [OF R1])
cedf3480fdad de-applying (mostly Quotient)
paulson <lp15@cam.ac.uk>
parents: 68615
diff changeset
   572
       apply (erule Quotient3_refl1 [OF R1])
cedf3480fdad de-applying (mostly Quotient)
paulson <lp15@cam.ac.uk>
parents: 68615
diff changeset
   573
      apply (drule Quotient3_refl1 [OF R2], drule Rep1)
cedf3480fdad de-applying (mostly Quotient)
paulson <lp15@cam.ac.uk>
parents: 68615
diff changeset
   574
      by (metis (full_types) Quotient3_def R1 relcompp.relcompI)
cedf3480fdad de-applying (mostly Quotient)
paulson <lp15@cam.ac.uk>
parents: 68615
diff changeset
   575
    subgoal for x y
cedf3480fdad de-applying (mostly Quotient)
paulson <lp15@cam.ac.uk>
parents: 68615
diff changeset
   576
      apply (drule Abs1)
cedf3480fdad de-applying (mostly Quotient)
paulson <lp15@cam.ac.uk>
parents: 68615
diff changeset
   577
        apply (erule Quotient3_refl2 [OF R1])
cedf3480fdad de-applying (mostly Quotient)
paulson <lp15@cam.ac.uk>
parents: 68615
diff changeset
   578
       apply (erule Quotient3_refl1 [OF R1])
cedf3480fdad de-applying (mostly Quotient)
paulson <lp15@cam.ac.uk>
parents: 68615
diff changeset
   579
      apply (drule Quotient3_refl2 [OF R2], drule Rep1)
cedf3480fdad de-applying (mostly Quotient)
paulson <lp15@cam.ac.uk>
parents: 68615
diff changeset
   580
      by (metis (full_types) Quotient3_def R1 relcompp.relcompI)
cedf3480fdad de-applying (mostly Quotient)
paulson <lp15@cam.ac.uk>
parents: 68615
diff changeset
   581
    subgoal for x y
cedf3480fdad de-applying (mostly Quotient)
paulson <lp15@cam.ac.uk>
parents: 68615
diff changeset
   582
      by simp (metis (full_types) Abs1 Quotient3_rel R1 R2)
cedf3480fdad de-applying (mostly Quotient)
paulson <lp15@cam.ac.uk>
parents: 68615
diff changeset
   583
    done
cedf3480fdad de-applying (mostly Quotient)
paulson <lp15@cam.ac.uk>
parents: 68615
diff changeset
   584
  show ?thesis
cedf3480fdad de-applying (mostly Quotient)
paulson <lp15@cam.ac.uk>
parents: 68615
diff changeset
   585
    apply (rule Quotient3I)
cedf3480fdad de-applying (mostly Quotient)
paulson <lp15@cam.ac.uk>
parents: 68615
diff changeset
   586
    using * apply (simp_all add: o_def Quotient3_abs_rep [OF R2] Quotient3_abs_rep [OF R1])
cedf3480fdad de-applying (mostly Quotient)
paulson <lp15@cam.ac.uk>
parents: 68615
diff changeset
   587
    apply (metis Quotient3_rep_reflp R1 R2 Rep1 relcompp.relcompI)
cedf3480fdad de-applying (mostly Quotient)
paulson <lp15@cam.ac.uk>
parents: 68615
diff changeset
   588
    done
cedf3480fdad de-applying (mostly Quotient)
paulson <lp15@cam.ac.uk>
parents: 68615
diff changeset
   589
qed
47096
3ea48c19673e generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
kuncar
parents: 47094
diff changeset
   590
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   591
lemma OOO_eq_quotient3:
47096
3ea48c19673e generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
kuncar
parents: 47094
diff changeset
   592
  fixes R1 :: "'a \<Rightarrow> 'a \<Rightarrow> bool"
3ea48c19673e generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
kuncar
parents: 47094
diff changeset
   593
  fixes Abs1 :: "'a \<Rightarrow> 'b" and Rep1 :: "'b \<Rightarrow> 'a"
3ea48c19673e generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
kuncar
parents: 47094
diff changeset
   594
  fixes Abs2 :: "'b \<Rightarrow> 'c" and Rep2 :: "'c \<Rightarrow> 'b"
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   595
  assumes R1: "Quotient3 R1 Abs1 Rep1"
67399
eab6ce8368fa ran isabelle update_op on all sources
nipkow
parents: 67091
diff changeset
   596
  assumes R2: "Quotient3 (=) Abs2 Rep2"
eab6ce8368fa ran isabelle update_op on all sources
nipkow
parents: 67091
diff changeset
   597
  shows "Quotient3 (R1 OOO (=)) (Abs2 \<circ> Abs1) (Rep1 \<circ> Rep2)"
47096
3ea48c19673e generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
kuncar
parents: 47094
diff changeset
   598
using assms
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   599
by (rule OOO_quotient3) auto
47096
3ea48c19673e generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
kuncar
parents: 47094
diff changeset
   600
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 59028
diff changeset
   601
subsection \<open>Quotient3 to Quotient\<close>
47362
b1f099bdfbba connect the Quotient package to the Lifting package
kuncar
parents: 47361
diff changeset
   602
b1f099bdfbba connect the Quotient package to the Lifting package
kuncar
parents: 47361
diff changeset
   603
lemma Quotient3_to_Quotient:
b1f099bdfbba connect the Quotient package to the Lifting package
kuncar
parents: 47361
diff changeset
   604
assumes "Quotient3 R Abs Rep"
b1f099bdfbba connect the Quotient package to the Lifting package
kuncar
parents: 47361
diff changeset
   605
and "T \<equiv> \<lambda>x y. R x x \<and> Abs x = y"
b1f099bdfbba connect the Quotient package to the Lifting package
kuncar
parents: 47361
diff changeset
   606
shows "Quotient R Abs Rep T"
b1f099bdfbba connect the Quotient package to the Lifting package
kuncar
parents: 47361
diff changeset
   607
using assms unfolding Quotient3_def by (intro QuotientI) blast+
47096
3ea48c19673e generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
kuncar
parents: 47094
diff changeset
   608
47362
b1f099bdfbba connect the Quotient package to the Lifting package
kuncar
parents: 47361
diff changeset
   609
lemma Quotient3_to_Quotient_equivp:
b1f099bdfbba connect the Quotient package to the Lifting package
kuncar
parents: 47361
diff changeset
   610
assumes q: "Quotient3 R Abs Rep"
b1f099bdfbba connect the Quotient package to the Lifting package
kuncar
parents: 47361
diff changeset
   611
and T_def: "T \<equiv> \<lambda>x y. Abs x = y"
b1f099bdfbba connect the Quotient package to the Lifting package
kuncar
parents: 47361
diff changeset
   612
and eR: "equivp R"
b1f099bdfbba connect the Quotient package to the Lifting package
kuncar
parents: 47361
diff changeset
   613
shows "Quotient R Abs Rep T"
b1f099bdfbba connect the Quotient package to the Lifting package
kuncar
parents: 47361
diff changeset
   614
proof (intro QuotientI)
b1f099bdfbba connect the Quotient package to the Lifting package
kuncar
parents: 47361
diff changeset
   615
  fix a
b1f099bdfbba connect the Quotient package to the Lifting package
kuncar
parents: 47361
diff changeset
   616
  show "Abs (Rep a) = a" using q by(rule Quotient3_abs_rep)
b1f099bdfbba connect the Quotient package to the Lifting package
kuncar
parents: 47361
diff changeset
   617
next
b1f099bdfbba connect the Quotient package to the Lifting package
kuncar
parents: 47361
diff changeset
   618
  fix a
b1f099bdfbba connect the Quotient package to the Lifting package
kuncar
parents: 47361
diff changeset
   619
  show "R (Rep a) (Rep a)" using q by(rule Quotient3_rep_reflp)
b1f099bdfbba connect the Quotient package to the Lifting package
kuncar
parents: 47361
diff changeset
   620
next
b1f099bdfbba connect the Quotient package to the Lifting package
kuncar
parents: 47361
diff changeset
   621
  fix r s
b1f099bdfbba connect the Quotient package to the Lifting package
kuncar
parents: 47361
diff changeset
   622
  show "R r s = (R r r \<and> R s s \<and> Abs r = Abs s)" using q by(rule Quotient3_rel[symmetric])
b1f099bdfbba connect the Quotient package to the Lifting package
kuncar
parents: 47361
diff changeset
   623
next
b1f099bdfbba connect the Quotient package to the Lifting package
kuncar
parents: 47361
diff changeset
   624
  show "T = (\<lambda>x y. R x x \<and> Abs x = y)" using T_def equivp_reflp[OF eR] by simp
47096
3ea48c19673e generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
kuncar
parents: 47094
diff changeset
   625
qed
3ea48c19673e generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
kuncar
parents: 47094
diff changeset
   626
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 59028
diff changeset
   627
subsection \<open>ML setup\<close>
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   628
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 59028
diff changeset
   629
text \<open>Auxiliary data for the quotient package\<close>
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   630
57960
ee1ba4848896 updated to named_theorems;
wenzelm
parents: 56073
diff changeset
   631
named_theorems quot_equiv "equivalence relation theorems"
59028
df7476e79558 named_theorems: multiple args;
wenzelm
parents: 58889
diff changeset
   632
  and quot_respect "respectfulness theorems"
df7476e79558 named_theorems: multiple args;
wenzelm
parents: 58889
diff changeset
   633
  and quot_preserve "preservation theorems"
df7476e79558 named_theorems: multiple args;
wenzelm
parents: 58889
diff changeset
   634
  and id_simps "identity simp rules for maps"
df7476e79558 named_theorems: multiple args;
wenzelm
parents: 58889
diff changeset
   635
  and quot_thm "quotient theorems"
69605
a96320074298 isabelle update -u path_cartouches;
wenzelm
parents: 68616
diff changeset
   636
ML_file \<open>Tools/Quotient/quotient_info.ML\<close>
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   637
55945
e96383acecf9 renamed 'fun_rel' to 'rel_fun'
blanchet
parents: 54867
diff changeset
   638
declare [[mapQ3 "fun" = (rel_fun, fun_quotient3)]]
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   639
47308
9caab698dbe4 new package Lifting - initial commit
kuncar
parents: 47105
diff changeset
   640
lemmas [quot_thm] = fun_quotient3
44553
4d39b032a021 avoid intermixing set and predicates; dropped lemmas mem_rsp and mem_prs (now in Quotient_Set.thy)
haftmann
parents: 44413
diff changeset
   641
lemmas [quot_respect] = quot_rel_rsp if_rsp o_rsp let_rsp id_rsp
4d39b032a021 avoid intermixing set and predicates; dropped lemmas mem_rsp and mem_prs (now in Quotient_Set.thy)
haftmann
parents: 44413
diff changeset
   642
lemmas [quot_preserve] = if_prs o_prs let_prs id_prs
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   643
lemmas [quot_equiv] = identity_equivp
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   644
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   645
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 59028
diff changeset
   646
text \<open>Lemmas about simplifying id's.\<close>
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   647
lemmas [id_simps] =
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   648
  id_def[symmetric]
40602
91e583511113 map_fun combinator in theory Fun
haftmann
parents: 40466
diff changeset
   649
  map_fun_id
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   650
  id_apply
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   651
  id_o
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   652
  o_id
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   653
  eq_comp_r
44413
80d460bc6fa8 Quotient Package: some infrastructure for lifting inside sets
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 44242
diff changeset
   654
  vimage_id
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   655
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 59028
diff changeset
   656
text \<open>Translation functions for the lifting process.\<close>
69605
a96320074298 isabelle update -u path_cartouches;
wenzelm
parents: 68616
diff changeset
   657
ML_file \<open>Tools/Quotient/quotient_term.ML\<close>
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   658
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   659
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 59028
diff changeset
   660
text \<open>Definitions of the quotient types.\<close>
69605
a96320074298 isabelle update -u path_cartouches;
wenzelm
parents: 68616
diff changeset
   661
ML_file \<open>Tools/Quotient/quotient_type.ML\<close>
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   662
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   663
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 59028
diff changeset
   664
text \<open>Definitions for quotient constants.\<close>
69605
a96320074298 isabelle update -u path_cartouches;
wenzelm
parents: 68616
diff changeset
   665
ML_file \<open>Tools/Quotient/quotient_def.ML\<close>
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   666
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   667
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 59028
diff changeset
   668
text \<open>
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   669
  An auxiliary constant for recording some information
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   670
  about the lifted theorem in a tactic.
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 59028
diff changeset
   671
\<close>
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   672
definition
40466
c6587375088e type annotations in specifications; fun_rel_def is no simp rule by default; slightly changed fun_map_def; more on predicates on relation functions; proper HOL equations in definitions
haftmann
parents: 40031
diff changeset
   673
  Quot_True :: "'a \<Rightarrow> bool"
c6587375088e type annotations in specifications; fun_rel_def is no simp rule by default; slightly changed fun_map_def; more on predicates on relation functions; proper HOL equations in definitions
haftmann
parents: 40031
diff changeset
   674
where
c6587375088e type annotations in specifications; fun_rel_def is no simp rule by default; slightly changed fun_map_def; more on predicates on relation functions; proper HOL equations in definitions
haftmann
parents: 40031
diff changeset
   675
  "Quot_True x \<longleftrightarrow> True"
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   676
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   677
lemma
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   678
  shows QT_all: "Quot_True (All P) \<Longrightarrow> Quot_True P"
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   679
  and   QT_ex:  "Quot_True (Ex P) \<Longrightarrow> Quot_True P"
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   680
  and   QT_ex1: "Quot_True (Ex1 P) \<Longrightarrow> Quot_True P"
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   681
  and   QT_lam: "Quot_True (\<lambda>x. P x) \<Longrightarrow> (\<And>x. Quot_True (P x))"
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   682
  and   QT_ext: "(\<And>x. Quot_True (a x) \<Longrightarrow> f x = g x) \<Longrightarrow> (Quot_True a \<Longrightarrow> f = g)"
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   683
  by (simp_all add: Quot_True_def ext)
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   684
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   685
lemma QT_imp: "Quot_True a \<equiv> Quot_True b"
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   686
  by (simp add: Quot_True_def)
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   687
63343
fb5d8a50c641 bundle lifting_syntax;
wenzelm
parents: 61799
diff changeset
   688
context includes lifting_syntax
53011
aeee0a4be6cf introduce locale with syntax for fun_rel and map_fun and make thus ===> and ---> local
kuncar
parents: 51112
diff changeset
   689
begin
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   690
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 59028
diff changeset
   691
text \<open>Tactics for proving the lifted theorems\<close>
69605
a96320074298 isabelle update -u path_cartouches;
wenzelm
parents: 68616
diff changeset
   692
ML_file \<open>Tools/Quotient/quotient_tacs.ML\<close>
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   693
53011
aeee0a4be6cf introduce locale with syntax for fun_rel and map_fun and make thus ===> and ---> local
kuncar
parents: 51112
diff changeset
   694
end
aeee0a4be6cf introduce locale with syntax for fun_rel and map_fun and make thus ===> and ---> local
kuncar
parents: 51112
diff changeset
   695
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 59028
diff changeset
   696
subsection \<open>Methods / Interface\<close>
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   697
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   698
method_setup lifting =
71262
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   699
  \<open>Attrib.thms >> (fn thms => fn ctxt =>
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 59028
diff changeset
   700
       SIMPLE_METHOD' (Quotient_Tacs.lift_tac ctxt [] thms))\<close>
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 59028
diff changeset
   701
  \<open>lift theorems to quotient types\<close>
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   702
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   703
method_setup lifting_setup =
71262
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   704
  \<open>Attrib.thm >> (fn thm => fn ctxt =>
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 59028
diff changeset
   705
       SIMPLE_METHOD' (Quotient_Tacs.lift_procedure_tac ctxt [] thm))\<close>
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 59028
diff changeset
   706
  \<open>set up the three goals for the quotient lifting procedure\<close>
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   707
37593
2505feaf2d70 separated the lifting and descending procedures in the quotient package
Christian Urban <urbanc@in.tum.de>
parents: 37564
diff changeset
   708
method_setup descending =
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 59028
diff changeset
   709
  \<open>Scan.succeed (fn ctxt => SIMPLE_METHOD' (Quotient_Tacs.descend_tac ctxt []))\<close>
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 59028
diff changeset
   710
  \<open>decend theorems to the raw level\<close>
37593
2505feaf2d70 separated the lifting and descending procedures in the quotient package
Christian Urban <urbanc@in.tum.de>
parents: 37564
diff changeset
   711
2505feaf2d70 separated the lifting and descending procedures in the quotient package
Christian Urban <urbanc@in.tum.de>
parents: 37564
diff changeset
   712
method_setup descending_setup =
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 59028
diff changeset
   713
  \<open>Scan.succeed (fn ctxt => SIMPLE_METHOD' (Quotient_Tacs.descend_procedure_tac ctxt []))\<close>
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 59028
diff changeset
   714
  \<open>set up the three goals for the decending theorems\<close>
37593
2505feaf2d70 separated the lifting and descending procedures in the quotient package
Christian Urban <urbanc@in.tum.de>
parents: 37564
diff changeset
   715
45782
f82020ca3248 added a specific tactic and method that deal with partial equivalence relations
Christian Urban <urbanc@in.tum.de>
parents: 45680
diff changeset
   716
method_setup partiality_descending =
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 59028
diff changeset
   717
  \<open>Scan.succeed (fn ctxt => SIMPLE_METHOD' (Quotient_Tacs.partiality_descend_tac ctxt []))\<close>
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 59028
diff changeset
   718
  \<open>decend theorems to the raw level\<close>
45782
f82020ca3248 added a specific tactic and method that deal with partial equivalence relations
Christian Urban <urbanc@in.tum.de>
parents: 45680
diff changeset
   719
f82020ca3248 added a specific tactic and method that deal with partial equivalence relations
Christian Urban <urbanc@in.tum.de>
parents: 45680
diff changeset
   720
method_setup partiality_descending_setup =
71262
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   721
  \<open>Scan.succeed (fn ctxt =>
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 59028
diff changeset
   722
       SIMPLE_METHOD' (Quotient_Tacs.partiality_descend_procedure_tac ctxt []))\<close>
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 59028
diff changeset
   723
  \<open>set up the three goals for the decending theorems\<close>
45782
f82020ca3248 added a specific tactic and method that deal with partial equivalence relations
Christian Urban <urbanc@in.tum.de>
parents: 45680
diff changeset
   724
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   725
method_setup regularize =
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 59028
diff changeset
   726
  \<open>Scan.succeed (fn ctxt => SIMPLE_METHOD' (Quotient_Tacs.regularize_tac ctxt))\<close>
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 59028
diff changeset
   727
  \<open>prove the regularization goals from the quotient lifting procedure\<close>
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   728
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   729
method_setup injection =
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 59028
diff changeset
   730
  \<open>Scan.succeed (fn ctxt => SIMPLE_METHOD' (Quotient_Tacs.all_injection_tac ctxt))\<close>
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 59028
diff changeset
   731
  \<open>prove the rep/abs injection goals from the quotient lifting procedure\<close>
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   732
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   733
method_setup cleaning =
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 59028
diff changeset
   734
  \<open>Scan.succeed (fn ctxt => SIMPLE_METHOD' (Quotient_Tacs.clean_tac ctxt))\<close>
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 59028
diff changeset
   735
  \<open>prove the cleaning goals from the quotient lifting procedure\<close>
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   736
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   737
attribute_setup quot_lifted =
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 59028
diff changeset
   738
  \<open>Scan.succeed Quotient_Tacs.lifted_attrib\<close>
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 59028
diff changeset
   739
  \<open>lift theorems to quotient types\<close>
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   740
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   741
no_notation
53011
aeee0a4be6cf introduce locale with syntax for fun_rel and map_fun and make thus ===> and ---> local
kuncar
parents: 51112
diff changeset
   742
  rel_conj (infixr "OOO" 75)
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   743
71262
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   744
section \<open>Lifting of BNFs\<close>
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   745
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   746
lemma sum_insert_Inl_unit: "x \<in> A \<Longrightarrow> (\<And>y. x = Inr y \<Longrightarrow> Inr y \<in> B) \<Longrightarrow> x \<in> insert (Inl ()) B"
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   747
  by (cases x) (simp_all)
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   748
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   749
lemma lift_sum_unit_vimage_commute:
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   750
  "insert (Inl ()) (Inr ` f -` A) = map_sum id f -` insert (Inl ()) (Inr ` A)"
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   751
  by (auto simp: map_sum_def split: sum.splits)
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   752
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   753
lemma insert_Inl_int_map_sum_unit: "insert (Inl ()) A \<inter> range (map_sum id f) \<noteq> {}"
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   754
  by (auto simp: map_sum_def split: sum.splits)
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   755
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   756
lemma image_map_sum_unit_subset:
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   757
  "A \<subseteq> insert (Inl ()) (Inr ` B) \<Longrightarrow> map_sum id f ` A \<subseteq> insert (Inl ()) (Inr ` f ` B)"
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   758
  by auto
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   759
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   760
lemma subset_lift_sum_unitD: "A \<subseteq> insert (Inl ()) (Inr ` B) \<Longrightarrow> Inr x \<in> A \<Longrightarrow> x \<in> B"
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   761
  unfolding insert_def by auto
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   762
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   763
lemma UNIV_sum_unit_conv: "insert (Inl ()) (range Inr) = UNIV"
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   764
  unfolding UNIV_sum UNIV_unit image_insert image_empty Un_insert_left sup_bot.left_neutral..
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   765
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   766
lemma subset_vimage_image_subset: "A \<subseteq> f -` B \<Longrightarrow> f ` A \<subseteq> B"
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   767
  by auto
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   768
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   769
lemma relcompp_mem_Grp_neq_bot:
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   770
  "A \<inter> range f \<noteq> {} \<Longrightarrow> (\<lambda>x y. x \<in> A \<and> y \<in> A) OO (Grp UNIV f)\<inverse>\<inverse> \<noteq> bot"
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   771
  unfolding Grp_def relcompp_apply fun_eq_iff by blast
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   772
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   773
lemma comp_projr_Inr: "projr \<circ> Inr = id"
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   774
  by auto
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   775
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   776
lemma in_rel_sum_in_image_projr:
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   777
  "B \<subseteq> {(x,y). rel_sum ((=) :: unit \<Rightarrow> unit \<Rightarrow> bool) A x y} \<Longrightarrow>
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   778
   Inr ` C = fst ` B \<Longrightarrow> snd ` B = Inr ` D \<Longrightarrow> map_prod projr projr ` B \<subseteq> {(x,y). A x y}"
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   779
  by (force simp: projr_def image_iff dest!: spec[of _ "Inl ()"]  split: sum.splits)
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   780
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   781
lemma subset_rel_sumI: "B \<subseteq> {(x,y). A x y} \<Longrightarrow> rel_sum ((=) :: unit => unit => bool) A
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   782
    (if x \<in> B then Inr (fst x) else Inl ())
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   783
    (if x \<in> B then Inr (snd x) else Inl ())"
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   784
  by auto
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   785
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   786
lemma relcompp_eq_Grp_neq_bot: "(=) OO (Grp UNIV f)\<inverse>\<inverse> \<noteq> bot"
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   787
  unfolding Grp_def relcompp_apply fun_eq_iff by blast
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   788
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   789
lemma rel_fun_rel_OO1: "(rel_fun Q (rel_fun R (=))) A B \<Longrightarrow> conversep Q OO A OO R \<le> B"
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   790
  by (auto simp: rel_fun_def)
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   791
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   792
lemma rel_fun_rel_OO2: "(rel_fun Q (rel_fun R (=))) A B \<Longrightarrow> Q OO B OO conversep R \<le> A"
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   793
  by (auto simp: rel_fun_def)
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   794
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   795
lemma rel_sum_eq2_nonempty: "rel_sum (=) A OO rel_sum (=) B \<noteq> bot"
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   796
  by (auto simp: fun_eq_iff relcompp_apply intro!: exI[of _ "Inl _"])
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   797
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   798
lemma rel_sum_eq3_nonempty: "rel_sum (=) A OO (rel_sum (=) B OO rel_sum (=) C) \<noteq> bot"
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   799
  by (auto simp: fun_eq_iff relcompp_apply intro!: exI[of _ "Inl _"])
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   800
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   801
lemma hypsubst: "A = B \<Longrightarrow> x \<in> B \<Longrightarrow> (x \<in> A \<Longrightarrow> P) \<Longrightarrow> P" by simp
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   802
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   803
lemma Quotient_crel_quotient: "Quotient R Abs Rep T \<Longrightarrow> equivp R \<Longrightarrow> T \<equiv> (\<lambda>x y. Abs x = y)"
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   804
  by (drule Quotient_cr_rel) (auto simp: fun_eq_iff equivp_reflp intro!: eq_reflection)
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   805
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   806
lemma Quotient_crel_typedef: "Quotient (eq_onp P) Abs Rep T \<Longrightarrow> T \<equiv> (\<lambda>x y. x = Rep y)"
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   807
  unfolding Quotient_def
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   808
  by (auto 0 4 simp: fun_eq_iff eq_onp_def intro: sym intro!: eq_reflection)
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   809
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   810
lemma Quotient_crel_typecopy: "Quotient (=) Abs Rep T \<Longrightarrow> T \<equiv> (\<lambda>x y. x = Rep y)"
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   811
  by (subst (asm) eq_onp_True[symmetric]) (rule Quotient_crel_typedef)
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   812
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   813
lemma equivp_add_relconj:
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   814
  assumes equiv: "equivp R" "equivp R'" and le: "S OO T OO U \<le> R OO STU OO R'"
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   815
  shows "R OO S OO T OO U OO R' \<le> R OO STU OO R'"
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   816
proof -
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   817
  have trans: "R OO R \<le> R" "R' OO R' \<le> R'"
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   818
    using equiv unfolding equivp_reflp_symp_transp transp_relcompp by blast+
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   819
  have "R OO S OO T OO U OO R' = R OO (S OO T OO U) OO R'"
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   820
    unfolding relcompp_assoc ..
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   821
  also have "\<dots> \<le> R OO (R OO STU OO R') OO R'"
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   822
    by (intro le relcompp_mono order_refl)
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   823
  also have "\<dots> \<le> (R OO R) OO STU OO (R' OO R')"
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   824
    unfolding relcompp_assoc ..
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   825
  also have "\<dots> \<le> R OO STU OO R'"
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   826
    by (intro trans relcompp_mono order_refl)
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   827
  finally show ?thesis .
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   828
qed
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   829
71354
c71a44893645 eliminated one redundant proof obligation in lift_bnf for quotients
traytel
parents: 71262
diff changeset
   830
lemma Grp_conversep_eq_onp: "((BNF_Def.Grp UNIV f)\<inverse>\<inverse> OO BNF_Def.Grp UNIV f) = eq_onp (\<lambda>x. x \<in> range f)"
c71a44893645 eliminated one redundant proof obligation in lift_bnf for quotients
traytel
parents: 71262
diff changeset
   831
  by (auto simp: fun_eq_iff Grp_def eq_onp_def image_iff)
c71a44893645 eliminated one redundant proof obligation in lift_bnf for quotients
traytel
parents: 71262
diff changeset
   832
c71a44893645 eliminated one redundant proof obligation in lift_bnf for quotients
traytel
parents: 71262
diff changeset
   833
lemma Grp_conversep_nonempty: "(BNF_Def.Grp UNIV f)\<inverse>\<inverse> OO BNF_Def.Grp UNIV f \<noteq> bot"
c71a44893645 eliminated one redundant proof obligation in lift_bnf for quotients
traytel
parents: 71262
diff changeset
   834
  by (auto simp: fun_eq_iff Grp_def)
c71a44893645 eliminated one redundant proof obligation in lift_bnf for quotients
traytel
parents: 71262
diff changeset
   835
c71a44893645 eliminated one redundant proof obligation in lift_bnf for quotients
traytel
parents: 71262
diff changeset
   836
lemma relcomppI2: "r a b \<Longrightarrow> s b c \<Longrightarrow> t c d \<Longrightarrow> (r OO s OO t) a d"
c71a44893645 eliminated one redundant proof obligation in lift_bnf for quotients
traytel
parents: 71262
diff changeset
   837
  by (auto)
c71a44893645 eliminated one redundant proof obligation in lift_bnf for quotients
traytel
parents: 71262
diff changeset
   838
c71a44893645 eliminated one redundant proof obligation in lift_bnf for quotients
traytel
parents: 71262
diff changeset
   839
lemma rel_conj_eq_onp: "equivp R \<Longrightarrow> rel_conj R (eq_onp P) \<le> R"
c71a44893645 eliminated one redundant proof obligation in lift_bnf for quotients
traytel
parents: 71262
diff changeset
   840
  by (auto simp: eq_onp_def transp_def equivp_def)
c71a44893645 eliminated one redundant proof obligation in lift_bnf for quotients
traytel
parents: 71262
diff changeset
   841
71393
fce780f9c9c6 new examples of BNF lifting across quotients using a new theory of confluence,
traytel
parents: 71354
diff changeset
   842
lemma Quotient_Quotient3: "Quotient R Abs Rep T \<Longrightarrow> Quotient3 R Abs Rep"
fce780f9c9c6 new examples of BNF lifting across quotients using a new theory of confluence,
traytel
parents: 71354
diff changeset
   843
  unfolding Quotient_def Quotient3_def by blast
fce780f9c9c6 new examples of BNF lifting across quotients using a new theory of confluence,
traytel
parents: 71354
diff changeset
   844
fce780f9c9c6 new examples of BNF lifting across quotients using a new theory of confluence,
traytel
parents: 71354
diff changeset
   845
lemma bnf_lift_Quotient_equivp: "Quotient R Abs Rep T \<and> equivp R \<Longrightarrow> True"
fce780f9c9c6 new examples of BNF lifting across quotients using a new theory of confluence,
traytel
parents: 71354
diff changeset
   846
  by auto
fce780f9c9c6 new examples of BNF lifting across quotients using a new theory of confluence,
traytel
parents: 71354
diff changeset
   847
71262
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   848
ML_file "Tools/BNF/bnf_lift.ML"
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   849
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   850
hide_fact
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   851
  sum_insert_Inl_unit lift_sum_unit_vimage_commute insert_Inl_int_map_sum_unit
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   852
  image_map_sum_unit_subset subset_lift_sum_unitD UNIV_sum_unit_conv subset_vimage_image_subset
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   853
  relcompp_mem_Grp_neq_bot comp_projr_Inr in_rel_sum_in_image_projr subset_rel_sumI
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   854
  relcompp_eq_Grp_neq_bot rel_fun_rel_OO1 rel_fun_rel_OO2 rel_sum_eq2_nonempty rel_sum_eq3_nonempty
71354
c71a44893645 eliminated one redundant proof obligation in lift_bnf for quotients
traytel
parents: 71262
diff changeset
   855
  hypsubst equivp_add_relconj Grp_conversep_eq_onp Grp_conversep_nonempty relcomppI2 rel_conj_eq_onp
71393
fce780f9c9c6 new examples of BNF lifting across quotients using a new theory of confluence,
traytel
parents: 71354
diff changeset
   856
  bnf_lift_Quotient_equivp Quotient_Quotient3
71262
a30278c8585f extension of lift_bnf to support quotient types
traytel
parents: 69990
diff changeset
   857
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   858
end
47488
be6dd389639d centralized enriched_type declaration, thanks to in-situ available Isar commands
haftmann
parents: 47436
diff changeset
   859