src/HOL/Tools/Quotient/quotient_term.ML
author kuncar
Fri, 23 Mar 2012 14:21:41 +0100
changeset 47095 b43ddeea727f
parent 46416 5f5665a0b973
child 47096 3ea48c19673e
permissions -rw-r--r--
simplified code of generation of aggregate relations
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
37744
3daaf23b9ab4 tuned titles
haftmann
parents: 37677
diff changeset
     1
(*  Title:      HOL/Tools/Quotient/quotient_term.ML
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
     2
    Author:     Cezary Kaliszyk and Christian Urban
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
     3
35788
f1deaca15ca3 observe standard header format;
wenzelm
parents: 35402
diff changeset
     4
Constructs terms corresponding to goals from lifting theorems to
f1deaca15ca3 observe standard header format;
wenzelm
parents: 35402
diff changeset
     5
quotient types.
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
     6
*)
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
     7
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
     8
signature QUOTIENT_TERM =
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
     9
sig
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    10
  exception LIFT_MATCH of string
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    11
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    12
  datatype flag = AbsF | RepF
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    13
45797
977cf00fb8d3 make ctxt the first parameter
kuncar
parents: 45796
diff changeset
    14
  val absrep_fun: Proof.context -> flag -> typ * typ -> term
977cf00fb8d3 make ctxt the first parameter
kuncar
parents: 45796
diff changeset
    15
  val absrep_fun_chk: Proof.context -> flag -> typ * typ -> term
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    16
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    17
  (* Allows Nitpick to represent quotient types as single elements from raw type *)
45797
977cf00fb8d3 make ctxt the first parameter
kuncar
parents: 45796
diff changeset
    18
  val absrep_const_chk: Proof.context -> flag -> string -> term
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    19
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    20
  val equiv_relation: Proof.context -> typ * typ -> term
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    21
  val equiv_relation_chk: Proof.context -> typ * typ -> term
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    22
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    23
  val regularize_trm: Proof.context -> term * term -> term
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    24
  val regularize_trm_chk: Proof.context -> term * term -> term
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    25
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    26
  val inj_repabs_trm: Proof.context -> term * term -> term
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    27
  val inj_repabs_trm_chk: Proof.context -> term * term -> term
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    28
38624
9bb0016f7e60 changed to a more convenient argument order
Christian Urban <urbanc@in.tum.de>
parents: 38558
diff changeset
    29
  val derive_qtyp: Proof.context -> typ list -> typ -> typ
9bb0016f7e60 changed to a more convenient argument order
Christian Urban <urbanc@in.tum.de>
parents: 38558
diff changeset
    30
  val derive_qtrm: Proof.context -> typ list -> term -> term
9bb0016f7e60 changed to a more convenient argument order
Christian Urban <urbanc@in.tum.de>
parents: 38558
diff changeset
    31
  val derive_rtyp: Proof.context -> typ list -> typ -> typ
9bb0016f7e60 changed to a more convenient argument order
Christian Urban <urbanc@in.tum.de>
parents: 38558
diff changeset
    32
  val derive_rtrm: Proof.context -> typ list -> term -> term
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    33
end;
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    34
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    35
structure Quotient_Term: QUOTIENT_TERM =
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    36
struct
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    37
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    38
exception LIFT_MATCH of string
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    39
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    40
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    41
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    42
(*** Aggregate Rep/Abs Function ***)
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    43
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    44
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    45
(* The flag RepF is for types in negative position; AbsF is for types
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    46
   in positive position. Because of this, function types need to be
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    47
   treated specially, since there the polarity changes.
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    48
*)
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    49
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    50
datatype flag = AbsF | RepF
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    51
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    52
fun negF AbsF = RepF
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    53
  | negF RepF = AbsF
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    54
37677
c5a8b612e571 qualified constants Set.member and Set.Collect
haftmann
parents: 37609
diff changeset
    55
fun is_identity (Const (@{const_name id}, _)) = true
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    56
  | is_identity _ = false
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    57
37677
c5a8b612e571 qualified constants Set.member and Set.Collect
haftmann
parents: 37609
diff changeset
    58
fun mk_identity ty = Const (@{const_name id}, ty --> ty)
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    59
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    60
fun mk_fun_compose flag (trm1, trm2) =
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    61
  case flag of
37677
c5a8b612e571 qualified constants Set.member and Set.Collect
haftmann
parents: 37609
diff changeset
    62
    AbsF => Const (@{const_name comp}, dummyT) $ trm1 $ trm2
c5a8b612e571 qualified constants Set.member and Set.Collect
haftmann
parents: 37609
diff changeset
    63
  | RepF => Const (@{const_name comp}, dummyT) $ trm2 $ trm1
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    64
45796
b2205eb270e3 context/theory parametres tuned
kuncar
parents: 45795
diff changeset
    65
