UnusedQuotMain.thy
author Christian Urban <urbanc@in.tum.de>
Tue, 22 Dec 2009 21:31:44 +0100
changeset 776 d1064fa29424
parent 693 af118149ffd4
permissions -rw-r--r--
renamed get_fun to absrep_fun; introduced explicit checked versions of the term functions
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
466
42082fc00903 Cleaning 'aps'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 399
diff changeset
     1
(* Code for getting the goal *)
42082fc00903 Cleaning 'aps'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 399
diff changeset
     2
apply (tactic {* (ObjectLogic.full_atomize_tac THEN' gen_frees_tac @{context}) 1 *})
42082fc00903 Cleaning 'aps'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 399
diff changeset
     3
ML_prf {* val qtm = #concl (fst (Subgoal.focus @{context} 1 (#goal (Isar.goal ())))) *}
42082fc00903 Cleaning 'aps'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 399
diff changeset
     4
42082fc00903 Cleaning 'aps'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 399
diff changeset
     5
467
5ca4a927d7f0 more cleaning
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 466
diff changeset
     6
section {*  Infrastructure about definitions *}
5ca4a927d7f0 more cleaning
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 466
diff changeset
     7
5ca4a927d7f0 more cleaning
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 466
diff changeset
     8
(* Does the same as 'subst' in a given theorem *)
5ca4a927d7f0 more cleaning
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 466
diff changeset
     9
ML {*
5ca4a927d7f0 more cleaning
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 466
diff changeset
    10
fun eqsubst_thm ctxt thms thm =
5ca4a927d7f0 more cleaning
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 466
diff changeset
    11
  let
5ca4a927d7f0 more cleaning
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 466
diff changeset
    12
    val goalstate = Goal.init (Thm.cprop_of thm)
5ca4a927d7f0 more cleaning
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 466
diff changeset
    13
    val a' = case (SINGLE (EqSubst.eqsubst_tac ctxt [0] thms 1) goalstate) of
5ca4a927d7f0 more cleaning
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 466
diff changeset
    14
      NONE => error "eqsubst_thm"
5ca4a927d7f0 more cleaning
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 466
diff changeset
    15
    | SOME th => cprem_of th 1
5ca4a927d7f0 more cleaning
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 466
diff changeset
    16
    val tac = (EqSubst.eqsubst_tac ctxt [0] thms 1) THEN simp_tac HOL_ss 1
5ca4a927d7f0 more cleaning
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 466
diff changeset
    17
    val goal = Logic.mk_equals (term_of (Thm.cprop_of thm), term_of a');
5ca4a927d7f0 more cleaning
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 466
diff changeset
    18
    val cgoal = cterm_of (ProofContext.theory_of ctxt) goal
5ca4a927d7f0 more cleaning
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 466
diff changeset
    19
    val rt = Goal.prove_internal [] cgoal (fn _ => tac);
5ca4a927d7f0 more cleaning
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 466
diff changeset
    20
  in
5ca4a927d7f0 more cleaning
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 466
diff changeset
    21
    @{thm equal_elim_rule1} OF [rt, thm]
5ca4a927d7f0 more cleaning
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 466
diff changeset
    22
  end
5ca4a927d7f0 more cleaning
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 466
diff changeset
    23
*}
5ca4a927d7f0 more cleaning
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 466
diff changeset
    24
5ca4a927d7f0 more cleaning
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 466
diff changeset
    25
(* expects atomized definitions *)
5ca4a927d7f0 more cleaning
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 466
diff changeset
    26
ML {*
5ca4a927d7f0 more cleaning
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 466
diff changeset
    27
fun add_lower_defs_aux lthy thm =
5ca4a927d7f0 more cleaning
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 466
diff changeset
    28
  let
5ca4a927d7f0 more cleaning
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 466
diff changeset
    29
    val e1 = @{thm fun_cong} OF [thm];
5ca4a927d7f0 more cleaning
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 466
diff changeset
    30
    val f = eqsubst_thm lthy @{thms fun_map.simps} e1;
5ca4a927d7f0 more cleaning
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 466
diff changeset
    31
    val g = simp_ids f
5ca4a927d7f0 more cleaning
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 466
diff changeset
    32
  in
5ca4a927d7f0 more cleaning
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 466
diff changeset
    33
    (simp_ids thm) :: (add_lower_defs_aux lthy g)
5ca4a927d7f0 more cleaning
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 466
diff changeset
    34
  end
5ca4a927d7f0 more cleaning
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 466
diff changeset
    35
  handle _ => [simp_ids thm]
5ca4a927d7f0 more cleaning
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 466
diff changeset
    36
*}
5ca4a927d7f0 more cleaning
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 466
diff changeset
    37
5ca4a927d7f0 more cleaning
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 466
diff changeset
    38
ML {*
5ca4a927d7f0 more cleaning
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 466
diff changeset
    39
fun add_lower_defs lthy def =
5ca4a927d7f0 more cleaning
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 466
diff changeset
    40
  let
5ca4a927d7f0 more cleaning
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 466
diff changeset
    41
    val def_pre_sym = symmetric def
5ca4a927d7f0 more cleaning
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 466
diff changeset
    42
    val def_atom = atomize_thm def_pre_sym
5ca4a927d7f0 more cleaning
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 466
diff changeset
    43
    val defs_all = add_lower_defs_aux lthy def_atom
5ca4a927d7f0 more cleaning
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 466
diff changeset
    44
  in
5ca4a927d7f0 more cleaning
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 466
diff changeset
    45
    map Thm.varifyT defs_all
5ca4a927d7f0 more cleaning
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 466
diff changeset
    46
  end
5ca4a927d7f0 more cleaning
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 466
diff changeset
    47
*}
5ca4a927d7f0 more cleaning
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 466
diff changeset
    48
5ca4a927d7f0 more cleaning
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 466
diff changeset
    49
5ca4a927d7f0 more cleaning
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 466
diff changeset
    50
381
991db758a72d More moving from QuotMain to UnusedQuotMain
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 379
diff changeset
    51
ML {*
991db758a72d More moving from QuotMain to UnusedQuotMain
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 379
diff changeset
    52
fun repeat_eqsubst_thm ctxt thms thm =
991db758a72d More moving from QuotMain to UnusedQuotMain
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 379
diff changeset
    53
  repeat_eqsubst_thm ctxt thms (eqsubst_thm ctxt thms thm)
991db758a72d More moving from QuotMain to UnusedQuotMain
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 379
diff changeset
    54
  handle _ => thm
991db758a72d More moving from QuotMain to UnusedQuotMain
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 379
diff changeset
    55
*}
991db758a72d More moving from QuotMain to UnusedQuotMain
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 379
diff changeset
    56
991db758a72d More moving from QuotMain to UnusedQuotMain
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 379
diff changeset
    57
991db758a72d More moving from QuotMain to UnusedQuotMain
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 379
diff changeset
    58
ML {*
991db758a72d More moving from QuotMain to UnusedQuotMain
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 379
diff changeset
    59
fun eqsubst_prop ctxt thms t =
991db758a72d More moving from QuotMain to UnusedQuotMain
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 379
diff changeset
    60
  let
991db758a72d More moving from QuotMain to UnusedQuotMain
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 379
diff changeset
    61
    val goalstate = Goal.init (cterm_of (ProofContext.theory_of ctxt) t)
991db758a72d More moving from QuotMain to UnusedQuotMain
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 379
diff changeset
    62
    val a' = case (SINGLE (EqSubst.eqsubst_tac ctxt [0] thms 1) goalstate) of
991db758a72d More moving from QuotMain to UnusedQuotMain
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 379
diff changeset
    63
      NONE => error "eqsubst_prop"
991db758a72d More moving from QuotMain to UnusedQuotMain
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 379
diff changeset
    64
    | SOME th => cprem_of th 1
991db758a72d More moving from QuotMain to UnusedQuotMain
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 379
diff changeset
    65
  in term_of a' end
991db758a72d More moving from QuotMain to UnusedQuotMain
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 379
diff changeset
    66
*}
991db758a72d More moving from QuotMain to UnusedQuotMain
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 379
diff changeset
    67
991db758a72d More moving from QuotMain to UnusedQuotMain
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 379
diff changeset
    68
ML {*
991db758a72d More moving from QuotMain to UnusedQuotMain
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 379
diff changeset
    69
  fun repeat_eqsubst_prop ctxt thms t =
991db758a72d More moving from QuotMain to UnusedQuotMain
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 379
diff changeset
    70
    repeat_eqsubst_prop ctxt thms (eqsubst_prop ctxt thms t)
991db758a72d More moving from QuotMain to UnusedQuotMain
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 379
diff changeset
    71
    handle _ => t
991db758a72d More moving from QuotMain to UnusedQuotMain
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 379
diff changeset
    72
*}
991db758a72d More moving from QuotMain to UnusedQuotMain
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 379
diff changeset
    73
379
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    74
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    75
text {* tyRel takes a type and builds a relation that a quantifier over this
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    76
  type needs to respect. *}
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    77
ML {*
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    78
fun tyRel ty rty rel lthy =
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    79
  if Sign.typ_instance (ProofContext.theory_of lthy) (ty, rty)
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    80
  then rel
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    81
  else (case ty of
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    82
          Type (s, tys) =>
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    83
            let
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    84
              val tys_rel = map (fn ty => ty --> ty --> @{typ bool}) tys;
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    85
              val ty_out = ty --> ty --> @{typ bool};
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    86
              val tys_out = tys_rel ---> ty_out;
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    87
            in
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    88
            (case (maps_lookup (ProofContext.theory_of lthy) s) of
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    89
               SOME (info) => list_comb (Const (#relfun info, tys_out),
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    90
                              map (fn ty => tyRel ty rty rel lthy) tys)
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    91
             | NONE  => HOLogic.eq_const ty
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    92
            )
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    93
            end
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    94
        | _ => HOLogic.eq_const ty)
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    95
*}
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    96
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    97
(* 
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    98
ML {* cterm_of @{theory} 
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    99
  (tyRel @{typ "'a \<Rightarrow> 'a list \<Rightarrow> 't \<Rightarrow> 't"} (Logic.varifyT @{typ "'a list"}) 
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   100
         @{term "f::('a list \<Rightarrow> 'a list \<Rightarrow> bool)"} @{context}) 
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   101
*} 
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   102
*)
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   103
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   104
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   105
ML {*
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   106
fun mk_babs ty ty' = Const (@{const_name "Babs"}, [ty' --> @{typ bool}, ty] ---> ty)
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   107
fun mk_ball ty = Const (@{const_name "Ball"}, [ty, ty] ---> @{typ bool})
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   108
fun mk_bex ty = Const (@{const_name "Bex"}, [ty, ty] ---> @{typ bool})
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   109
fun mk_resp ty = Const (@{const_name Respects}, [[ty, ty] ---> @{typ bool}, ty] ---> @{typ bool})
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   110
*}
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   111
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   112
(* applies f to the subterm of an abstractions, otherwise to the given term *)
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   113
ML {*
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   114
fun apply_subt f trm =
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   115
  case trm of
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   116
    Abs (x, T, t) => 
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   117
       let 
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   118
         val (x', t') = Term.dest_abs (x, T, t)
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   119
       in
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   120
         Term.absfree (x', T, f t') 
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   121
       end
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   122
  | _ => f trm
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   123
*}
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   124
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   125
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   126
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   127
(* FIXME: if there are more than one quotient, then you have to look up the relation *)
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   128
ML {*
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   129
fun my_reg lthy rel rty trm =
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   130
  case trm of
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   131
    Abs (x, T, t) =>
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   132
       if (needs_lift rty T) then
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   133
         let
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   134
            val rrel = tyRel T rty rel lthy
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   135
         in
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   136
           (mk_babs (fastype_of trm) T) $ (mk_resp T $ rrel) $ (apply_subt (my_reg lthy rel rty) trm)
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   137
         end
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   138
       else
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   139
         Abs(x, T, (apply_subt (my_reg lthy rel rty) t))
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   140
  | Const (@{const_name "All"}, ty) $ (t as Abs (x, T, _)) =>
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   141
       let
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   142
          val ty1 = domain_type ty
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   143
          val ty2 = domain_type ty1
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   144
          val rrel = tyRel T rty rel lthy
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   145
       in
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   146
         if (needs_lift rty T) then
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   147
           (mk_ball ty1) $ (mk_resp ty2 $ rrel) $ (apply_subt (my_reg lthy rel rty) t)
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   148
         else
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   149
           Const (@{const_name "All"}, ty) $ apply_subt (my_reg lthy rel rty) t
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   150
       end
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   151
  | Const (@{const_name "Ex"}, ty) $ (t as Abs (x, T, _)) =>
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   152
       let
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   153
          val ty1 = domain_type ty
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   154
          val ty2 = domain_type ty1
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   155
          val rrel = tyRel T rty rel lthy
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   156
       in
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   157
         if (needs_lift rty T) then
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   158
           (mk_bex ty1) $ (mk_resp ty2 $ rrel) $ (apply_subt (my_reg lthy rel rty) t)
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   159
         else
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   160
           Const (@{const_name "Ex"}, ty) $ apply_subt (my_reg lthy rel rty) t
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   161
       end
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   162
  | Const (@{const_name "op ="}, ty) $ t =>
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   163
      if needs_lift rty (fastype_of t) then
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   164
        (tyRel (fastype_of t) rty rel lthy) $ t   (* FIXME: t should be regularised too *)
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   165
      else Const (@{const_name "op ="}, ty) $ (my_reg lthy rel rty t)
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   166
  | t1 $ t2 => (my_reg lthy rel rty t1) $ (my_reg lthy rel rty t2)
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   167
  | _ => trm
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   168
*}
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   169
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   170
(* For polymorphic types we need to find the type of the Relation term. *)
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   171
(* TODO: we assume that the relation is a Constant. Is this always true? *)
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   172
ML {*
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   173
fun my_reg_inst lthy rel rty trm =
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   174
  case rel of
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   175
    Const (n, _) => Syntax.check_term lthy
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   176
      (my_reg lthy (Const (n, dummyT)) (Logic.varifyT rty) trm)
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   177
*}
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   178
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   179
(*
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   180
ML {*
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   181
  val r = Free ("R", dummyT);
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   182
  val t = (my_reg_inst @{context} r @{typ "'a list"} @{term "\<forall>(x::'b list). P x"});
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   183
  val t2 = Syntax.check_term @{context} t;
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   184
  cterm_of @{theory} t2
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   185
*}
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   186
*)
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   187
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   188
text {* Assumes that the given theorem is atomized *}
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   189
ML {*
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   190
  fun build_regularize_goal thm rty rel lthy =
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   191
     Logic.mk_implies
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   192
       ((prop_of thm),
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   193
       (my_reg_inst lthy rel rty (prop_of thm)))
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   194
*}
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   195
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   196
ML {*
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   197
fun regularize thm rty rel rel_eqv rel_refl lthy =
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   198
  let
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   199
    val goal = build_regularize_goal thm rty rel lthy;
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   200
    fun tac ctxt =
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   201
      (ObjectLogic.full_atomize_tac) THEN'
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   202
      REPEAT_ALL_NEW (FIRST' [
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   203
        rtac rel_refl,
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   204
        atac,
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   205
        rtac @{thm universal_twice},
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   206
        (rtac @{thm impI} THEN' atac),
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   207
        rtac @{thm implication_twice},
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   208
        EqSubst.eqsubst_tac ctxt [0]
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   209
          [(@{thm equiv_res_forall} OF [rel_eqv]),
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   210
           (@{thm equiv_res_exists} OF [rel_eqv])],
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   211
        (* For a = b \<longrightarrow> a \<approx> b *)
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   212
        (rtac @{thm impI} THEN' (asm_full_simp_tac HOL_ss) THEN' rtac rel_refl),
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   213
        (rtac @{thm RIGHT_RES_FORALL_REGULAR})
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   214
      ]);
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   215
    val cthm = Goal.prove lthy [] [] goal
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   216
      (fn {context, ...} => tac context 1);
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   217
  in
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   218
    cthm OF [thm]
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   219
  end
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   220
*}
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   221
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   222
(*consts Rl :: "'a list \<Rightarrow> 'a list \<Rightarrow> bool"
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   223
axioms Rl_eq: "EQUIV Rl"
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   224
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   225
quotient ql = "'a list" / "Rl"
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   226
  by (rule Rl_eq)
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   227
ML {*
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   228
  ctyp_of @{theory} (exchange_ty @{context} (Logic.varifyT @{typ "'a list"}) (Logic.varifyT @{typ "'a ql"}) @{typ "nat list \<Rightarrow> (nat \<times> nat) list"});
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   229
  ctyp_of @{theory} (exchange_ty @{context} (Logic.varifyT @{typ "nat \<times> nat"}) (Logic.varifyT @{typ "int"}) @{typ "nat list \<Rightarrow> (nat \<times> nat) list"})
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   230
*}
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   231
*)
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   232
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   233
ML {*
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   234
(* returns all subterms where two types differ *)
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   235
fun diff (T, S) Ds =
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   236
  case (T, S) of
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   237
    (TVar v, TVar u) => if v = u then Ds else (T, S)::Ds 
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   238
  | (TFree x, TFree y) => if x = y then Ds else (T, S)::Ds
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   239
  | (Type (a, Ts), Type (b, Us)) => 
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   240
      if a = b then diffs (Ts, Us) Ds else (T, S)::Ds
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   241
  | _ => (T, S)::Ds
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   242
and diffs (T::Ts, U::Us) Ds = diffs (Ts, Us) (diff (T, U) Ds)
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   243
  | diffs ([], []) Ds = Ds
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   244
  | diffs _ _ = error "Unequal length of type arguments"
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   245
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   246
*}
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   247
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   248
ML {*
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   249
fun build_repabs_term lthy thm consts rty qty =
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   250
  let
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   251
    (* TODO: The rty and qty stored in the quotient_info should
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   252
       be varified, so this will soon not be needed *)
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   253
    val rty = Logic.varifyT rty;
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   254
    val qty = Logic.varifyT qty;
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   255
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   256
  fun mk_abs tm =
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   257
    let
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   258
      val ty = fastype_of tm
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   259
    in Syntax.check_term lthy ((get_fun_OLD absF (rty, qty) lthy ty) $ tm) end
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   260
  fun mk_repabs tm =
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   261
    let
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   262
      val ty = fastype_of tm
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   263
    in Syntax.check_term lthy ((get_fun_OLD repF (rty, qty) lthy ty) $ (mk_abs tm)) end
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   264
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   265
    fun is_lifted_const (Const (x, _)) = member (op =) consts x
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   266
      | is_lifted_const _ = false;
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   267
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   268
    fun build_aux lthy tm =
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   269
      case tm of
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   270
        Abs (a as (_, vty, _)) =>
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   271
          let
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   272
            val (vs, t) = Term.dest_abs a;
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   273
            val v = Free(vs, vty);
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   274
            val t' = lambda v (build_aux lthy t)
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   275
          in
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   276
            if (not (needs_lift rty (fastype_of tm))) then t'
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   277
            else mk_repabs (
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   278
              if not (needs_lift rty vty) then t'
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   279
              else
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   280
                let
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   281
                  val v' = mk_repabs v;
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   282
                  (* TODO: I believe 'beta' is not needed any more *)
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   283
                  val t1 = (* Envir.beta_norm *) (t' $ v')
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   284
                in
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   285
                  lambda v t1
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   286
                end)
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   287
          end
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   288
      | x =>
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   289
        case Term.strip_comb tm of
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   290
          (Const(@{const_name Respects}, _), _) => tm
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   291
        | (opp, tms0) =>
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   292
          let
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   293
            val tms = map (build_aux lthy) tms0
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   294
            val ty = fastype_of tm
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   295
          in
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   296
            if (is_lifted_const opp andalso needs_lift rty ty) then
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   297
            mk_repabs (list_comb (opp, tms))
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   298
            else if ((Term.is_Free opp) andalso (length tms > 0) andalso (needs_lift rty ty)) then
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   299
              mk_repabs (list_comb (opp, tms))
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   300
            else if tms = [] then opp
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   301
            else list_comb(opp, tms)
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   302
          end
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   303
  in
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   304
    repeat_eqsubst_prop lthy @{thms id_def_sym}
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   305
      (build_aux lthy (Thm.prop_of thm))
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   306
  end
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   307
*}
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   308
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   309
text {* Builds provable goals for regularized theorems *}
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   310
ML {*
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   311
fun build_repabs_goal ctxt thm cons rty qty =
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   312
  Logic.mk_equals ((Thm.prop_of thm), (build_repabs_term ctxt thm cons rty qty))
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   313
*}
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   314
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   315
ML {*
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   316
fun repabs lthy thm consts rty qty quot_thm reflex_thm trans_thm rsp_thms =
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   317
  let
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   318
    val rt = build_repabs_term lthy thm consts rty qty;
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   319
    val rg = Logic.mk_equals ((Thm.prop_of thm), rt);
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   320
    fun tac ctxt = (ObjectLogic.full_atomize_tac) THEN'
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   321
      (REPEAT_ALL_NEW (r_mk_comb_tac ctxt rty quot_thm reflex_thm trans_thm rsp_thms));
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   322
    val cthm = Goal.prove lthy [] [] rg (fn x => tac (#context x) 1);
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   323
  in
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   324
    @{thm Pure.equal_elim_rule1} OF [cthm, thm]
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   325
  end
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   326
*}
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   327
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   328
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   329
(* TODO: Check if it behaves properly with varifyed rty *)
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   330
ML {*
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   331
fun findabs_all rty tm =
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   332
  case tm of
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   333
    Abs(_, T, b) =>
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   334
      let
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   335
        val b' = subst_bound ((Free ("x", T)), b);
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   336
        val tys = findabs_all rty b'
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   337
        val ty = fastype_of tm
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   338
      in if needs_lift rty ty then (ty :: tys) else tys
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   339
      end
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   340
  | f $ a => (findabs_all rty f) @ (findabs_all rty a)
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   341
  | _ => [];
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   342
fun findabs rty tm = distinct (op =) (findabs_all rty tm)
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   343
*}
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   344
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   345
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   346
(* Currently useful only for LAMBDA_PRS *)
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   347
ML {*
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   348
fun make_simp_prs_thm lthy quot_thm thm typ =
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   349
  let
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   350
    val (_, [lty, rty]) = dest_Type typ;
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   351
    val thy = ProofContext.theory_of lthy;
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   352
    val (lcty, rcty) = (ctyp_of thy lty, ctyp_of thy rty)
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   353
    val inst = [SOME lcty, NONE, SOME rcty];
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   354
    val lpi = Drule.instantiate' inst [] thm;
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   355
    val tac =
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   356
      (compose_tac (false, lpi, 2)) THEN_ALL_NEW
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   357
      (quotient_tac quot_thm);
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   358
    val gc = Drule.strip_imp_concl (cprop_of lpi);
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   359
    val t = Goal.prove_internal [] gc (fn _ => tac 1)
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   360
  in
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   361
    MetaSimplifier.rewrite_rule [@{thm eq_reflection} OF @{thms id_apply}] t
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   362
  end
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   363
*}
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   364
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   365
ML {*
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   366
fun findallex_all rty qty tm =
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   367
  case tm of
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   368
    Const (@{const_name All}, T) $ (s as (Abs(_, _, b))) =>
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   369
      let
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   370
        val (tya, tye) = findallex_all rty qty s
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   371
      in if needs_lift rty T then
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   372
        ((T :: tya), tye)
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   373
      else (tya, tye) end
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   374
  | Const (@{const_name Ex}, T) $ (s as (Abs(_, _, b))) =>
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   375
      let
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   376
        val (tya, tye) = findallex_all rty qty s
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   377
      in if needs_lift rty T then
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   378
        (tya, (T :: tye))
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   379
      else (tya, tye) end
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   380
  | Abs(_, T, b) =>
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   381
      findallex_all rty qty (subst_bound ((Free ("x", T)), b))
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   382
  | f $ a =>
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   383
      let
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   384
        val (a1, e1) = findallex_all rty qty f;
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   385
        val (a2, e2) = findallex_all rty qty a;
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   386
      in (a1 @ a2, e1 @ e2) end
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   387
  | _ => ([], []);
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   388
*}
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   389
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   390
ML {*
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   391
fun findallex lthy rty qty tm =
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   392
  let
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   393
    val (a, e) = findallex_all rty qty tm;
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   394
    val (ad, ed) = (map domain_type a, map domain_type e);
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   395
    val (au, eu) = (distinct (op =) ad, distinct (op =) ed);
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   396
    val (rty, qty) = (Logic.varifyT rty, Logic.varifyT qty)
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   397
  in
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   398
    (map (exchange_ty lthy rty qty) au, map (exchange_ty lthy rty qty) eu)
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   399
  end
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   400
*}
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   401
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   402
ML {*
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   403
fun make_allex_prs_thm lthy quot_thm thm typ =
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   404
  let
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   405
    val (_, [lty, rty]) = dest_Type typ;
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   406
    val thy = ProofContext.theory_of lthy;
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   407
    val (lcty, rcty) = (ctyp_of thy lty, ctyp_of thy rty)
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   408
    val inst = [NONE, SOME lcty];
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   409
    val lpi = Drule.instantiate' inst [] thm;
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   410
    val tac =
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   411
      (compose_tac (false, lpi, 1)) THEN_ALL_NEW
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   412
      (quotient_tac quot_thm);
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   413
    val gc = Drule.strip_imp_concl (cprop_of lpi);
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   414
    val t = Goal.prove_internal [] gc (fn _ => tac 1)
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   415
    val t_noid = MetaSimplifier.rewrite_rule
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   416
      [@{thm eq_reflection} OF @{thms id_apply}] t;
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   417
    val t_sym = @{thm "HOL.sym"} OF [t_noid];
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   418
    val t_eq = @{thm "eq_reflection"} OF [t_sym]
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   419
  in
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   420
    t_eq
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   421
  end
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   422
*}
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   423
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   424
ML {*
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   425
fun lift_thm lthy qty qty_name rsp_thms defs rthm = 
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   426
let
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   427
  val _ = tracing ("raw theorem:\n" ^ Syntax.string_of_term lthy (prop_of rthm))
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   428
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   429
  val (rty, rel, rel_refl, rel_eqv) = lookup_quot_data lthy qty;
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   430
  val (trans2, reps_same, absrep, quot) = lookup_quot_thms lthy qty_name;
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   431
  val consts = lookup_quot_consts defs;
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   432
  val t_a = atomize_thm rthm;
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   433
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   434
  val _ = tracing ("raw atomized theorem:\n" ^ Syntax.string_of_term lthy (prop_of t_a))
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   435
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   436
  val t_r = regularize t_a rty rel rel_eqv rel_refl lthy;
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   437
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   438
  val _ = tracing ("regularised theorem:\n" ^ Syntax.string_of_term lthy (prop_of t_r))
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   439
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   440
  val t_t = repabs lthy t_r consts rty qty quot rel_refl trans2 rsp_thms;
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   441
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   442
  val _ = tracing ("rep/abs injected theorem:\n" ^ Syntax.string_of_term lthy (prop_of t_t))
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   443
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   444
  val (alls, exs) = findallex lthy rty qty (prop_of t_a);
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   445
  val allthms = map (make_allex_prs_thm lthy quot @{thm FORALL_PRS}) alls
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   446
  val exthms = map (make_allex_prs_thm lthy quot @{thm EXISTS_PRS}) exs
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   447
  val t_a = MetaSimplifier.rewrite_rule (allthms @ exthms) t_t
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   448
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   449
  val _ = tracing ("??:\n" ^ Syntax.string_of_term lthy (prop_of t_a))
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   450
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   451
  val abs = findabs rty (prop_of t_a);
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   452
  val aps = findaps rty (prop_of t_a);
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   453
  val app_prs_thms = map (applic_prs lthy rty qty absrep) aps;
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   454
  val lam_prs_thms = map (make_simp_prs_thm lthy quot @{thm LAMBDA_PRS}) abs;
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   455
  val t_l = repeat_eqsubst_thm lthy (lam_prs_thms @ app_prs_thms) t_a;
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   456
  
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   457
  val _ = tracing ("??:\n" ^ Syntax.string_of_term lthy (prop_of t_l))
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   458
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   459
  val defs_sym = flat (map (add_lower_defs lthy) defs);
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   460
  val defs_sym_eq = map (fn x => eq_reflection OF [x]) defs_sym;
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   461
  val t_id = simp_ids lthy t_l;
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   462
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   463
  val _ = tracing ("??:\n" ^ Syntax.string_of_term lthy (prop_of t_id))
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   464
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   465
  val t_d0 = MetaSimplifier.rewrite_rule defs_sym_eq t_id;
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   466
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   467
  val _ = tracing ("??:\n" ^ Syntax.string_of_term lthy (prop_of t_d0))
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   468
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   469
  val t_d = repeat_eqsubst_thm lthy defs_sym t_d0;
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   470
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   471
  val _ = tracing ("??:\n" ^ Syntax.string_of_term lthy (prop_of t_d))
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   472
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   473
  val t_r = MetaSimplifier.rewrite_rule [reps_same] t_d;
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   474
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   475
  val _ = tracing ("??:\n" ^ Syntax.string_of_term lthy (prop_of t_r))
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   476
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   477
  val t_rv = ObjectLogic.rulify t_r
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   478
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   479
  val _ = tracing ("lifted theorem:\n" ^ Syntax.string_of_term lthy (prop_of t_rv))
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   480
in
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   481
  Thm.varifyT t_rv
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   482
end
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   483
*}
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   484
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   485
ML {*
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   486
fun lift_thm_note qty qty_name rsp_thms defs thm name lthy =
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   487
  let
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   488
    val lifted_thm = lift_thm lthy qty qty_name rsp_thms defs thm;
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   489
    val (_, lthy2) = note (name, lifted_thm) lthy;
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   490
  in
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   491
    lthy2
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   492
  end
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   493
*}
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   494
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   495
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   496
ML {*
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   497
fun regularize_goal lthy thm rel_eqv rel_refl qtrm =
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   498
  let
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   499
    val reg_trm = mk_REGULARIZE_goal lthy (prop_of thm) qtrm;
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   500
    fun tac lthy = regularize_tac lthy rel_eqv rel_refl;
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   501
    val cthm = Goal.prove lthy [] [] reg_trm
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   502
      (fn {context, ...} => tac context 1);
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   503
  in
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   504
    cthm OF [thm]
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   505
  end
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   506
*}
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   507
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   508
ML {*
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   509
fun repabs_goal lthy thm rty quot_thm reflex_thm trans_thm rsp_thms qtrm =
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   510
  let
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   511
    val rg = Syntax.check_term lthy (mk_inj_REPABS_goal lthy ((prop_of thm), qtrm));
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   512
    fun tac ctxt = (ObjectLogic.full_atomize_tac) THEN'
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   513
      (REPEAT_ALL_NEW (r_mk_comb_tac ctxt rty quot_thm reflex_thm trans_thm rsp_thms));
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   514
    val cthm = Goal.prove lthy [] [] rg (fn x => tac (#context x) 1);
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   515
  in
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   516
    @{thm Pure.equal_elim_rule1} OF [cthm, thm]
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   517
  end
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   518
*}
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   519
381
991db758a72d More moving from QuotMain to UnusedQuotMain
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 379
diff changeset
   520
991db758a72d More moving from QuotMain to UnusedQuotMain
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 379
diff changeset
   521
ML {*
991db758a72d More moving from QuotMain to UnusedQuotMain
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 379
diff changeset
   522
fun atomize_goal thy gl =
991db758a72d More moving from QuotMain to UnusedQuotMain
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 379
diff changeset
   523
  let
991db758a72d More moving from QuotMain to UnusedQuotMain
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 379
diff changeset
   524
    val vars = map Free (Term.add_frees gl []);
991db758a72d More moving from QuotMain to UnusedQuotMain
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 379
diff changeset
   525
    val all = if fastype_of gl = @{typ bool} then HOLogic.all_const else Term.all;
991db758a72d More moving from QuotMain to UnusedQuotMain
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 379
diff changeset
   526
    fun lambda_all (var as Free(_, T)) trm = (all T) $ lambda var trm;
991db758a72d More moving from QuotMain to UnusedQuotMain
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 379
diff changeset
   527
    val glv = fold lambda_all vars gl
991db758a72d More moving from QuotMain to UnusedQuotMain
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 379
diff changeset
   528
    val gla = (term_of o snd o Thm.dest_equals o cprop_of) (ObjectLogic.atomize (cterm_of thy glv))
991db758a72d More moving from QuotMain to UnusedQuotMain
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 379
diff changeset
   529
    val glf = Type.legacy_freeze gla
991db758a72d More moving from QuotMain to UnusedQuotMain
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 379
diff changeset
   530
  in
991db758a72d More moving from QuotMain to UnusedQuotMain
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 379
diff changeset
   531
    if fastype_of gl = @{typ bool} then @{term Trueprop} $ glf else glf
991db758a72d More moving from QuotMain to UnusedQuotMain
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 379
diff changeset
   532
  end
991db758a72d More moving from QuotMain to UnusedQuotMain
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 379
diff changeset
   533
*}
991db758a72d More moving from QuotMain to UnusedQuotMain
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 379
diff changeset
   534
991db758a72d More moving from QuotMain to UnusedQuotMain
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 379
diff changeset
   535
991db758a72d More moving from QuotMain to UnusedQuotMain
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 379
diff changeset
   536
ML {* atomize_goal @{theory} @{term "x memb [] = False"} *}
399
646bfe5905b3 tuned comments
Christian Urban <urbanc@in.tum.de>
parents: 381
diff changeset
   537
ML {* atomize_goal @{theory} @{term "x = xa ? a # x = a # xa"} *}
381
991db758a72d More moving from QuotMain to UnusedQuotMain
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 379
diff changeset
   538
991db758a72d More moving from QuotMain to UnusedQuotMain
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 379
diff changeset
   539
466
42082fc00903 Cleaning 'aps'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 399
diff changeset
   540
ML {*
42082fc00903 Cleaning 'aps'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 399
diff changeset
   541
fun applic_prs lthy absrep (rty, qty) =
42082fc00903 Cleaning 'aps'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 399
diff changeset
   542
  let
42082fc00903 Cleaning 'aps'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 399
diff changeset
   543
    fun mk_rep (T, T') tm = (Quotient_Def.get_fun repF lthy (T, T')) $ tm;
42082fc00903 Cleaning 'aps'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 399
diff changeset
   544
    fun mk_abs (T, T') tm = (Quotient_Def.get_fun absF lthy (T, T')) $ tm;
42082fc00903 Cleaning 'aps'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 399
diff changeset
   545
    val (raty, rgty) = Term.strip_type rty;
42082fc00903 Cleaning 'aps'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 399
diff changeset
   546
    val (qaty, qgty) = Term.strip_type qty;
42082fc00903 Cleaning 'aps'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 399
diff changeset
   547
    val vs = map (fn _ => "x") qaty;
42082fc00903 Cleaning 'aps'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 399
diff changeset
   548
    val ((fname :: vfs), lthy') = Variable.variant_fixes ("f" :: vs) lthy;
42082fc00903 Cleaning 'aps'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 399
diff changeset
   549
    val f = Free (fname, qaty ---> qgty);
42082fc00903 Cleaning 'aps'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 399
diff changeset
   550
    val args = map Free (vfs ~~ qaty);
42082fc00903 Cleaning 'aps'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 399
diff changeset
   551
    val rhs = list_comb(f, args);
42082fc00903 Cleaning 'aps'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 399
diff changeset
   552
    val largs = map2 mk_rep (raty ~~ qaty) args;
42082fc00903 Cleaning 'aps'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 399
diff changeset
   553
    val lhs = mk_abs (rgty, qgty) (list_comb((mk_rep (raty ---> rgty, qaty ---> qgty) f), largs));
42082fc00903 Cleaning 'aps'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 399
diff changeset
   554
    val llhs = Syntax.check_term lthy lhs;
42082fc00903 Cleaning 'aps'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 399
diff changeset
   555
    val eq = Logic.mk_equals (llhs, rhs);
42082fc00903 Cleaning 'aps'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 399
diff changeset
   556
    val ceq = cterm_of (ProofContext.theory_of lthy') eq;
42082fc00903 Cleaning 'aps'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 399
diff changeset
   557
    val sctxt = HOL_ss addsimps (@{thms fun_map.simps id_simps} @ absrep);
42082fc00903 Cleaning 'aps'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 399
diff changeset
   558
    val t = Goal.prove_internal [] ceq (fn _ => simp_tac sctxt 1)
42082fc00903 Cleaning 'aps'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 399
diff changeset
   559
    val t_id = MetaSimplifier.rewrite_rule @{thms id_simps} t;
42082fc00903 Cleaning 'aps'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 399
diff changeset
   560
  in
42082fc00903 Cleaning 'aps'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 399
diff changeset
   561
    singleton (ProofContext.export lthy' lthy) t_id
42082fc00903 Cleaning 'aps'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 399
diff changeset
   562
  end
42082fc00903 Cleaning 'aps'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 399
diff changeset
   563
*}
42082fc00903 Cleaning 'aps'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 399
diff changeset
   564
42082fc00903 Cleaning 'aps'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 399
diff changeset
   565
ML {*
42082fc00903 Cleaning 'aps'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 399
diff changeset
   566
fun find_aps_all rtm qtm =
42082fc00903 Cleaning 'aps'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 399
diff changeset
   567
  case (rtm, qtm) of
42082fc00903 Cleaning 'aps'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 399
diff changeset
   568
    (Abs(_, T1, s1), Abs(_, T2, s2)) =>
42082fc00903 Cleaning 'aps'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 399
diff changeset
   569
      find_aps_all (subst_bound ((Free ("x", T1)), s1)) (subst_bound ((Free ("x", T2)), s2))
42082fc00903 Cleaning 'aps'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 399
diff changeset
   570
  | (((f1 as (Free (_, T1))) $ a1), ((f2 as (Free (_, T2))) $ a2)) =>
42082fc00903 Cleaning 'aps'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 399
diff changeset
   571
      let
42082fc00903 Cleaning 'aps'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 399
diff changeset
   572
        val sub = (find_aps_all f1 f2) @ (find_aps_all a1 a2)
42082fc00903 Cleaning 'aps'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 399
diff changeset
   573
      in
42082fc00903 Cleaning 'aps'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 399
diff changeset
   574
        if T1 = T2 then sub else (T1, T2) :: sub
42082fc00903 Cleaning 'aps'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 399
diff changeset
   575
      end
42082fc00903 Cleaning 'aps'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 399
diff changeset
   576
  | ((f1 $ a1), (f2 $ a2)) => (find_aps_all f1 f2) @ (find_aps_all a1 a2)
42082fc00903 Cleaning 'aps'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 399
diff changeset
   577
  | _ => [];
42082fc00903 Cleaning 'aps'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 399
diff changeset
   578
42082fc00903 Cleaning 'aps'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 399
diff changeset
   579
fun find_aps rtm qtm = distinct (op =) (find_aps_all rtm qtm)
42082fc00903 Cleaning 'aps'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 399
diff changeset
   580
*}
42082fc00903 Cleaning 'aps'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 399
diff changeset
   581
42082fc00903 Cleaning 'aps'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 399
diff changeset
   582
381
991db758a72d More moving from QuotMain to UnusedQuotMain
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 379
diff changeset
   583
379
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   584
ML {*
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   585
fun lift_thm_goal lthy qty qty_name rsp_thms defs rthm goal =
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   586
let
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   587
  val (rty, rel, rel_refl, rel_eqv) = lookup_quot_data lthy qty;
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   588
  val (trans2, reps_same, absrep, quot) = lookup_quot_thms lthy qty_name;
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   589
  val t_a = atomize_thm rthm;
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   590
  val goal_a = atomize_goal (ProofContext.theory_of lthy) goal;
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   591
  val t_r = regularize_goal lthy t_a rel_eqv rel_refl goal_a;
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   592
  val t_t = repabs_goal lthy t_r rty quot rel_refl trans2 rsp_thms goal_a;
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   593
  val (alls, exs) = findallex lthy rty qty (prop_of t_a);
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   594
  val allthms = map (make_allex_prs_thm lthy quot @{thm FORALL_PRS}) alls
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   595
  val exthms = map (make_allex_prs_thm lthy quot @{thm EXISTS_PRS}) exs
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   596
  val t_a = MetaSimplifier.rewrite_rule (allthms @ exthms) t_t
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   597
  val abs = findabs rty (prop_of t_a);
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   598
  val aps = findaps rty (prop_of t_a);
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   599
  val app_prs_thms = map (applic_prs lthy rty qty absrep) aps;
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   600
  val lam_prs_thms = map (make_simp_prs_thm lthy quot @{thm LAMBDA_PRS}) abs;
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   601
  val t_l = repeat_eqsubst_thm lthy (lam_prs_thms @ app_prs_thms) t_a;
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   602
  val defs_sym = flat (map (add_lower_defs lthy) defs);
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   603
  val defs_sym_eq = map (fn x => eq_reflection OF [x]) defs_sym;
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   604
  val t_id = simp_ids lthy t_l;
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   605
  val t_d0 = MetaSimplifier.rewrite_rule defs_sym_eq t_id;
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   606
  val t_d = repeat_eqsubst_thm lthy defs_sym t_d0;
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   607
  val t_r = MetaSimplifier.rewrite_rule [reps_same] t_d;
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   608
  val t_rv = ObjectLogic.rulify t_r
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   609
in
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   610
  Thm.varifyT t_rv
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   611
end
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   612
*}
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   613
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   614
ML {*
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   615
fun lift_thm_goal_note lthy qty qty_name rsp_thms defs thm name goal =
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   616
  let
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   617
    val lifted_thm = lift_thm_goal lthy qty qty_name rsp_thms defs thm goal;
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   618
    val (_, lthy2) = note (name, lifted_thm) lthy;
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   619
  in
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   620
    lthy2
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   621
  end
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   622
*}
57bde65f6eb2 Removed unused things from QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   623
381
991db758a72d More moving from QuotMain to UnusedQuotMain
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 379
diff changeset
   624
ML {*
991db758a72d More moving from QuotMain to UnusedQuotMain
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 379
diff changeset
   625
fun simp_ids_trm trm =
991db758a72d More moving from QuotMain to UnusedQuotMain
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 379
diff changeset
   626
  trm |>
991db758a72d More moving from QuotMain to UnusedQuotMain
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 379
diff changeset
   627
  MetaSimplifier.rewrite false @{thms eq_reflection[OF FUN_MAP_I] eq_reflection[OF id_apply] id_def_sym prod_fun_id map_id}
991db758a72d More moving from QuotMain to UnusedQuotMain
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 379
diff changeset
   628
  |> cprop_of |> Thm.dest_equals |> snd
991db758a72d More moving from QuotMain to UnusedQuotMain
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 379
diff changeset
   629
991db758a72d More moving from QuotMain to UnusedQuotMain
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 379
diff changeset
   630
*}
693
af118149ffd4 Moved Unused part of locale to Unused QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 467
diff changeset
   631
af118149ffd4 Moved Unused part of locale to Unused QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 467
diff changeset
   632
(* Unused part of the locale *)
af118149ffd4 Moved Unused part of locale to Unused QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 467
diff changeset
   633
af118149ffd4 Moved Unused part of locale to Unused QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 467
diff changeset
   634
lemma R_trans:
af118149ffd4 Moved Unused part of locale to Unused QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 467
diff changeset
   635
  assumes ab: "R a b"
af118149ffd4 Moved Unused part of locale to Unused QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 467
diff changeset
   636
  and     bc: "R b c"
af118149ffd4 Moved Unused part of locale to Unused QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 467
diff changeset
   637
  shows "R a c"
af118149ffd4 Moved Unused part of locale to Unused QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 467
diff changeset
   638
proof -
af118149ffd4 Moved Unused part of locale to Unused QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 467
diff changeset
   639
  have tr: "transp R" using equivp equivp_reflp_symp_transp[of R] by simp
af118149ffd4 Moved Unused part of locale to Unused QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 467
diff changeset
   640
  moreover have ab: "R a b" by fact
af118149ffd4 Moved Unused part of locale to Unused QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 467
diff changeset
   641
  moreover have bc: "R b c" by fact
af118149ffd4 Moved Unused part of locale to Unused QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 467
diff changeset
   642
  ultimately show "R a c" unfolding transp_def by blast
af118149ffd4 Moved Unused part of locale to Unused QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 467
diff changeset
   643
qed
af118149ffd4 Moved Unused part of locale to Unused QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 467
diff changeset
   644
af118149ffd4 Moved Unused part of locale to Unused QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 467
diff changeset
   645
lemma R_sym:
af118149ffd4 Moved Unused part of locale to Unused QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 467
diff changeset
   646
  assumes ab: "R a b"
af118149ffd4 Moved Unused part of locale to Unused QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 467
diff changeset
   647
  shows "R b a"
af118149ffd4 Moved Unused part of locale to Unused QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 467
diff changeset
   648
proof -
af118149ffd4 Moved Unused part of locale to Unused QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 467
diff changeset
   649
  have re: "symp R" using equivp equivp_reflp_symp_transp[of R] by simp
af118149ffd4 Moved Unused part of locale to Unused QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 467
diff changeset
   650
  then show "R b a" using ab unfolding symp_def by blast
af118149ffd4 Moved Unused part of locale to Unused QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 467
diff changeset
   651
qed
af118149ffd4 Moved Unused part of locale to Unused QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 467
diff changeset
   652
af118149ffd4 Moved Unused part of locale to Unused QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 467
diff changeset
   653
lemma R_trans2:
af118149ffd4 Moved Unused part of locale to Unused QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 467
diff changeset
   654
  assumes ac: "R a c"
af118149ffd4 Moved Unused part of locale to Unused QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 467
diff changeset
   655
  and     bd: "R b d"
af118149ffd4 Moved Unused part of locale to Unused QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 467
diff changeset
   656
  shows "R a b = R c d"
af118149ffd4 Moved Unused part of locale to Unused QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 467
diff changeset
   657
using ac bd
af118149ffd4 Moved Unused part of locale to Unused QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 467
diff changeset
   658
by (blast intro: R_trans R_sym)
af118149ffd4 Moved Unused part of locale to Unused QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 467
diff changeset
   659
af118149ffd4 Moved Unused part of locale to Unused QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 467
diff changeset
   660
lemma REPS_same:
af118149ffd4 Moved Unused part of locale to Unused QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 467
diff changeset
   661
  shows "R (REP a) (REP b) \<equiv> (a = b)"
af118149ffd4 Moved Unused part of locale to Unused QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 467
diff changeset
   662
proof -
af118149ffd4 Moved Unused part of locale to Unused QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 467
diff changeset
   663
  have "R (REP a) (REP b) = (a = b)"
af118149ffd4 Moved Unused part of locale to Unused QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 467
diff changeset
   664
  proof
af118149ffd4 Moved Unused part of locale to Unused QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 467
diff changeset
   665
    assume as: "R (REP a) (REP b)"
af118149ffd4 Moved Unused part of locale to Unused QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 467
diff changeset
   666
    from rep_prop
af118149ffd4 Moved Unused part of locale to Unused QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 467
diff changeset
   667
    obtain x y
af118149ffd4 Moved Unused part of locale to Unused QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 467
diff changeset
   668
      where eqs: "Rep a = R x" "Rep b = R y" by blast
af118149ffd4 Moved Unused part of locale to Unused QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 467
diff changeset
   669
    from eqs have "R (Eps (R x)) (Eps (R y))" using as unfolding REP_def by simp
af118149ffd4 Moved Unused part of locale to Unused QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 467
diff changeset
   670
    then have "R x (Eps (R y))" using lem9 by simp
af118149ffd4 Moved Unused part of locale to Unused QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 467
diff changeset
   671
    then have "R (Eps (R y)) x" using R_sym by blast
af118149ffd4 Moved Unused part of locale to Unused QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 467
diff changeset
   672
    then have "R y x" using lem9 by simp
af118149ffd4 Moved Unused part of locale to Unused QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 467
diff changeset
   673
    then have "R x y" using R_sym by blast
af118149ffd4 Moved Unused part of locale to Unused QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 467
diff changeset
   674
    then have "ABS x = ABS y" using thm11 by simp
af118149ffd4 Moved Unused part of locale to Unused QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 467
diff changeset
   675
    then have "Abs (Rep a) = Abs (Rep b)" using eqs unfolding ABS_def by simp
af118149ffd4 Moved Unused part of locale to Unused QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 467
diff changeset
   676
    then show "a = b" using rep_inverse by simp
af118149ffd4 Moved Unused part of locale to Unused QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 467
diff changeset
   677
  next
af118149ffd4 Moved Unused part of locale to Unused QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 467
diff changeset
   678
    assume ab: "a = b"
af118149ffd4 Moved Unused part of locale to Unused QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 467
diff changeset
   679
    have "reflp R" using equivp equivp_reflp_symp_transp[of R] by simp
af118149ffd4 Moved Unused part of locale to Unused QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 467
diff changeset
   680
    then show "R (REP a) (REP b)" unfolding reflp_def using ab by auto
af118149ffd4 Moved Unused part of locale to Unused QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 467
diff changeset
   681
  qed
af118149ffd4 Moved Unused part of locale to Unused QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 467
diff changeset
   682
  then show "R (REP a) (REP b) \<equiv> (a = b)" by simp
af118149ffd4 Moved Unused part of locale to Unused QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 467
diff changeset
   683
qed
af118149ffd4 Moved Unused part of locale to Unused QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 467
diff changeset
   684
af118149ffd4 Moved Unused part of locale to Unused QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 467
diff changeset
   685
af118149ffd4 Moved Unused part of locale to Unused QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 467
diff changeset
   686
af118149ffd4 Moved Unused part of locale to Unused QuotMain.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 467
diff changeset
   687