fun get_mapfun_data ctxt s =
b2205eb270e3 context/theory parametres tuned
kuncar
parents: 45795
diff changeset
    66
  (case Symtab.lookup (Enriched_Type.entries ctxt) s of
45795
2d8949268303 maps are taken from enriched type infrastracture, rewritten lifting of constants, now we can lift even contravariant and co/contravariant types
kuncar
parents: 45628
diff changeset
    67
    SOME [map_data] => (case try dest_Const (#mapper map_data) of
2d8949268303 maps are taken from enriched type infrastracture, rewritten lifting of constants, now we can lift even contravariant and co/contravariant types
kuncar
parents: 45628
diff changeset
    68
      SOME (c, _) => (Const (c, dummyT), #variances map_data)
2d8949268303 maps are taken from enriched type infrastracture, rewritten lifting of constants, now we can lift even contravariant and co/contravariant types
kuncar
parents: 45628
diff changeset
    69
    | NONE => raise LIFT_MATCH ("map function for type " ^ quote s ^ " is not a constant."))
2d8949268303 maps are taken from enriched type infrastracture, rewritten lifting of constants, now we can lift even contravariant and co/contravariant types
kuncar
parents: 45628
diff changeset
    70
  | SOME _ => raise LIFT_MATCH ("map function for type " ^ quote s ^ " is non-singleton entry.")
2d8949268303 maps are taken from enriched type infrastracture, rewritten lifting of constants, now we can lift even contravariant and co/contravariant types
kuncar
parents: 45628
diff changeset
    71
  | NONE => raise LIFT_MATCH ("No map function for type " ^ quote s ^ " found.")) 
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    72
45796
b2205eb270e3 context/theory parametres tuned
kuncar
parents: 45795
diff changeset
    73
fun defined_mapfun_data ctxt s =
b2205eb270e3 context/theory parametres tuned
kuncar
parents: 45795
diff changeset
    74
  Symtab.defined (Enriched_Type.entries ctxt) s
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    75
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    76
(* looks up the (varified) rty and qty for
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    77
   a quotient definition
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    78
*)
45796
b2205eb270e3 context/theory parametres tuned
kuncar
parents: 45795
diff changeset
    79
fun get_rty_qty ctxt s =
b2205eb270e3 context/theory parametres tuned
kuncar
parents: 45795
diff changeset
    80
  let
b2205eb270e3 context/theory parametres tuned
kuncar
parents: 45795
diff changeset
    81
    val thy = Proof_Context.theory_of ctxt
b2205eb270e3 context/theory parametres tuned
kuncar
parents: 45795
diff changeset
    82
  in
b2205eb270e3 context/theory parametres tuned
kuncar
parents: 45795
diff changeset
    83
    (case Quotient_Info.lookup_quotients_global thy s of
b2205eb270e3 context/theory parametres tuned
kuncar
parents: 45795
diff changeset
    84
      SOME qdata => (#rtyp qdata, #qtyp qdata)
b2205eb270e3 context/theory parametres tuned
kuncar
parents: 45795
diff changeset
    85
    | NONE => raise LIFT_MATCH ("No quotient type " ^ quote s ^ " found."))
b2205eb270e3 context/theory parametres tuned
kuncar
parents: 45795
diff changeset
    86
  end
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    87
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    88
(* matches a type pattern with a type *)
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    89
fun match ctxt err ty_pat ty =
41444
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
    90
  let
42361
23f352990944 modernized structure Proof_Context;
wenzelm
parents: 41451
diff changeset
    91
    val thy = Proof_Context.theory_of ctxt
41444
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
    92
  in
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
    93
    Sign.typ_match thy (ty_pat, ty) Vartab.empty
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
    94
      handle Type.TYPE_MATCH => err ctxt ty_pat ty
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
    95
  end
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    96
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    97
(* produces the rep or abs constant for a qty *)
45797
977cf00fb8d3 make ctxt the first parameter
kuncar
parents: 45796
diff changeset
    98
fun absrep_const ctxt flag qty_str =
41444
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
    99
  let
45534
4ab21521b393 adding database of abs and rep terms to the quotient package; registering abs and rep terms in quotient_type and using them in quotient_definition
bulwahn
parents: 45340
diff changeset
   100
    (* FIXME *)
4ab21521b393 adding database of abs and rep terms to the quotient package; registering abs and rep terms in quotient_type and using them in quotient_definition
bulwahn
parents: 45340
diff changeset
   101
    fun mk_dummyT (Const (c, _)) = Const (c, dummyT)
45628
f21eb7073895 in a local context, also the free variable case needs to be analysed default tip
Christian Urban <urbanc@in.tum.de>
parents: 45534
diff changeset
   102
      | mk_dummyT (Free (c, _)) = Free (c, dummyT)
f21eb7073895 in a local context, also the free variable case needs to be analysed default tip
Christian Urban <urbanc@in.tum.de>
parents: 45534
diff changeset
   103
      | mk_dummyT _ = error "Expecting abs/rep term to be a constant or a free variable"     
41444
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   104
  in
45534
4ab21521b393 adding database of abs and rep terms to the quotient package; registering abs and rep terms in quotient_type and using them in quotient_definition
bulwahn
parents: 45340
diff changeset
   105
    case Quotient_Info.lookup_abs_rep ctxt qty_str of
4ab21521b393 adding database of abs and rep terms to the quotient package; registering abs and rep terms in quotient_type and using them in quotient_definition
bulwahn
parents: 45340
diff changeset
   106
      SOME abs_rep => 
4ab21521b393 adding database of abs and rep terms to the quotient package; registering abs and rep terms in quotient_type and using them in quotient_definition
bulwahn
parents: 45340
diff changeset
   107
        mk_dummyT (case flag of
4ab21521b393 adding database of abs and rep terms to the quotient package; registering abs and rep terms in quotient_type and using them in quotient_definition
bulwahn
parents: 45340
diff changeset
   108
          AbsF => #abs abs_rep
4ab21521b393 adding database of abs and rep terms to the quotient package; registering abs and rep terms in quotient_type and using them in quotient_definition
bulwahn
parents: 45340
diff changeset
   109
        | RepF => #rep abs_rep)
4ab21521b393 adding database of abs and rep terms to the quotient package; registering abs and rep terms in quotient_type and using them in quotient_definition
bulwahn
parents: 45340
diff changeset
   110
      | NONE => error ("No abs/rep terms for " ^ quote qty_str)
41444
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   111
  end
45534
4ab21521b393 adding database of abs and rep terms to the quotient package; registering abs and rep terms in quotient_type and using them in quotient_definition
bulwahn
parents: 45340
diff changeset
   112
  
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   113
(* Lets Nitpick represent elements of quotient types as elements of the raw type *)
45797
977cf00fb8d3 make ctxt the first parameter
kuncar
parents: 45796
diff changeset
   114
fun absrep_const_chk ctxt flag qty_str =
977cf00fb8d3 make ctxt the first parameter
kuncar
parents: 45796
diff changeset
   115
  Syntax.check_term ctxt (absrep_const ctxt flag qty_str)
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   116
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   117
fun absrep_match_err ctxt ty_pat ty =
41444
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   118
  let
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   119
    val ty_pat_str = Syntax.string_of_typ ctxt ty_pat
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   120
    val ty_str = Syntax.string_of_typ ctxt ty
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   121
  in
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   122
    raise LIFT_MATCH (space_implode " "
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   123
      ["absrep_fun (Types ", quote ty_pat_str, "and", quote ty_str, " do not match.)"])
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   124
  end
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   125
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   126
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   127
(** generation of an aggregate absrep function **)
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   128
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   129
(* - In case of equal types we just return the identity.
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   130
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   131
   - In case of TFrees we also return the identity.
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   132
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   133
   - In case of function types we recurse taking
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   134
     the polarity change into account.
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   135
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   136
   - If the type constructors are equal, we recurse for the
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   137
     arguments and build the appropriate map function.
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   138
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   139
   - If the type constructors are unequal, there must be an
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   140
     instance of quotient types:
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   141
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   142
       - we first look up the corresponding rty_pat and qty_pat
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   143
         from the quotient definition; the arguments of qty_pat
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   144
         must be some distinct TVars
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   145
       - we then match the rty_pat with rty and qty_pat with qty;
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   146
         if matching fails the types do not correspond -> error
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   147
       - the matching produces two environments; we look up the
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   148
         assignments for the qty_pat variables and recurse on the
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   149
         assignments
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   150
       - we prefix the aggregate map function for the rty_pat,
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   151
         which is an abstraction over all type variables
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   152
       - finally we compose the result with the appropriate
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   153
         absrep function in case at least one argument produced
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   154
         a non-identity function /
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   155
         otherwise we just return the appropriate absrep
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   156
         function
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   157
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   158
     The composition is necessary for types like
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   159
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   160
        ('a list) list / ('a foo) foo
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   161
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   162
     The matching is necessary for types like
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   163
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   164
        ('a * 'a) list / 'a bar
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   165
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   166
     The test is necessary in order to eliminate superfluous
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   167
     identity maps.
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   168
*)
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   169
45797
977cf00fb8d3 make ctxt the first parameter
kuncar
parents: 45796
diff changeset
   170
fun absrep_fun ctxt flag (rty, qty) =
45340
98ec8b51af9c prefer global Quotient_Info lookup to accomodate Quotient_Term, which is not quite localized yet (cf. 9fd6fce8a230);
wenzelm
parents: 45280
diff changeset
   171
  let
45795
2d8949268303 maps are taken from enriched type infrastracture, rewritten lifting of constants, now we can lift even contravariant and co/contravariant types
kuncar
parents: 45628
diff changeset
   172
    fun absrep_args tys tys' variances =
2d8949268303 maps are taken from enriched type infrastracture, rewritten lifting of constants, now we can lift even contravariant and co/contravariant types
kuncar
parents: 45628
diff changeset
   173
      let
2d8949268303 maps are taken from enriched type infrastracture, rewritten lifting of constants, now we can lift even contravariant and co/contravariant types
kuncar
parents: 45628
diff changeset
   174
        fun absrep_arg (types, (_, variant)) =
2d8949268303 maps are taken from enriched type infrastracture, rewritten lifting of constants, now we can lift even contravariant and co/contravariant types
kuncar
parents: 45628
diff changeset
   175
          (case variant of
2d8949268303 maps are taken from enriched type infrastracture, rewritten lifting of constants, now we can lift even contravariant and co/contravariant types
kuncar
parents: 45628
diff changeset
   176
            (false, false) => []
45797
977cf00fb8d3 make ctxt the first parameter
kuncar
parents: 45796
diff changeset
   177
          | (true, false) => [(absrep_fun ctxt flag types)]
977cf00fb8d3 make ctxt the first parameter
kuncar
parents: 45796
diff changeset
   178
          | (false, true) => [(absrep_fun ctxt (negF flag) types)]
977cf00fb8d3 make ctxt the first parameter
kuncar
parents: 45796
diff changeset
   179
          | (true, true) => [(absrep_fun ctxt flag types),(absrep_fun ctxt (negF flag) types)])
45795
2d8949268303 maps are taken from enriched type infrastracture, rewritten lifting of constants, now we can lift even contravariant and co/contravariant types
kuncar
parents: 45628
diff changeset
   180
      in
2d8949268303 maps are taken from enriched type infrastracture, rewritten lifting of constants, now we can lift even contravariant and co/contravariant types
kuncar
parents: 45628
diff changeset
   181
        maps absrep_arg ((tys ~~ tys') ~~ variances)
2d8949268303 maps are taken from enriched type infrastracture, rewritten lifting of constants, now we can lift even contravariant and co/contravariant types
kuncar
parents: 45628
diff changeset
   182
      end
2d8949268303 maps are taken from enriched type infrastracture, rewritten lifting of constants, now we can lift even contravariant and co/contravariant types
kuncar
parents: 45628
diff changeset
   183
    fun test_identities tys rtys' s s' =
2d8949268303 maps are taken from enriched type infrastracture, rewritten lifting of constants, now we can lift even contravariant and co/contravariant types
kuncar
parents: 45628
diff changeset
   184
      let
45797
977cf00fb8d3 make ctxt the first parameter
kuncar
parents: 45796
diff changeset
   185
        val args = map (absrep_fun ctxt flag) (tys ~~ rtys')
45795
2d8949268303 maps are taken from enriched type infrastracture, rewritten lifting of constants, now we can lift even contravariant and co/contravariant types
kuncar
parents: 45628
diff changeset
   186
      in
2d8949268303 maps are taken from enriched type infrastracture, rewritten lifting of constants, now we can lift even contravariant and co/contravariant types
kuncar
parents: 45628
diff changeset
   187
        if forall is_identity args
2d8949268303 maps are taken from enriched type infrastracture, rewritten lifting of constants, now we can lift even contravariant and co/contravariant types
kuncar
parents: 45628
diff changeset
   188
        then 
45797
977cf00fb8d3 make ctxt the first parameter
kuncar
parents: 45796
diff changeset
   189
          absrep_const ctxt flag s'
45795
2d8949268303 maps are taken from enriched type infrastracture, rewritten lifting of constants, now we can lift even contravariant and co/contravariant types
kuncar
parents: 45628
diff changeset
   190
        else 
2d8949268303 maps are taken from enriched type infrastracture, rewritten lifting of constants, now we can lift even contravariant and co/contravariant types
kuncar
parents: 45628
diff changeset
   191
          raise LIFT_MATCH ("No map function for type " ^ quote s ^ " found.")
2d8949268303 maps are taken from enriched type infrastracture, rewritten lifting of constants, now we can lift even contravariant and co/contravariant types
kuncar
parents: 45628
diff changeset
   192
      end
45340
98ec8b51af9c prefer global Quotient_Info lookup to accomodate Quotient_Term, which is not quite localized yet (cf. 9fd6fce8a230);
wenzelm
parents: 45280
diff changeset
   193
  in
98ec8b51af9c prefer global Quotient_Info lookup to accomodate Quotient_Term, which is not quite localized yet (cf. 9fd6fce8a230);
wenzelm
parents: 45280
diff changeset
   194
    if rty = qty
98ec8b51af9c prefer global Quotient_Info lookup to accomodate Quotient_Term, which is not quite localized yet (cf. 9fd6fce8a230);
wenzelm
parents: 45280
diff changeset
   195
    then mk_identity rty
98ec8b51af9c prefer global Quotient_Info lookup to accomodate Quotient_Term, which is not quite localized yet (cf. 9fd6fce8a230);
wenzelm
parents: 45280
diff changeset
   196
    else
98ec8b51af9c prefer global Quotient_Info lookup to accomodate Quotient_Term, which is not quite localized yet (cf. 9fd6fce8a230);
wenzelm
parents: 45280
diff changeset
   197
      case (rty, qty) of
45795
2d8949268303 maps are taken from enriched type infrastracture, rewritten lifting of constants, now we can lift even contravariant and co/contravariant types
kuncar
parents: 45628
diff changeset
   198
        (Type (s, tys), Type (s', tys')) =>
45340
98ec8b51af9c prefer global Quotient_Info lookup to accomodate Quotient_Term, which is not quite localized yet (cf. 9fd6fce8a230);
wenzelm
parents: 45280
diff changeset
   199
          if s = s'
98ec8b51af9c prefer global Quotient_Info lookup to accomodate Quotient_Term, which is not quite localized yet (cf. 9fd6fce8a230);
wenzelm
parents: 45280
diff changeset
   200
          then
98ec8b51af9c prefer global Quotient_Info lookup to accomodate Quotient_Term, which is not quite localized yet (cf. 9fd6fce8a230);
wenzelm
parents: 45280
diff changeset
   201
            let
45796
b2205eb270e3 context/theory parametres tuned
kuncar
parents: 45795
diff changeset
   202
              val (map_fun, variances) = get_mapfun_data ctxt s
45795
2d8949268303 maps are taken from enriched type infrastracture, rewritten lifting of constants, now we can lift even contravariant and co/contravariant types
kuncar
parents: 45628
diff changeset
   203
              val args = absrep_args tys tys' variances
45340
98ec8b51af9c prefer global Quotient_Info lookup to accomodate Quotient_Term, which is not quite localized yet (cf. 9fd6fce8a230);
wenzelm
parents: 45280
diff changeset
   204
            in
45795
2d8949268303 maps are taken from enriched type infrastracture, rewritten lifting of constants, now we can lift even contravariant and co/contravariant types
kuncar
parents: 45628
diff changeset
   205
              list_comb (map_fun, args)
45340
98ec8b51af9c prefer global Quotient_Info lookup to accomodate Quotient_Term, which is not quite localized yet (cf. 9fd6fce8a230);
wenzelm
parents: 45280
diff changeset
   206
            end
98ec8b51af9c prefer global Quotient_Info lookup to accomodate Quotient_Term, which is not quite localized yet (cf. 9fd6fce8a230);
wenzelm
parents: 45280
diff changeset
   207
          else
98ec8b51af9c prefer global Quotient_Info lookup to accomodate Quotient_Term, which is not quite localized yet (cf. 9fd6fce8a230);
wenzelm
parents: 45280
diff changeset
   208
            let
45796
b2205eb270e3 context/theory parametres tuned
kuncar
parents: 45795
diff changeset
   209
              val (Type (_, rtys), qty_pat) = get_rty_qty ctxt s'
45340
98ec8b51af9c prefer global Quotient_Info lookup to accomodate Quotient_Term, which is not quite localized yet (cf. 9fd6fce8a230);
wenzelm
parents: 45280
diff changeset
   210
              val qtyenv = match ctxt absrep_match_err qty_pat qty
45795
2d8949268303 maps are taken from enriched type infrastracture, rewritten lifting of constants, now we can lift even contravariant and co/contravariant types
kuncar
parents: 45628
diff changeset
   211
              val rtys' = map (Envir.subst_type qtyenv) rtys
45340
98ec8b51af9c prefer global Quotient_Info lookup to accomodate Quotient_Term, which is not quite localized yet (cf. 9fd6fce8a230);
wenzelm
parents: 45280
diff changeset
   212
            in
45796
b2205eb270e3 context/theory parametres tuned
kuncar
parents: 45795
diff changeset
   213
              if not (defined_mapfun_data ctxt s)
45795
2d8949268303 maps are taken from enriched type infrastracture, rewritten lifting of constants, now we can lift even contravariant and co/contravariant types
kuncar
parents: 45628
diff changeset
   214
              then
2d8949268303 maps are taken from enriched type infrastracture, rewritten lifting of constants, now we can lift even contravariant and co/contravariant types
kuncar
parents: 45628
diff changeset
   215
                (*
2d8949268303 maps are taken from enriched type infrastracture, rewritten lifting of constants, now we can lift even contravariant and co/contravariant types
kuncar
parents: 45628
diff changeset
   216
                    If we don't know a map function for the raw type,
2d8949268303 maps are taken from enriched type infrastracture, rewritten lifting of constants, now we can lift even contravariant and co/contravariant types
kuncar
parents: 45628
diff changeset
   217
                    we are not necessarilly in troubles because
2d8949268303 maps are taken from enriched type infrastracture, rewritten lifting of constants, now we can lift even contravariant and co/contravariant types
kuncar
parents: 45628
diff changeset
   218
                    it can still be the case we don't need the map 
2d8949268303 maps are taken from enriched type infrastracture, rewritten lifting of constants, now we can lift even contravariant and co/contravariant types
kuncar
parents: 45628
diff changeset
   219
                    function <=> all abs/rep functions are identities.
2d8949268303 maps are taken from enriched type infrastracture, rewritten lifting of constants, now we can lift even contravariant and co/contravariant types
kuncar
parents: 45628
diff changeset
   220
                *)
2d8949268303 maps are taken from enriched type infrastracture, rewritten lifting of constants, now we can lift even contravariant and co/contravariant types
kuncar
parents: 45628
diff changeset
   221
                test_identities tys rtys' s s'
45340
98ec8b51af9c prefer global Quotient_Info lookup to accomodate Quotient_Term, which is not quite localized yet (cf. 9fd6fce8a230);
wenzelm
parents: 45280
diff changeset
   222
              else
98ec8b51af9c prefer global Quotient_Info lookup to accomodate Quotient_Term, which is not quite localized yet (cf. 9fd6fce8a230);
wenzelm
parents: 45280
diff changeset
   223
                let
45796
b2205eb270e3 context/theory parametres tuned
kuncar
parents: 45795
diff changeset
   224
                  val (map_fun, variances) = get_mapfun_data ctxt s
45795
2d8949268303 maps are taken from enriched type infrastracture, rewritten lifting of constants, now we can lift even contravariant and co/contravariant types
kuncar
parents: 45628
diff changeset
   225
                  val args = absrep_args tys rtys' variances
45340
98ec8b51af9c prefer global Quotient_Info lookup to accomodate Quotient_Term, which is not quite localized yet (cf. 9fd6fce8a230);
wenzelm
parents: 45280
diff changeset
   226
                in
45795
2d8949268303 maps are taken from enriched type infrastracture, rewritten lifting of constants, now we can lift even contravariant and co/contravariant types
kuncar
parents: 45628
diff changeset
   227
                  if forall is_identity args
45797
977cf00fb8d3 make ctxt the first parameter
kuncar
parents: 45796
diff changeset
   228
                  then absrep_const ctxt flag s'
45795
2d8949268303 maps are taken from enriched type infrastracture, rewritten lifting of constants, now we can lift even contravariant and co/contravariant types
kuncar
parents: 45628
diff changeset
   229
                  else
2d8949268303 maps are taken from enriched type infrastracture, rewritten lifting of constants, now we can lift even contravariant and co/contravariant types
kuncar
parents: 45628
diff changeset
   230
                    let
2d8949268303 maps are taken from enriched type infrastracture, rewritten lifting of constants, now we can lift even contravariant and co/contravariant types
kuncar
parents: 45628
diff changeset
   231
                      val result = list_comb (map_fun, args)
2d8949268303 maps are taken from enriched type infrastracture, rewritten lifting of constants, now we can lift even contravariant and co/contravariant types
kuncar
parents: 45628
diff changeset
   232
                    in
45797
977cf00fb8d3 make ctxt the first parameter
kuncar
parents: 45796
diff changeset
   233
                      mk_fun_compose flag (absrep_const ctxt flag s', result)
45795
2d8949268303 maps are taken from enriched type infrastracture, rewritten lifting of constants, now we can lift even contravariant and co/contravariant types
kuncar
parents: 45628
diff changeset
   234
                    end
45340
98ec8b51af9c prefer global Quotient_Info lookup to accomodate Quotient_Term, which is not quite localized yet (cf. 9fd6fce8a230);
wenzelm
parents: 45280
diff changeset
   235
                end
98ec8b51af9c prefer global Quotient_Info lookup to accomodate Quotient_Term, which is not quite localized yet (cf. 9fd6fce8a230);
wenzelm
parents: 45280
diff changeset
   236
            end
98ec8b51af9c prefer global Quotient_Info lookup to accomodate Quotient_Term, which is not quite localized yet (cf. 9fd6fce8a230);
wenzelm
parents: 45280
diff changeset
   237
      | (TFree x, TFree x') =>
98ec8b51af9c prefer global Quotient_Info lookup to accomodate Quotient_Term, which is not quite localized yet (cf. 9fd6fce8a230);
wenzelm
parents: 45280
diff changeset
   238
          if x = x'
98ec8b51af9c prefer global Quotient_Info lookup to accomodate Quotient_Term, which is not quite localized yet (cf. 9fd6fce8a230);
wenzelm
parents: 45280
diff changeset
   239
          then mk_identity rty
98ec8b51af9c prefer global Quotient_Info lookup to accomodate Quotient_Term, which is not quite localized yet (cf. 9fd6fce8a230);
wenzelm
parents: 45280
diff changeset
   240
          else raise (LIFT_MATCH "absrep_fun (frees)")
98ec8b51af9c prefer global Quotient_Info lookup to accomodate Quotient_Term, which is not quite localized yet (cf. 9fd6fce8a230);
wenzelm
parents: 45280
diff changeset
   241
      | (TVar _, TVar _) => raise (LIFT_MATCH "absrep_fun (vars)")
98ec8b51af9c prefer global Quotient_Info lookup to accomodate Quotient_Term, which is not quite localized yet (cf. 9fd6fce8a230);
wenzelm
parents: 45280
diff changeset
   242
      | _ => raise (LIFT_MATCH "absrep_fun (default)")
98ec8b51af9c prefer global Quotient_Info lookup to accomodate Quotient_Term, which is not quite localized yet (cf. 9fd6fce8a230);
wenzelm
parents: 45280
diff changeset
   243
  end
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   244
45797
977cf00fb8d3 make ctxt the first parameter
kuncar
parents: 45796
diff changeset
   245
fun absrep_fun_chk ctxt flag (rty, qty) =
977cf00fb8d3 make ctxt the first parameter
kuncar
parents: 45796
diff changeset
   246
  absrep_fun ctxt flag (rty, qty)
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   247
  |> Syntax.check_term ctxt
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   248
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   249
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   250
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   251
(*** Aggregate Equivalence Relation ***)
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   252
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   253
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   254
(* works very similar to the absrep generation,
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   255
   except there is no need for polarities
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   256
*)
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   257
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   258
(* instantiates TVars so that the term is of type ty *)
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   259
fun force_typ ctxt trm ty =
41444
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   260
  let
42361
23f352990944 modernized structure Proof_Context;
wenzelm
parents: 41451
diff changeset
   261
    val thy = Proof_Context.theory_of ctxt
41444
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   262
    val trm_ty = fastype_of trm
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   263
    val ty_inst = Sign.typ_match thy (trm_ty, ty) Vartab.empty
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   264
  in
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   265
    map_types (Envir.subst_type ty_inst) trm
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   266
  end
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   267
38864
4abe644fcea5 formerly unnamed infix equality now named HOL.eq
haftmann
parents: 38795
diff changeset
   268
fun is_eq (Const (@{const_name HOL.eq}, _)) = true
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   269
  | is_eq _ = false
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   270
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   271
fun mk_rel_compose (trm1, trm2) =
35402
115a5a95710a clarified @{const_name} vs. @{const_abbrev};
wenzelm
parents: 35222
diff changeset
   272
  Const (@{const_abbrev "rel_conj"}, dummyT) $ trm1 $ trm2
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   273
45340
98ec8b51af9c prefer global Quotient_Info lookup to accomodate Quotient_Term, which is not quite localized yet (cf. 9fd6fce8a230);
wenzelm
parents: 45280
diff changeset
   274
fun get_relmap thy s =
98ec8b51af9c prefer global Quotient_Info lookup to accomodate Quotient_Term, which is not quite localized yet (cf. 9fd6fce8a230);
wenzelm
parents: 45280
diff changeset
   275
  (case Quotient_Info.lookup_quotmaps thy s of
45273
728ed9d28c63 respecting isabelle's programming style in the quotient package by simplifying map_lookup function for data access
bulwahn
parents: 45272
diff changeset
   276
    SOME map_data => Const (#relmap map_data, dummyT)
45279
89a17197cb98 simplified/standardized signatures;
wenzelm
parents: 45274
diff changeset
   277
  | NONE => raise LIFT_MATCH ("get_relmap (no relation map function found for type " ^ s ^ ")"))
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   278
45340
98ec8b51af9c prefer global Quotient_Info lookup to accomodate Quotient_Term, which is not quite localized yet (cf. 9fd6fce8a230);
wenzelm
parents: 45280
diff changeset
   279
fun get_equiv_rel thy s =
98ec8b51af9c prefer global Quotient_Info lookup to accomodate Quotient_Term, which is not quite localized yet (cf. 9fd6fce8a230);
wenzelm
parents: 45280
diff changeset
   280
  (case Quotient_Info.lookup_quotients thy s of
45279
89a17197cb98 simplified/standardized signatures;
wenzelm
parents: 45274
diff changeset
   281
    SOME qdata => #equiv_rel qdata
47095
b43ddeea727f simplified code of generation of aggregate relations
kuncar
parents: 46416
diff changeset
   282
  | NONE => raise LIFT_MATCH ("get_equiv_rel (no quotient found for type " ^ s ^ ")"))
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   283
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   284
fun equiv_match_err ctxt ty_pat ty =
41444
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   285
  let
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   286
    val ty_pat_str = Syntax.string_of_typ ctxt ty_pat
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   287
    val ty_str = Syntax.string_of_typ ctxt ty
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   288
  in
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   289
    raise LIFT_MATCH (space_implode " "
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   290
      ["equiv_relation (Types ", quote ty_pat_str, "and", quote ty_str, " do not match.)"])
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   291
  end
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   292
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   293
(* builds the aggregate equivalence relation
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   294
   that will be the argument of Respects
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   295
*)
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   296
fun equiv_relation ctxt (rty, qty) =
45796
b2205eb270e3 context/theory parametres tuned
kuncar
parents: 45795
diff changeset
   297
  if rty = qty
b2205eb270e3 context/theory parametres tuned
kuncar
parents: 45795
diff changeset
   298
  then HOLogic.eq_const rty
b2205eb270e3 context/theory parametres tuned
kuncar
parents: 45795
diff changeset
   299
  else
b2205eb270e3 context/theory parametres tuned
kuncar
parents: 45795
diff changeset
   300
    case (rty, qty) of
b2205eb270e3 context/theory parametres tuned
kuncar
parents: 45795
diff changeset
   301
      (Type (s, tys), Type (s', tys')) =>
b2205eb270e3 context/theory parametres tuned
kuncar
parents: 45795
diff changeset
   302
        if s = s'
b2205eb270e3 context/theory parametres tuned
kuncar
parents: 45795
diff changeset
   303
        then
b2205eb270e3 context/theory parametres tuned
kuncar
parents: 45795
diff changeset
   304
          let
b2205eb270e3 context/theory parametres tuned
kuncar
parents: 45795
diff changeset
   305
            val args = map (equiv_relation ctxt) (tys ~~ tys')
b2205eb270e3 context/theory parametres tuned
kuncar
parents: 45795
diff changeset
   306
          in
b2205eb270e3 context/theory parametres tuned
kuncar
parents: 45795
diff changeset
   307
            list_comb (get_relmap ctxt s, args)
b2205eb270e3 context/theory parametres tuned
kuncar
parents: 45795
diff changeset
   308
          end
b2205eb270e3 context/theory parametres tuned
kuncar
parents: 45795
diff changeset
   309
        else
b2205eb270e3 context/theory parametres tuned
kuncar
parents: 45795
diff changeset
   310
          let
47095
b43ddeea727f simplified code of generation of aggregate relations
kuncar
parents: 46416
diff changeset
   311
            val (Type (_, rtys), qty_pat) = get_rty_qty ctxt s'
45796
b2205eb270e3 context/theory parametres tuned
kuncar
parents: 45795
diff changeset
   312
            val qtyenv = match ctxt equiv_match_err qty_pat qty
47095
b43ddeea727f simplified code of generation of aggregate relations
kuncar
parents: 46416
diff changeset
   313
            val rtys' = map (Envir.subst_type qtyenv) rtys
b43ddeea727f simplified code of generation of aggregate relations
kuncar
parents: 46416
diff changeset
   314
            val args = map (equiv_relation ctxt) (tys ~~ rtys')
45796
b2205eb270e3 context/theory parametres tuned
kuncar
parents: 45795
diff changeset
   315
            val eqv_rel = get_equiv_rel ctxt s'
b2205eb270e3 context/theory parametres tuned
kuncar
parents: 45795
diff changeset
   316
            val eqv_rel' = force_typ ctxt eqv_rel ([rty, rty] ---> @{typ bool})
b2205eb270e3 context/theory parametres tuned
kuncar
parents: 45795
diff changeset
   317
          in
b2205eb270e3 context/theory parametres tuned
kuncar
parents: 45795
diff changeset
   318
            if forall is_eq args
b2205eb270e3 context/theory parametres tuned
kuncar
parents: 45795
diff changeset
   319
            then eqv_rel'
b2205eb270e3 context/theory parametres tuned
kuncar
parents: 45795
diff changeset
   320
            else
b2205eb270e3 context/theory parametres tuned
kuncar
parents: 45795
diff changeset
   321
              let
47095
b43ddeea727f simplified code of generation of aggregate relations
kuncar
parents: 46416
diff changeset
   322
                val result = list_comb (get_relmap ctxt s, args)
45796
b2205eb270e3 context/theory parametres tuned
kuncar
parents: 45795
diff changeset
   323
              in
b2205eb270e3 context/theory parametres tuned
kuncar
parents: 45795
diff changeset
   324
                mk_rel_compose (result, eqv_rel')
b2205eb270e3 context/theory parametres tuned
kuncar
parents: 45795
diff changeset
   325
              end
b2205eb270e3 context/theory parametres tuned
kuncar
parents: 45795
diff changeset
   326
          end
b2205eb270e3 context/theory parametres tuned
kuncar
parents: 45795
diff changeset
   327
    | _ => HOLogic.eq_const rty
b2205eb270e3 context/theory parametres tuned
kuncar
parents: 45795
diff changeset
   328
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   329
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   330
fun equiv_relation_chk ctxt (rty, qty) =
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   331
  equiv_relation ctxt (rty, qty)
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   332
  |> Syntax.check_term ctxt
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   333
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   334
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   335
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   336
(*** Regularization ***)
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   337
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   338
(* Regularizing an rtrm means:
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   339
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   340
 - Quantifiers over types that need lifting are replaced
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   341
   by bounded quantifiers, for example:
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   342
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   343
      All P  ----> All (Respects R) P
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   344
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   345
   where the aggregate relation R is given by the rty and qty;
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   346
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   347
 - Abstractions over types that need lifting are replaced
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   348
   by bounded abstractions, for example:
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   349
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   350
      %x. P  ----> Ball (Respects R) %x. P
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   351
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   352
 - Equalities over types that need lifting are replaced by
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   353
   corresponding equivalence relations, for example:
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   354
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   355
      A = B  ----> R A B
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   356
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   357
   or
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   358
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   359
      A = B  ----> (R ===> R) A B
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   360
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   361
   for more complicated types of A and B
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   362
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   363
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   364
 The regularize_trm accepts raw theorems in which equalities
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   365
 and quantifiers match exactly the ones in the lifted theorem
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   366
 but also accepts partially regularized terms.
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   367
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   368
 This means that the raw theorems can have:
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   369
   Ball (Respects R),  Bex (Respects R), Bex1_rel (Respects R), Babs, R
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   370
 in the places where:
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   371
   All, Ex, Ex1, %, (op =)
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   372
 is required the lifted theorem.
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   373
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   374
*)
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   375
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   376
val mk_babs = Const (@{const_name Babs}, dummyT)
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   377
val mk_ball = Const (@{const_name Ball}, dummyT)
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   378
val mk_bex  = Const (@{const_name Bex}, dummyT)
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   379
val mk_bex1_rel = Const (@{const_name Bex1_rel}, dummyT)
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   380
val mk_resp = Const (@{const_name Respects}, dummyT)
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   381
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   382
(* - applies f to the subterm of an abstraction,
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   383
     otherwise to the given term,
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   384
   - used by regularize, therefore abstracted
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   385
     variables do not have to be treated specially
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   386
*)
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   387
fun apply_subt f (trm1, trm2) =
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   388
  case (trm1, trm2) of
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   389
    (Abs (x, T, t), Abs (_ , _, t')) => Abs (x, T, f (t, t'))
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   390
  | _ => f (trm1, trm2)
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   391
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   392
fun term_mismatch str ctxt t1 t2 =
41444
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   393
  let
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   394
    val t1_str = Syntax.string_of_term ctxt t1
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   395
    val t2_str = Syntax.string_of_term ctxt t2
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   396
    val t1_ty_str = Syntax.string_of_typ ctxt (fastype_of t1)
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   397
    val t2_ty_str = Syntax.string_of_typ ctxt (fastype_of t2)
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   398
  in
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   399
    raise LIFT_MATCH (cat_lines [str, t1_str ^ "::" ^ t1_ty_str, t2_str ^ "::" ^ t2_ty_str])
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   400
  end
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   401
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   402
(* the major type of All and Ex quantifiers *)
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   403
fun qnt_typ ty = domain_type (domain_type ty)
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   404
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   405
(* Checks that two types match, for example:
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   406
     rty -> rty   matches   qty -> qty *)
45280
9fd6fce8a230 localized quotient data;
wenzelm
parents: 45279
diff changeset
   407
fun matches_typ ctxt rT qT =
45340
98ec8b51af9c prefer global Quotient_Info lookup to accomodate Quotient_Term, which is not quite localized yet (cf. 9fd6fce8a230);
wenzelm
parents: 45280
diff changeset
   408
  let
98ec8b51af9c prefer global Quotient_Info lookup to accomodate Quotient_Term, which is not quite localized yet (cf. 9fd6fce8a230);
wenzelm
parents: 45280
diff changeset
   409
    val thy = Proof_Context.theory_of ctxt
98ec8b51af9c prefer global Quotient_Info lookup to accomodate Quotient_Term, which is not quite localized yet (cf. 9fd6fce8a230);
wenzelm
parents: 45280
diff changeset
   410
  in
98ec8b51af9c prefer global Quotient_Info lookup to accomodate Quotient_Term, which is not quite localized yet (cf. 9fd6fce8a230);
wenzelm
parents: 45280
diff changeset
   411
    if rT = qT then true
98ec8b51af9c prefer global Quotient_Info lookup to accomodate Quotient_Term, which is not quite localized yet (cf. 9fd6fce8a230);
wenzelm
parents: 45280
diff changeset
   412
    else
98ec8b51af9c prefer global Quotient_Info lookup to accomodate Quotient_Term, which is not quite localized yet (cf. 9fd6fce8a230);
wenzelm
parents: 45280
diff changeset
   413
      (case (rT, qT) of
98ec8b51af9c prefer global Quotient_Info lookup to accomodate Quotient_Term, which is not quite localized yet (cf. 9fd6fce8a230);
wenzelm
parents: 45280
diff changeset
   414
        (Type (rs, rtys), Type (qs, qtys)) =>
98ec8b51af9c prefer global Quotient_Info lookup to accomodate Quotient_Term, which is not quite localized yet (cf. 9fd6fce8a230);
wenzelm
parents: 45280
diff changeset
   415
          if rs = qs then
98ec8b51af9c prefer global Quotient_Info lookup to accomodate Quotient_Term, which is not quite localized yet (cf. 9fd6fce8a230);
wenzelm
parents: 45280
diff changeset
   416
            if length rtys <> length qtys then false
98ec8b51af9c prefer global Quotient_Info lookup to accomodate Quotient_Term, which is not quite localized yet (cf. 9fd6fce8a230);
wenzelm
parents: 45280
diff changeset
   417
            else forall (fn x => x = true) (map2 (matches_typ ctxt) rtys qtys)
98ec8b51af9c prefer global Quotient_Info lookup to accomodate Quotient_Term, which is not quite localized yet (cf. 9fd6fce8a230);
wenzelm
parents: 45280
diff changeset
   418
          else
98ec8b51af9c prefer global Quotient_Info lookup to accomodate Quotient_Term, which is not quite localized yet (cf. 9fd6fce8a230);
wenzelm
parents: 45280
diff changeset
   419
            (case Quotient_Info.lookup_quotients_global thy qs of
98ec8b51af9c prefer global Quotient_Info lookup to accomodate Quotient_Term, which is not quite localized yet (cf. 9fd6fce8a230);
wenzelm
parents: 45280
diff changeset
   420
              SOME quotinfo => Sign.typ_instance thy (rT, #rtyp quotinfo)
98ec8b51af9c prefer global Quotient_Info lookup to accomodate Quotient_Term, which is not quite localized yet (cf. 9fd6fce8a230);
wenzelm
parents: 45280
diff changeset
   421
            | NONE => false)
98ec8b51af9c prefer global Quotient_Info lookup to accomodate Quotient_Term, which is not quite localized yet (cf. 9fd6fce8a230);
wenzelm
parents: 45280
diff changeset
   422
      | _ => false)
98ec8b51af9c prefer global Quotient_Info lookup to accomodate Quotient_Term, which is not quite localized yet (cf. 9fd6fce8a230);
wenzelm
parents: 45280
diff changeset
   423
  end
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   424
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   425
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   426
(* produces a regularized version of rtrm
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   427
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   428
   - the result might contain dummyTs
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   429
38718
c7cbbb18eabe tuned code
Christian Urban <urbanc@in.tum.de>
parents: 38694
diff changeset
   430
   - for regularization we do not need any
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   431
     special treatment of bound variables
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   432
*)
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   433
fun regularize_trm ctxt (rtrm, qtrm) =
45280
9fd6fce8a230 localized quotient data;
wenzelm
parents: 45279
diff changeset
   434
  (case (rtrm, qtrm) of
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   435
    (Abs (x, ty, t), Abs (_, ty', t')) =>
41444
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   436
      let
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   437
        val subtrm = Abs(x, ty, regularize_trm ctxt (t, t'))
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   438
      in
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   439
        if ty = ty' then subtrm
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   440
        else mk_babs $ (mk_resp $ equiv_relation ctxt (ty, ty')) $ subtrm
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   441
      end
45280
9fd6fce8a230 localized quotient data;
wenzelm
parents: 45279
diff changeset
   442
37677
c5a8b612e571 qualified constants Set.member and Set.Collect
haftmann
parents: 37609
diff changeset
   443
  | (Const (@{const_name Babs}, T) $ resrel $ (t as (Abs (_, ty, _))), t' as (Abs (_, ty', _))) =>
41444
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   444
      let
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   445
        val subtrm = regularize_trm ctxt (t, t')
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   446
        val needres = mk_resp $ equiv_relation_chk ctxt (ty, ty')
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   447
      in
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   448
        if resrel <> needres
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   449
        then term_mismatch "regularize (Babs)" ctxt resrel needres
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   450
        else mk_babs $ resrel $ subtrm
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   451
      end
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   452
37677
c5a8b612e571 qualified constants Set.member and Set.Collect
haftmann
parents: 37609
diff changeset
   453
  | (Const (@{const_name All}, ty) $ t, Const (@{const_name All}, ty') $ t') =>
41444
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   454
      let
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   455
        val subtrm = apply_subt (regularize_trm ctxt) (t, t')
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   456
      in
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   457
        if ty = ty' then Const (@{const_name All}, ty) $ subtrm
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   458
        else mk_ball $ (mk_resp $ equiv_relation ctxt (qnt_typ ty, qnt_typ ty')) $ subtrm
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   459
      end
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   460
37677
c5a8b612e571 qualified constants Set.member and Set.Collect
haftmann
parents: 37609
diff changeset
   461
  | (Const (@{const_name Ex}, ty) $ t, Const (@{const_name Ex}, ty') $ t') =>
41444
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   462
      let
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   463
        val subtrm = apply_subt (regularize_trm ctxt) (t, t')
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   464
      in
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   465
        if ty = ty' then Const (@{const_name Ex}, ty) $ subtrm
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   466
        else mk_bex $ (mk_resp $ equiv_relation ctxt (qnt_typ ty, qnt_typ ty')) $ subtrm
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   467
      end
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   468
37677
c5a8b612e571 qualified constants Set.member and Set.Collect
haftmann
parents: 37609
diff changeset
   469
  | (Const (@{const_name Ex1}, ty) $ (Abs (_, _,
38795
848be46708dc formerly unnamed infix conjunction and disjunction now named HOL.conj and HOL.disj
haftmann
parents: 38718
diff changeset
   470
      (Const (@{const_name HOL.conj}, _) $ (Const (@{const_name Set.member}, _) $ _ $
37677
c5a8b612e571 qualified constants Set.member and Set.Collect
haftmann
parents: 37609
diff changeset
   471
        (Const (@{const_name Respects}, _) $ resrel)) $ (t $ _)))),
c5a8b612e571 qualified constants Set.member and Set.Collect
haftmann
parents: 37609
diff changeset
   472
     Const (@{const_name Ex1}, ty') $ t') =>
41444
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   473
      let
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   474
        val t_ = incr_boundvars (~1) t
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   475
        val subtrm = apply_subt (regularize_trm ctxt) (t_, t')
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   476
        val needrel = equiv_relation_chk ctxt (qnt_typ ty, qnt_typ ty')
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   477
      in
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   478
        if resrel <> needrel
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   479
        then term_mismatch "regularize (Bex1)" ctxt resrel needrel
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   480
        else mk_bex1_rel $ resrel $ subtrm
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   481
      end
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   482
38558
32ad17fe2b9c tuned quotes
haftmann
parents: 37744
diff changeset
   483
  | (Const (@{const_name Ex1}, ty) $ t, Const (@{const_name Ex1}, ty') $ t') =>
41444
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   484
      let
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   485
        val subtrm = apply_subt (regularize_trm ctxt) (t, t')
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   486
      in
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   487
        if ty = ty' then Const (@{const_name Ex1}, ty) $ subtrm
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   488
        else mk_bex1_rel $ (equiv_relation ctxt (qnt_typ ty, qnt_typ ty')) $ subtrm
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   489
      end
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   490
38624
9bb0016f7e60 changed to a more convenient argument order
Christian Urban <urbanc@in.tum.de>
parents: 38558
diff changeset
   491
  | (Const (@{const_name Ball}, ty) $ (Const (@{const_name Respects}, _) $ resrel) $ t,
38558
32ad17fe2b9c tuned quotes
haftmann
parents: 37744
diff changeset
   492
     Const (@{const_name All}, ty') $ t') =>
41444
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   493
      let
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   494
        val subtrm = apply_subt (regularize_trm ctxt) (t, t')
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   495
        val needrel = equiv_relation_chk ctxt (qnt_typ ty, qnt_typ ty')
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   496
      in
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   497
        if resrel <> needrel
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   498
        then term_mismatch "regularize (Ball)" ctxt resrel needrel
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   499
        else mk_ball $ (mk_resp $ resrel) $ subtrm
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   500
      end
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   501
38624
9bb0016f7e60 changed to a more convenient argument order
Christian Urban <urbanc@in.tum.de>
parents: 38558
diff changeset
   502
  | (Const (@{const_name Bex}, ty) $ (Const (@{const_name Respects}, _) $ resrel) $ t,
38558
32ad17fe2b9c tuned quotes
haftmann
parents: 37744
diff changeset
   503
     Const (@{const_name Ex}, ty') $ t') =>
41444
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   504
      let
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   505
        val subtrm = apply_subt (regularize_trm ctxt) (t, t')
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   506
        val needrel = equiv_relation_chk ctxt (qnt_typ ty, qnt_typ ty')
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   507
      in
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   508
        if resrel <> needrel
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   509
        then term_mismatch "regularize (Bex)" ctxt resrel needrel
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   510
        else mk_bex $ (mk_resp $ resrel) $ subtrm
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   511
      end
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   512
38624
9bb0016f7e60 changed to a more convenient argument order
Christian Urban <urbanc@in.tum.de>
parents: 38558
diff changeset
   513
  | (Const (@{const_name Bex1_rel}, ty) $ resrel $ t, Const (@{const_name Ex1}, ty') $ t') =>
41444
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   514
      let
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   515
        val subtrm = apply_subt (regularize_trm ctxt) (t, t')
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   516
        val needrel = equiv_relation_chk ctxt (qnt_typ ty, qnt_typ ty')
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   517
      in
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   518
        if resrel <> needrel
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   519
        then term_mismatch "regularize (Bex1_res)" ctxt resrel needrel
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   520
        else mk_bex1_rel $ resrel $ subtrm
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   521
      end
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   522
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   523
  | (* equalities need to be replaced by appropriate equivalence relations *)
38864
4abe644fcea5 formerly unnamed infix equality now named HOL.eq
haftmann
parents: 38795
diff changeset
   524
    (Const (@{const_name HOL.eq}, ty), Const (@{const_name HOL.eq}, ty')) =>
41444
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   525
        if ty = ty' then rtrm
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   526
        else equiv_relation ctxt (domain_type ty, domain_type ty')
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   527
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   528
  | (* in this case we just check whether the given equivalence relation is correct *)
38864
4abe644fcea5 formerly unnamed infix equality now named HOL.eq
haftmann
parents: 38795
diff changeset
   529
    (rel, Const (@{const_name HOL.eq}, ty')) =>
41444
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   530
      let
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   531
        val rel_ty = fastype_of rel
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   532
        val rel' = equiv_relation_chk ctxt (domain_type rel_ty, domain_type ty')
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   533
      in
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   534
        if rel' aconv rel then rtrm
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   535
        else term_mismatch "regularize (relation mismatch)" ctxt rel rel'
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   536
      end
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   537
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   538
  | (_, Const _) =>
41444
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   539
      let
42361
23f352990944 modernized structure Proof_Context;
wenzelm
parents: 41451
diff changeset
   540
        val thy = Proof_Context.theory_of ctxt
45280
9fd6fce8a230 localized quotient data;
wenzelm
parents: 45279
diff changeset
   541
        fun same_const (Const (s, T)) (Const (s', T')) = s = s' andalso matches_typ ctxt T T'
41444
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   542
          | same_const _ _ = false
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   543
      in
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   544
        if same_const rtrm qtrm then rtrm
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   545
        else
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   546
          let
45279
89a17197cb98 simplified/standardized signatures;
wenzelm
parents: 45274
diff changeset
   547
            val rtrm' =
45340
98ec8b51af9c prefer global Quotient_Info lookup to accomodate Quotient_Term, which is not quite localized yet (cf. 9fd6fce8a230);
wenzelm
parents: 45280
diff changeset
   548
              (case Quotient_Info.lookup_quotconsts_global thy qtrm of
45279
89a17197cb98 simplified/standardized signatures;
wenzelm
parents: 45274
diff changeset
   549
                SOME qconst_info => #rconst qconst_info
89a17197cb98 simplified/standardized signatures;
wenzelm
parents: 45274
diff changeset
   550
              | NONE => term_mismatch "regularize (constant not found)" ctxt rtrm qtrm)
41444
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   551
          in
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   552
            if Pattern.matches thy (rtrm', rtrm)
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   553
            then rtrm else term_mismatch "regularize (constant mismatch)" ctxt rtrm qtrm
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   554
          end
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   555
      end
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   556
37591
d3daea901123 merged constants "split" and "prod_case"
haftmann
parents: 37564
diff changeset
   557
  | (((t1 as Const (@{const_name prod_case}, _)) $ Abs (v1, ty, Abs(v1', ty', s1))),
d3daea901123 merged constants "split" and "prod_case"
haftmann
parents: 37564
diff changeset
   558
     ((t2 as Const (@{const_name prod_case}, _)) $ Abs (v2, _ , Abs(v2', _  , s2)))) =>
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   559
       regularize_trm ctxt (t1, t2) $ Abs (v1, ty, Abs (v1', ty', regularize_trm ctxt (s1, s2)))
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   560
37591
d3daea901123 merged constants "split" and "prod_case"
haftmann
parents: 37564
diff changeset
   561
  | (((t1 as Const (@{const_name prod_case}, _)) $ Abs (v1, ty, s1)),
d3daea901123 merged constants "split" and "prod_case"
haftmann
parents: 37564
diff changeset
   562
     ((t2 as Const (@{const_name prod_case}, _)) $ Abs (v2, _ , s2))) =>
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   563
       regularize_trm ctxt (t1, t2) $ Abs (v1, ty, regularize_trm ctxt (s1, s2))
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   564
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   565
  | (t1 $ t2, t1' $ t2') =>
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   566
       regularize_trm ctxt (t1, t1') $ regularize_trm ctxt (t2, t2')
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   567
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   568
  | (Bound i, Bound i') =>
41444
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   569
      if i = i' then rtrm
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   570
      else raise (LIFT_MATCH "regularize (bounds mismatch)")
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   571
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   572
  | _ =>
41444
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   573
      let
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   574
        val rtrm_str = Syntax.string_of_term ctxt rtrm
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   575
        val qtrm_str = Syntax.string_of_term ctxt qtrm
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   576
      in
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   577
        raise (LIFT_MATCH ("regularize failed (default: " ^ rtrm_str ^ "," ^ qtrm_str ^ ")"))
45280
9fd6fce8a230 localized quotient data;
wenzelm
parents: 45279
diff changeset
   578
      end)
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   579
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   580
fun regularize_trm_chk ctxt (rtrm, qtrm) =
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   581
  regularize_trm ctxt (rtrm, qtrm)
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   582
  |> Syntax.check_term ctxt
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   583
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   584
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   585
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   586
(*** Rep/Abs Injection ***)
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   587
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   588
(*
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   589
Injection of Rep/Abs means:
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   590
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   591
  For abstractions:
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   592
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   593
  * If the type of the abstraction needs lifting, then we add Rep/Abs
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   594
    around the abstraction; otherwise we leave it unchanged.
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   595
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   596
  For applications:
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   597
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   598
  * If the application involves a bounded quantifier, we recurse on
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   599
    the second argument. If the application is a bounded abstraction,
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   600
    we always put an Rep/Abs around it (since bounded abstractions
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   601
    are assumed to always need lifting). Otherwise we recurse on both
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   602
    arguments.
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   603
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   604
  For constants:
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   605
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   606
  * If the constant is (op =), we leave it always unchanged.
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   607
    Otherwise the type of the constant needs lifting, we put
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   608
    and Rep/Abs around it.
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   609
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   610
  For free variables:
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   611
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   612
  * We put a Rep/Abs around it if the type needs lifting.
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   613
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   614
  Vars case cannot occur.
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   615
*)
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   616
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   617
fun mk_repabs ctxt (T, T') trm =
45797
977cf00fb8d3 make ctxt the first parameter
kuncar
parents: 45796
diff changeset
   618
  absrep_fun ctxt RepF (T, T') $ (absrep_fun ctxt AbsF (T, T') $ trm)
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   619
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   620
fun inj_repabs_err ctxt msg rtrm qtrm =
41444
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   621
  let
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   622
    val rtrm_str = Syntax.string_of_term ctxt rtrm
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   623
    val qtrm_str = Syntax.string_of_term ctxt qtrm
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   624
  in
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   625
    raise LIFT_MATCH (space_implode " " [msg, quote rtrm_str, "and", quote qtrm_str])
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   626
  end
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   627
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   628
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   629
(* bound variables need to be treated properly,
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   630
   as the type of subterms needs to be calculated   *)
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   631
fun inj_repabs_trm ctxt (rtrm, qtrm) =
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   632
 case (rtrm, qtrm) of
38624
9bb0016f7e60 changed to a more convenient argument order
Christian Urban <urbanc@in.tum.de>
parents: 38558
diff changeset
   633
    (Const (@{const_name Ball}, T) $ r $ t, Const (@{const_name All}, _) $ t') =>
9bb0016f7e60 changed to a more convenient argument order
Christian Urban <urbanc@in.tum.de>
parents: 38558
diff changeset
   634
       Const (@{const_name Ball}, T) $ r $ (inj_repabs_trm ctxt (t, t'))
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   635
38624
9bb0016f7e60 changed to a more convenient argument order
Christian Urban <urbanc@in.tum.de>
parents: 38558
diff changeset
   636
  | (Const (@{const_name Bex}, T) $ r $ t, Const (@{const_name Ex}, _) $ t') =>
9bb0016f7e60 changed to a more convenient argument order
Christian Urban <urbanc@in.tum.de>
parents: 38558
diff changeset
   637
       Const (@{const_name Bex}, T) $ r $ (inj_repabs_trm ctxt (t, t'))
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   638
38624
9bb0016f7e60 changed to a more convenient argument order
Christian Urban <urbanc@in.tum.de>
parents: 38558
diff changeset
   639
  | (Const (@{const_name Babs}, T) $ r $ t, t' as (Abs _)) =>
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   640
      let
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   641
        val rty = fastype_of rtrm
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   642
        val qty = fastype_of qtrm
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   643
      in
38624
9bb0016f7e60 changed to a more convenient argument order
Christian Urban <urbanc@in.tum.de>
parents: 38558
diff changeset
   644
        mk_repabs ctxt (rty, qty) (Const (@{const_name Babs}, T) $ r $ (inj_repabs_trm ctxt (t, t')))
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   645
      end
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   646
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   647
  | (Abs (x, T, t), Abs (x', T', t')) =>
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   648
      let
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   649
        val rty = fastype_of rtrm
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   650
        val qty = fastype_of qtrm
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   651
        val (y, s) = Term.dest_abs (x, T, t)
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   652
        val (_, s') = Term.dest_abs (x', T', t')
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   653
        val yvar = Free (y, T)
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   654
        val result = Term.lambda_name (y, yvar) (inj_repabs_trm ctxt (s, s'))
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   655
      in
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   656
        if rty = qty then result
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   657
        else mk_repabs ctxt (rty, qty) result
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   658
      end
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   659
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   660
  | (t $ s, t' $ s') =>
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   661
       (inj_repabs_trm ctxt (t, t')) $ (inj_repabs_trm ctxt (s, s'))
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   662
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   663
  | (Free (_, T), Free (_, T')) =>
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   664
        if T = T' then rtrm
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   665
        else mk_repabs ctxt (T, T') rtrm
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   666
38864
4abe644fcea5 formerly unnamed infix equality now named HOL.eq
haftmann
parents: 38795
diff changeset
   667
  | (_, Const (@{const_name HOL.eq}, _)) => rtrm
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   668
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   669
  | (_, Const (_, T')) =>
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   670
      let
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   671
        val rty = fastype_of rtrm
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   672
      in
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   673
        if rty = T' then rtrm
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   674
        else mk_repabs ctxt (rty, T') rtrm
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   675
      end
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   676
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   677
  | _ => inj_repabs_err ctxt "injection (default):" rtrm qtrm
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   678
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   679
fun inj_repabs_trm_chk ctxt (rtrm, qtrm) =
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   680
  inj_repabs_trm ctxt (rtrm, qtrm)
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   681
  |> Syntax.check_term ctxt
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   682
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   683
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   684
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   685
(*** Wrapper for automatically transforming an rthm into a qthm ***)
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   686
37592
e16495cfdde0 separation of translations in derive_qtrm / derive_rtrm (similarly for types)
Christian Urban <urbanc@in.tum.de>
parents: 37591
diff changeset
   687
(* substitutions functions for r/q-types and
e16495cfdde0 separation of translations in derive_qtrm / derive_rtrm (similarly for types)
Christian Urban <urbanc@in.tum.de>
parents: 37591
diff changeset
   688
   r/q-constants, respectively
37560
1b5bbc4a14bc streamlined the generation of quotient theorems out of raw theorems
Christian Urban <urbanc@in.tum.de>
parents: 37532
diff changeset
   689
*)
37592
e16495cfdde0 separation of translations in derive_qtrm / derive_rtrm (similarly for types)
Christian Urban <urbanc@in.tum.de>
parents: 37591
diff changeset
   690
fun subst_typ ctxt ty_subst rty =
37560
1b5bbc4a14bc streamlined the generation of quotient theorems out of raw theorems
Christian Urban <urbanc@in.tum.de>
parents: 37532
diff changeset
   691
  case rty of
1b5bbc4a14bc streamlined the generation of quotient theorems out of raw theorems
Christian Urban <urbanc@in.tum.de>
parents: 37532
diff changeset
   692
    Type (s, rtys) =>
1b5bbc4a14bc streamlined the generation of quotient theorems out of raw theorems
Christian Urban <urbanc@in.tum.de>
parents: 37532
diff changeset
   693
      let
42361
23f352990944 modernized structure Proof_Context;
wenzelm
parents: 41451
diff changeset
   694
        val thy = Proof_Context.theory_of ctxt
37592
e16495cfdde0 separation of translations in derive_qtrm / derive_rtrm (similarly for types)
Christian Urban <urbanc@in.tum.de>
parents: 37591
diff changeset
   695
        val rty' = Type (s, map (subst_typ ctxt ty_subst) rtys)
37560
1b5bbc4a14bc streamlined the generation of quotient theorems out of raw theorems
Christian Urban <urbanc@in.tum.de>
parents: 37532
diff changeset
   696
1b5bbc4a14bc streamlined the generation of quotient theorems out of raw theorems
Christian Urban <urbanc@in.tum.de>
parents: 37532
diff changeset
   697
        fun matches [] = rty'
1b5bbc4a14bc streamlined the generation of quotient theorems out of raw theorems
Christian Urban <urbanc@in.tum.de>
parents: 37532
diff changeset
   698
          | matches ((rty, qty)::tail) =
45280
9fd6fce8a230 localized quotient data;
wenzelm
parents: 45279
diff changeset
   699
              (case try (Sign.typ_match thy (rty, rty')) Vartab.empty of
37560
1b5bbc4a14bc streamlined the generation of quotient theorems out of raw theorems
Christian Urban <urbanc@in.tum.de>
parents: 37532
diff changeset
   700
                NONE => matches tail
46416
5f5665a0b973 Make automatic derivation of raw/quotient types more greedy to allow descending and quot_lifted for compound quotients.
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents: 45797
diff changeset
   701
              | SOME inst => subst_typ ctxt ty_subst (Envir.subst_type inst qty))
37560
1b5bbc4a14bc streamlined the generation of quotient theorems out of raw theorems
Christian Urban <urbanc@in.tum.de>
parents: 37532
diff changeset
   702
      in
41444
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   703
        matches ty_subst
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   704
      end
37560
1b5bbc4a14bc streamlined the generation of quotient theorems out of raw theorems
Christian Urban <urbanc@in.tum.de>
parents: 37532
diff changeset
   705
  | _ => rty
1b5bbc4a14bc streamlined the generation of quotient theorems out of raw theorems
Christian Urban <urbanc@in.tum.de>
parents: 37532
diff changeset
   706
37592
e16495cfdde0 separation of translations in derive_qtrm / derive_rtrm (similarly for types)
Christian Urban <urbanc@in.tum.de>
parents: 37591
diff changeset
   707
fun subst_trm ctxt ty_subst trm_subst rtrm =
37560
1b5bbc4a14bc streamlined the generation of quotient theorems out of raw theorems
Christian Urban <urbanc@in.tum.de>
parents: 37532
diff changeset
   708
  case rtrm of
37592
e16495cfdde0 separation of translations in derive_qtrm / derive_rtrm (similarly for types)
Christian Urban <urbanc@in.tum.de>
parents: 37591
diff changeset
   709
    t1 $ t2 => (subst_trm ctxt ty_subst trm_subst t1) $ (subst_trm ctxt ty_subst trm_subst t2)
e16495cfdde0 separation of translations in derive_qtrm / derive_rtrm (similarly for types)
Christian Urban <urbanc@in.tum.de>
parents: 37591
diff changeset
   710
  | Abs (x, ty, t) => Abs (x, subst_typ ctxt ty_subst ty, subst_trm ctxt ty_subst trm_subst t)
e16495cfdde0 separation of translations in derive_qtrm / derive_rtrm (similarly for types)
Christian Urban <urbanc@in.tum.de>
parents: 37591
diff changeset
   711
  | Free(n, ty) => Free(n, subst_typ ctxt ty_subst ty)
e16495cfdde0 separation of translations in derive_qtrm / derive_rtrm (similarly for types)
Christian Urban <urbanc@in.tum.de>
parents: 37591
diff changeset
   712
  | Var(n, ty) => Var(n, subst_typ ctxt ty_subst ty)
37560
1b5bbc4a14bc streamlined the generation of quotient theorems out of raw theorems
Christian Urban <urbanc@in.tum.de>
parents: 37532
diff changeset
   713
  | Bound i => Bound i
41444
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   714
  | Const (a, ty) =>
37560
1b5bbc4a14bc streamlined the generation of quotient theorems out of raw theorems
Christian Urban <urbanc@in.tum.de>
parents: 37532
diff changeset
   715
      let
42361
23f352990944 modernized structure Proof_Context;
wenzelm
parents: 41451
diff changeset
   716
        val thy = Proof_Context.theory_of ctxt
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   717
37592
e16495cfdde0 separation of translations in derive_qtrm / derive_rtrm (similarly for types)
Christian Urban <urbanc@in.tum.de>
parents: 37591
diff changeset
   718
        fun matches [] = Const (a, subst_typ ctxt ty_subst ty)
37560
1b5bbc4a14bc streamlined the generation of quotient theorems out of raw theorems
Christian Urban <urbanc@in.tum.de>
parents: 37532
diff changeset
   719
          | matches ((rconst, qconst)::tail) =
45280
9fd6fce8a230 localized quotient data;
wenzelm
parents: 45279
diff changeset
   720
              (case try (Pattern.match thy (rconst, rtrm)) (Vartab.empty, Vartab.empty) of
37560
1b5bbc4a14bc streamlined the generation of quotient theorems out of raw theorems
Christian Urban <urbanc@in.tum.de>
parents: 37532
diff changeset
   721
                NONE => matches tail
46416
5f5665a0b973 Make automatic derivation of raw/quotient types more greedy to allow descending and quot_lifted for compound quotients.
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents: 45797
diff changeset
   722
              | SOME inst => subst_trm ctxt ty_subst trm_subst (Envir.subst_term inst qconst))
37560
1b5bbc4a14bc streamlined the generation of quotient theorems out of raw theorems
Christian Urban <urbanc@in.tum.de>
parents: 37532
diff changeset
   723
      in
1b5bbc4a14bc streamlined the generation of quotient theorems out of raw theorems
Christian Urban <urbanc@in.tum.de>
parents: 37532
diff changeset
   724
        matches trm_subst
1b5bbc4a14bc streamlined the generation of quotient theorems out of raw theorems
Christian Urban <urbanc@in.tum.de>
parents: 37532
diff changeset
   725
      end
1b5bbc4a14bc streamlined the generation of quotient theorems out of raw theorems
Christian Urban <urbanc@in.tum.de>
parents: 37532
diff changeset
   726
37592
e16495cfdde0 separation of translations in derive_qtrm / derive_rtrm (similarly for types)
Christian Urban <urbanc@in.tum.de>
parents: 37591
diff changeset
   727
(* generate type and term substitutions out of the
41444
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   728
   qtypes involved in a quotient; the direction flag
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   729
   indicates in which direction the substitutions work:
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   730
37592
e16495cfdde0 separation of translations in derive_qtrm / derive_rtrm (similarly for types)
Christian Urban <urbanc@in.tum.de>
parents: 37591
diff changeset
   731
     true:  quotient -> raw
e16495cfdde0 separation of translations in derive_qtrm / derive_rtrm (similarly for types)
Christian Urban <urbanc@in.tum.de>
parents: 37591
diff changeset
   732
     false: raw -> quotient
37560
1b5bbc4a14bc streamlined the generation of quotient theorems out of raw theorems
Christian Urban <urbanc@in.tum.de>
parents: 37532
diff changeset
   733
*)
37592
e16495cfdde0 separation of translations in derive_qtrm / derive_rtrm (similarly for types)
Christian Urban <urbanc@in.tum.de>
parents: 37591
diff changeset
   734
fun mk_ty_subst qtys direction ctxt =
41444
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   735
  let
42361
23f352990944 modernized structure Proof_Context;
wenzelm
parents: 41451
diff changeset
   736
    val thy = Proof_Context.theory_of ctxt
41444
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   737
  in
45279
89a17197cb98 simplified/standardized signatures;
wenzelm
parents: 45274
diff changeset
   738
    Quotient_Info.dest_quotients ctxt
41444
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   739
    |> map (fn x => (#rtyp x, #qtyp x))
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   740
    |> filter (fn (_, qty) => member (Sign.typ_instance thy o swap) qtys qty)
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   741
    |> map (if direction then swap else I)
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   742
  end
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   743
37592
e16495cfdde0 separation of translations in derive_qtrm / derive_rtrm (similarly for types)
Christian Urban <urbanc@in.tum.de>
parents: 37591
diff changeset
   744
fun mk_trm_subst qtys direction ctxt =
41444
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   745
  let
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   746
    val subst_typ' = subst_typ ctxt (mk_ty_subst qtys direction ctxt)
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   747
    fun proper (t1, t2) = subst_typ' (fastype_of t1) = fastype_of t2
37563
6cf28a1dfd75 Add reverse lifting flag to automated theorem derivation
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents: 37560
diff changeset
   748
41444
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   749
    val const_substs =
45279
89a17197cb98 simplified/standardized signatures;
wenzelm
parents: 45274
diff changeset
   750
      Quotient_Info.dest_quotconsts ctxt
41444
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   751
      |> map (fn x => (#rconst x, #qconst x))
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   752
      |> map (if direction then swap else I)
37560
1b5bbc4a14bc streamlined the generation of quotient theorems out of raw theorems
Christian Urban <urbanc@in.tum.de>
parents: 37532
diff changeset
   753
41444
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   754
    val rel_substs =
45279
89a17197cb98 simplified/standardized signatures;
wenzelm
parents: 45274
diff changeset
   755
      Quotient_Info.dest_quotients ctxt
41444
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   756
      |> map (fn x => (#equiv_rel x, HOLogic.eq_const (#qtyp x)))
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   757
      |> map (if direction then swap else I)
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   758
  in
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   759
    filter proper (const_substs @ rel_substs)
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   760
  end
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   761
37592
e16495cfdde0 separation of translations in derive_qtrm / derive_rtrm (similarly for types)
Christian Urban <urbanc@in.tum.de>
parents: 37591
diff changeset
   762
37560
1b5bbc4a14bc streamlined the generation of quotient theorems out of raw theorems
Christian Urban <urbanc@in.tum.de>
parents: 37532
diff changeset
   763
(* derives a qtyp and qtrm out of a rtyp and rtrm,
41444
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   764
   respectively
37560
1b5bbc4a14bc streamlined the generation of quotient theorems out of raw theorems
Christian Urban <urbanc@in.tum.de>
parents: 37532
diff changeset
   765
*)
38624
9bb0016f7e60 changed to a more convenient argument order
Christian Urban <urbanc@in.tum.de>
parents: 38558
diff changeset
   766
fun derive_qtyp ctxt qtys rty =
37592
e16495cfdde0 separation of translations in derive_qtrm / derive_rtrm (similarly for types)
Christian Urban <urbanc@in.tum.de>
parents: 37591
diff changeset
   767
  subst_typ ctxt (mk_ty_subst qtys false ctxt) rty
e16495cfdde0 separation of translations in derive_qtrm / derive_rtrm (similarly for types)
Christian Urban <urbanc@in.tum.de>
parents: 37591
diff changeset
   768
38624
9bb0016f7e60 changed to a more convenient argument order
Christian Urban <urbanc@in.tum.de>
parents: 38558
diff changeset
   769
fun derive_qtrm ctxt qtys rtrm =
37592
e16495cfdde0 separation of translations in derive_qtrm / derive_rtrm (similarly for types)
Christian Urban <urbanc@in.tum.de>
parents: 37591
diff changeset
   770
  subst_trm ctxt (mk_ty_subst qtys false ctxt) (mk_trm_subst qtys false ctxt) rtrm
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   771
37592
e16495cfdde0 separation of translations in derive_qtrm / derive_rtrm (similarly for types)
Christian Urban <urbanc@in.tum.de>
parents: 37591
diff changeset
   772
(* derives a rtyp and rtrm out of a qtyp and qtrm,
41444
7f40120cd814 more precise parentheses and indentation;
wenzelm
parents: 40236
diff changeset
   773
   respectively
37592
e16495cfdde0 separation of translations in derive_qtrm / derive_rtrm (similarly for types)
Christian Urban <urbanc@in.tum.de>
parents: 37591
diff changeset
   774
*)
38624
9bb0016f7e60 changed to a more convenient argument order
Christian Urban <urbanc@in.tum.de>
parents: 38558
diff changeset
   775
fun derive_rtyp ctxt qtys qty =
37592
e16495cfdde0 separation of translations in derive_qtrm / derive_rtrm (similarly for types)
Christian Urban <urbanc@in.tum.de>
parents: 37591
diff changeset
   776
  subst_typ ctxt (mk_ty_subst qtys true ctxt) qty
e16495cfdde0 separation of translations in derive_qtrm / derive_rtrm (similarly for types)
Christian Urban <urbanc@in.tum.de>
parents: 37591
diff changeset
   777
38624
9bb0016f7e60 changed to a more convenient argument order
Christian Urban <urbanc@in.tum.de>
parents: 38558
diff changeset
   778
fun derive_rtrm ctxt qtys qtrm =
37592
e16495cfdde0 separation of translations in derive_qtrm / derive_rtrm (similarly for types)
Christian Urban <urbanc@in.tum.de>
parents: 37591
diff changeset
   779
  subst_trm ctxt (mk_ty_subst qtys true ctxt) (mk_trm_subst qtys true ctxt) qtrm
37560
1b5bbc4a14bc streamlined the generation of quotient theorems out of raw theorems
Christian Urban <urbanc@in.tum.de>
parents: 37532
diff changeset
   780
35222
4f1fba00f66d Initial version of HOL quotient package.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   781
45279
89a17197cb98 simplified/standardized signatures;
wenzelm
parents: 45274
diff changeset
   782
end;