src/Pure/zterm.ML
author wenzelm
Wed, 14 Aug 2024 18:59:49 +0200
changeset 80708 3f2c371a3de9
parent 80608 0b8922e351a3
child 81540 58073f3d748a
permissions -rw-r--r--
tuned;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
79098
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
     1
(*  Title:      Pure/zterm.ML
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
     3
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
     4
Tight representation of types / terms / proof terms, notably for proof recording.
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
     5
*)
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
     6
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
     7
(*** global ***)
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
     8
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
     9
(* types and terms *)
79098
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
    10
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
    11
datatype ztyp =
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
    12
    ZTVar of indexname * sort      (*free: index ~1*)
79098
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
    13
  | ZFun of ztyp * ztyp
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
    14
  | ZProp
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
    15
  | ZType0 of string               (*type constant*)
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
    16
  | ZType1 of string * ztyp        (*type constructor: 1 argument*)
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
    17
  | ZType of string * ztyp list    (*type constructor: >= 2 arguments*)
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
    18
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
    19
datatype zterm =
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
    20
    ZVar of indexname * ztyp       (*free: index ~1*)
79098
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
    21
  | ZBound of int
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
    22
  | ZConst0 of string              (*monomorphic constant*)
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
    23
  | ZConst1 of string * ztyp       (*polymorphic constant: 1 type argument*)
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
    24
  | ZConst of string * ztyp list   (*polymorphic constant: >= 2 type arguments*)
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
    25
  | ZAbs of string * ztyp * zterm
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
    26
  | ZApp of zterm * zterm
80293
453eccb886f2 clarified signature;
wenzelm
parents: 80289
diff changeset
    27
  | OFCLASS of ztyp * class
79098
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
    28
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
    29
structure ZTerm =
79098
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
    30
struct
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
    31
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
    32
(* fold *)
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
    33
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
    34
fun fold_tvars f (ZTVar v) = f v
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
    35
  | fold_tvars f (ZFun (T, U)) = fold_tvars f T #> fold_tvars f U
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
    36
  | fold_tvars f (ZType1 (_, T)) = fold_tvars f T
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
    37
  | fold_tvars f (ZType (_, Ts)) = fold (fold_tvars f) Ts
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
    38
  | fold_tvars _ _ = I;
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
    39
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
    40
fun fold_aterms f (ZApp (t, u)) = fold_aterms f t #> fold_aterms f u
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
    41
  | fold_aterms f (ZAbs (_, _, t)) = fold_aterms f t
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
    42
  | fold_aterms f a = f a;
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
    43
80266
d52be75ae60b tuned signature;
wenzelm
parents: 80265
diff changeset
    44
fun fold_vars f = fold_aterms (fn ZVar v => f v | _ => I);
d52be75ae60b tuned signature;
wenzelm
parents: 80265
diff changeset
    45
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
    46
fun fold_types f (ZVar (_, T)) = f T
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
    47
  | fold_types f (ZConst1 (_, T)) = f T
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
    48
  | fold_types f (ZConst (_, As)) = fold f As
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
    49
  | fold_types f (ZAbs (_, T, b)) = f T #> fold_types f b
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
    50
  | fold_types f (ZApp (t, u)) = fold_types f t #> fold_types f u
80293
453eccb886f2 clarified signature;
wenzelm
parents: 80289
diff changeset
    51
  | fold_types f (OFCLASS (T, _)) = f T
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
    52
  | fold_types _ _ = I;
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
    53
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
    54
80598
b1822e715f87 more operations;
wenzelm
parents: 80588
diff changeset
    55
(* map *)
b1822e715f87 more operations;
wenzelm
parents: 80588
diff changeset
    56
b1822e715f87 more operations;
wenzelm
parents: 80588
diff changeset
    57
fun map_tvars_same f =
b1822e715f87 more operations;
wenzelm
parents: 80588
diff changeset
    58
  let
b1822e715f87 more operations;
wenzelm
parents: 80588
diff changeset
    59
    fun typ (ZTVar v) = f v
b1822e715f87 more operations;
wenzelm
parents: 80588
diff changeset
    60
      | typ (ZFun (T, U)) =
b1822e715f87 more operations;
wenzelm
parents: 80588
diff changeset
    61
          (ZFun (typ T, Same.commit typ U)
b1822e715f87 more operations;
wenzelm
parents: 80588
diff changeset
    62
            handle Same.SAME => ZFun (T, typ U))
b1822e715f87 more operations;
wenzelm
parents: 80588
diff changeset
    63
      | typ ZProp = raise Same.SAME
b1822e715f87 more operations;
wenzelm
parents: 80588
diff changeset
    64
      | typ (ZType0 _) = raise Same.SAME
b1822e715f87 more operations;
wenzelm
parents: 80588
diff changeset
    65
      | typ (ZType1 (a, T)) = ZType1 (a, typ T)
b1822e715f87 more operations;
wenzelm
parents: 80588
diff changeset
    66
      | typ (ZType (a, Ts)) = ZType (a, Same.map typ Ts);
b1822e715f87 more operations;
wenzelm
parents: 80588
diff changeset
    67
  in typ end;
b1822e715f87 more operations;
wenzelm
parents: 80588
diff changeset
    68
b1822e715f87 more operations;
wenzelm
parents: 80588
diff changeset
    69
fun map_aterms_same f =
b1822e715f87 more operations;
wenzelm
parents: 80588
diff changeset
    70
  let
b1822e715f87 more operations;
wenzelm
parents: 80588
diff changeset
    71
    fun term (ZAbs (x, T, t)) = ZAbs (x, T, term t)
b1822e715f87 more operations;
wenzelm
parents: 80588
diff changeset
    72
      | term (ZApp (t, u)) =
b1822e715f87 more operations;
wenzelm
parents: 80588
diff changeset
    73
          (ZApp (term t, Same.commit term u)
b1822e715f87 more operations;
wenzelm
parents: 80588
diff changeset
    74
            handle Same.SAME => ZApp (t, term u))
b1822e715f87 more operations;
wenzelm
parents: 80588
diff changeset
    75
      | term a = f a;
b1822e715f87 more operations;
wenzelm
parents: 80588
diff changeset
    76
  in term end;
b1822e715f87 more operations;
wenzelm
parents: 80588
diff changeset
    77
80603
94d3b607eab9 more operations;
wenzelm
parents: 80598
diff changeset
    78
fun map_vars_same f = map_aterms_same (fn ZVar v => f v | _ => raise Same.SAME);
94d3b607eab9 more operations;
wenzelm
parents: 80598
diff changeset
    79
80598
b1822e715f87 more operations;
wenzelm
parents: 80588
diff changeset
    80
fun map_types_same f =
b1822e715f87 more operations;
wenzelm
parents: 80588
diff changeset
    81
  let
b1822e715f87 more operations;
wenzelm
parents: 80588
diff changeset
    82
    fun term (ZVar (xi, T)) = ZVar (xi, f T)
b1822e715f87 more operations;
wenzelm
parents: 80588
diff changeset
    83
      | term (ZBound _) = raise Same.SAME
b1822e715f87 more operations;
wenzelm
parents: 80588
diff changeset
    84
      | term (ZConst0 _) = raise Same.SAME
b1822e715f87 more operations;
wenzelm
parents: 80588
diff changeset
    85
      | term (ZConst1 (c, T)) = ZConst1 (c, f T)
b1822e715f87 more operations;
wenzelm
parents: 80588
diff changeset
    86
      | term (ZConst (c, Ts)) = ZConst (c, Same.map f Ts)
b1822e715f87 more operations;
wenzelm
parents: 80588
diff changeset
    87
      | term (ZAbs (x, T, t)) =
b1822e715f87 more operations;
wenzelm
parents: 80588
diff changeset
    88
          (ZAbs (x, f T, Same.commit term t)
b1822e715f87 more operations;
wenzelm
parents: 80588
diff changeset
    89
            handle Same.SAME => ZAbs (x, T, term t))
b1822e715f87 more operations;
wenzelm
parents: 80588
diff changeset
    90
      | term (ZApp (t, u)) =
b1822e715f87 more operations;
wenzelm
parents: 80588
diff changeset
    91
          (ZApp (term t, Same.commit term u)
b1822e715f87 more operations;
wenzelm
parents: 80588
diff changeset
    92
            handle Same.SAME => ZApp (t, term u))
b1822e715f87 more operations;
wenzelm
parents: 80588
diff changeset
    93
      | term (OFCLASS (T, c)) = OFCLASS (f T, c);
b1822e715f87 more operations;
wenzelm
parents: 80588
diff changeset
    94
  in term end;
b1822e715f87 more operations;
wenzelm
parents: 80588
diff changeset
    95
b1822e715f87 more operations;
wenzelm
parents: 80588
diff changeset
    96
val map_tvars = Same.commit o map_tvars_same;
b1822e715f87 more operations;
wenzelm
parents: 80588
diff changeset
    97
val map_aterms = Same.commit o map_aterms_same;
80603
94d3b607eab9 more operations;
wenzelm
parents: 80598
diff changeset
    98
val map_vars = Same.commit o map_vars_same;
80598
b1822e715f87 more operations;
wenzelm
parents: 80588
diff changeset
    99
val map_types = Same.commit o map_types_same;
b1822e715f87 more operations;
wenzelm
parents: 80588
diff changeset
   100
b1822e715f87 more operations;
wenzelm
parents: 80588
diff changeset
   101
79264
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   102
(* type ordering *)
79098
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   103
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   104
local
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   105
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   106
fun cons_nr (ZTVar _) = 0
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   107
  | cons_nr (ZFun _) = 1
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   108
  | cons_nr ZProp = 2
79420
4c3346b4b100 clarified datatype ztyp: omit special case that rarely occurs (thanks to ZClass and ZClassp);
wenzelm
parents: 79419
diff changeset
   109
  | cons_nr (ZType0 _) = 3
4c3346b4b100 clarified datatype ztyp: omit special case that rarely occurs (thanks to ZClass and ZClassp);
wenzelm
parents: 79419
diff changeset
   110
  | cons_nr (ZType1 _) = 4
4c3346b4b100 clarified datatype ztyp: omit special case that rarely occurs (thanks to ZClass and ZClassp);
wenzelm
parents: 79419
diff changeset
   111
  | cons_nr (ZType _) = 5;
79098
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   112
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   113
val fast_indexname_ord = Term_Ord.fast_indexname_ord;
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   114
val sort_ord = Term_Ord.sort_ord;
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   115
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   116
in
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   117
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   118
fun ztyp_ord TU =
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   119
  if pointer_eq TU then EQUAL
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   120
  else
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   121
    (case TU of
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   122
      (ZTVar (a, A), ZTVar (b, B)) =>
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   123
        (case fast_indexname_ord (a, b) of EQUAL => sort_ord (A, B) | ord => ord)
79098
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   124
    | (ZFun (T, T'), ZFun (U, U')) =>
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   125
        (case ztyp_ord (T, U) of EQUAL => ztyp_ord (T', U') | ord => ord)
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   126
    | (ZProp, ZProp) => EQUAL
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   127
    | (ZType0 a, ZType0 b) => fast_string_ord (a, b)
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   128
    | (ZType1 (a, T), ZType1 (b, U)) =>
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   129
        (case fast_string_ord (a, b) of EQUAL => ztyp_ord (T, U) | ord => ord)
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   130
    | (ZType (a, Ts), ZType (b, Us)) =>
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   131
        (case fast_string_ord (a, b) of EQUAL => dict_ord ztyp_ord (Ts, Us) | ord => ord)
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   132
    | (T, U) => int_ord (cons_nr T, cons_nr U));
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   133
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   134
end;
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   135
79264
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   136
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   137
(* term ordering and alpha-conversion *)
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   138
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   139
local
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   140
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   141
fun cons_nr (ZVar _) = 0
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   142
  | cons_nr (ZBound _) = 1
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   143
  | cons_nr (ZConst0 _) = 2
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   144
  | cons_nr (ZConst1 _) = 3
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   145
  | cons_nr (ZConst _) = 4
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   146
  | cons_nr (ZAbs _) = 5
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   147
  | cons_nr (ZApp _) = 6
80293
453eccb886f2 clarified signature;
wenzelm
parents: 80289
diff changeset
   148
  | cons_nr (OFCLASS _) = 7;
79264
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   149
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   150
fun struct_ord tu =
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   151
  if pointer_eq tu then EQUAL
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   152
  else
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   153
    (case tu of
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   154
      (ZAbs (_, _, t), ZAbs (_, _, u)) => struct_ord (t, u)
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   155
    | (ZApp (t1, t2), ZApp (u1, u2)) =>
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   156
        (case struct_ord (t1, u1) of EQUAL => struct_ord (t2, u2) | ord => ord)
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   157
    | (t, u) => int_ord (cons_nr t, cons_nr u));
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   158
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   159
fun atoms_ord tu =
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   160
  if pointer_eq tu then EQUAL
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   161
  else
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   162
    (case tu of
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   163
      (ZAbs (_, _, t), ZAbs (_, _, u)) => atoms_ord (t, u)
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   164
    | (ZApp (t1, t2), ZApp (u1, u2)) =>
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   165
        (case atoms_ord (t1, u1) of EQUAL => atoms_ord (t2, u2) | ord => ord)
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   166
    | (ZConst0 a, ZConst0 b) => fast_string_ord (a, b)
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   167
    | (ZConst1 (a, _), ZConst1 (b, _)) => fast_string_ord (a, b)
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   168
    | (ZConst (a, _), ZConst (b, _)) => fast_string_ord (a, b)
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   169
    | (ZVar (xi, _), ZVar (yj, _)) => Term_Ord.fast_indexname_ord (xi, yj)
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   170
    | (ZBound i, ZBound j) => int_ord (i, j)
80293
453eccb886f2 clarified signature;
wenzelm
parents: 80289
diff changeset
   171
    | (OFCLASS (_, a), OFCLASS (_, b)) => fast_string_ord (a, b)
79264
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   172
    | _ => EQUAL);
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   173
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   174
fun types_ord tu =
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   175
  if pointer_eq tu then EQUAL
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   176
  else
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   177
    (case tu of
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   178
      (ZAbs (_, T, t), ZAbs (_, U, u)) =>
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   179
        (case ztyp_ord (T, U) of EQUAL => types_ord (t, u) | ord => ord)
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   180
    | (ZApp (t1, t2), ZApp (u1, u2)) =>
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   181
        (case types_ord (t1, u1) of EQUAL => types_ord (t2, u2) | ord => ord)
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   182
    | (ZConst1 (_, T), ZConst1 (_, U)) => ztyp_ord (T, U)
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   183
    | (ZConst (_, Ts), ZConst (_, Us)) => dict_ord ztyp_ord (Ts, Us)
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   184
    | (ZVar (_, T), ZVar (_, U)) => ztyp_ord (T, U)
80293
453eccb886f2 clarified signature;
wenzelm
parents: 80289
diff changeset
   185
    | (OFCLASS (T, _), OFCLASS (U, _)) => ztyp_ord (T, U)
79264
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   186
    | _ => EQUAL);
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   187
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   188
in
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   189
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   190
val fast_zterm_ord = struct_ord ||| atoms_ord ||| types_ord;
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   191
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   192
end;
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   193
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   194
fun aconv_zterm (tm1, tm2) =
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   195
  pointer_eq (tm1, tm2) orelse
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   196
    (case (tm1, tm2) of
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   197
      (ZApp (t1, u1), ZApp (t2, u2)) => aconv_zterm (t1, t2) andalso aconv_zterm (u1, u2)
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   198
    | (ZAbs (_, T1, t1), ZAbs (_, T2, t2)) => aconv_zterm (t1, t2) andalso T1 = T2
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   199
    | (a1, a2) => a1 = a2);
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   200
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   201
end;
79098
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   202
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   203
79264
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   204
(* tables and term items *)
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   205
79163
9ddcaca41ed2 more operations;
wenzelm
parents: 79161
diff changeset
   206
structure ZTypes = Table(type key = ztyp val ord = ZTerm.ztyp_ord);
79264
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   207
structure ZTerms = Table(type key = zterm val ord = ZTerm.fast_zterm_ord);
79163
9ddcaca41ed2 more operations;
wenzelm
parents: 79161
diff changeset
   208
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   209
structure ZTVars:
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   210
sig
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   211
  include TERM_ITEMS
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   212
  val add_tvarsT: ztyp -> set -> set
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   213
  val add_tvars: zterm -> set -> set
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   214
end =
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   215
struct
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   216
  open TVars;
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   217
  val add_tvarsT = ZTerm.fold_tvars add_set;
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   218
  val add_tvars = ZTerm.fold_types add_tvarsT;
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   219
end;
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   220
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   221
structure ZVars:
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   222
sig
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   223
  include TERM_ITEMS
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   224
  val add_vars: zterm -> set -> set
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   225
end =
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   226
struct
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   227
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   228
structure Term_Items = Term_Items
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   229
(
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   230
  type key = indexname * ztyp;
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   231
  val ord = pointer_eq_ord (prod_ord Term_Ord.fast_indexname_ord ZTerm.ztyp_ord);
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   232
);
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   233
open Term_Items;
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   234
80266
d52be75ae60b tuned signature;
wenzelm
parents: 80265
diff changeset
   235
val add_vars = ZTerm.fold_vars add_set;
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   236
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   237
end;
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   238
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   239
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   240
(* proofs *)
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   241
79126
bdb33a2d4167 clarified const_proof vs. zproof_name;
wenzelm
parents: 79124
diff changeset
   242
datatype zproof_name =
bdb33a2d4167 clarified const_proof vs. zproof_name;
wenzelm
parents: 79124
diff changeset
   243
    ZAxiom of string
bdb33a2d4167 clarified const_proof vs. zproof_name;
wenzelm
parents: 79124
diff changeset
   244
  | ZOracle of string
80289
40a6a6ac1669 tuned signature;
wenzelm
parents: 80286
diff changeset
   245
  | ZThm of {theory_name: string, thm_name: Thm_Name.P, serial: serial};
79126
bdb33a2d4167 clarified const_proof vs. zproof_name;
wenzelm
parents: 79124
diff changeset
   246
80264
71c1cf9e7413 tuned signature;
wenzelm
parents: 80262
diff changeset
   247
type zproof_const = (zproof_name * zterm) * (ztyp ZTVars.table * zterm ZVars.table);
71c1cf9e7413 tuned signature;
wenzelm
parents: 80262
diff changeset
   248
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   249
datatype zproof =
80560
960b866b1117 tuned signature;
wenzelm
parents: 80294
diff changeset
   250
    ZNop
80264
71c1cf9e7413 tuned signature;
wenzelm
parents: 80262
diff changeset
   251
  | ZConstp of zproof_const
79212
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   252
  | ZBoundp of int
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   253
  | ZAbst of string * ztyp * zproof
79212
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   254
  | ZAbsp of string * zterm * zproof
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   255
  | ZAppt of zproof * zterm
79212
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   256
  | ZAppp of zproof * zproof
79476
wenzelm
parents: 79475
diff changeset
   257
  | ZHyp of zterm
80293
453eccb886f2 clarified signature;
wenzelm
parents: 80289
diff changeset
   258
  | OFCLASSp of ztyp * class;      (*OFCLASS proof from sorts algebra*)
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   259
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   260
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   261
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   262
(*** local ***)
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   263
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   264
signature ZTERM =
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   265
sig
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   266
  datatype ztyp = datatype ztyp
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   267
  datatype zterm = datatype zterm
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   268
  datatype zproof = datatype zproof
79265
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   269
  exception ZTERM of string * ztyp list * zterm list * zproof list
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   270
  val fold_tvars: (indexname * sort -> 'a -> 'a) -> ztyp -> 'a -> 'a
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   271
  val fold_aterms: (zterm -> 'a -> 'a) -> zterm -> 'a -> 'a
80266
d52be75ae60b tuned signature;
wenzelm
parents: 80265
diff changeset
   272
  val fold_vars: (indexname * ztyp -> 'a -> 'a) -> zterm -> 'a -> 'a
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   273
  val fold_types: (ztyp -> 'a -> 'a) -> zterm -> 'a -> 'a
80598
b1822e715f87 more operations;
wenzelm
parents: 80588
diff changeset
   274
  val map_tvars: (indexname * sort -> ztyp) -> ztyp -> ztyp
b1822e715f87 more operations;
wenzelm
parents: 80588
diff changeset
   275
  val map_aterms: (zterm -> zterm) -> zterm -> zterm
80603
94d3b607eab9 more operations;
wenzelm
parents: 80598
diff changeset
   276
  val map_vars: (indexname * ztyp -> zterm) -> zterm -> zterm
80598
b1822e715f87 more operations;
wenzelm
parents: 80588
diff changeset
   277
  val map_types: (ztyp -> ztyp) -> zterm -> zterm
79264
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   278
  val ztyp_ord: ztyp ord
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   279
  val fast_zterm_ord: zterm ord
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   280
  val aconv_zterm: zterm * zterm -> bool
79212
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   281
  val ZAbsts: (string * ztyp) list -> zproof -> zproof
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   282
  val ZAbsps: zterm list -> zproof -> zproof
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   283
  val ZAppts: zproof * zterm list -> zproof
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   284
  val ZAppps: zproof * zproof list -> zproof
80605
c5c53d0b6155 more operations;
wenzelm
parents: 80603
diff changeset
   285
  val strip_sortsT: ztyp -> ztyp
c5c53d0b6155 more operations;
wenzelm
parents: 80603
diff changeset
   286
  val strip_sorts: zterm -> zterm
79200
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   287
  val incr_bv_same: int -> int -> zterm Same.operation
79283
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   288
  val incr_proof_bv_same: int -> int -> int -> int -> zproof Same.operation
79200
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   289
  val incr_bv: int -> int -> zterm -> zterm
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   290
  val incr_boundvars: int -> zterm -> zterm
79283
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   291
  val incr_proof_bv: int -> int -> int -> int -> zproof -> zproof
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   292
  val incr_proof_boundvars: int -> int -> zproof -> zproof
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   293
  val subst_term_bound_same: zterm -> int -> zterm Same.operation
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   294
  val subst_proof_bound_same: zterm -> int -> zproof Same.operation
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   295
  val subst_proof_boundp_same: zproof -> int -> int -> zproof Same.operation
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   296
  val subst_term_bound: zterm -> zterm -> zterm
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   297
  val subst_proof_bound: zterm -> zproof -> zproof
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   298
  val subst_proof_boundp: zproof -> zproof -> zproof
79388
e6a12ea61f83 more operations;
wenzelm
parents: 79361
diff changeset
   299
  val subst_type_same: (indexname * sort, ztyp) Same.function -> ztyp Same.operation
e6a12ea61f83 more operations;
wenzelm
parents: 79361
diff changeset
   300
  val subst_term_same:
e6a12ea61f83 more operations;
wenzelm
parents: 79361
diff changeset
   301
    ztyp Same.operation -> (indexname * ztyp, zterm) Same.function -> zterm Same.operation
79318
74e245625a67 more informative exception;
wenzelm
parents: 79315
diff changeset
   302
  exception BAD_INST of ((indexname * ztyp) * zterm) list
80598
b1822e715f87 more operations;
wenzelm
parents: 80588
diff changeset
   303
  val fold_proof: {hyps: bool} -> (ztyp -> 'a -> 'a) -> (zterm -> 'a -> 'a) -> zproof -> 'a -> 'a
b1822e715f87 more operations;
wenzelm
parents: 80588
diff changeset
   304
  val fold_proof_types: {hyps: bool} -> (ztyp -> 'a -> 'a) -> zproof -> 'a -> 'a
79418
3a66bcb208b8 more operations (see also 8368160d3c65);
wenzelm
parents: 79417
diff changeset
   305
  val map_proof: {hyps: bool} -> ztyp Same.operation -> zterm Same.operation -> zproof -> zproof
3a66bcb208b8 more operations (see also 8368160d3c65);
wenzelm
parents: 79417
diff changeset
   306
  val map_proof_types: {hyps: bool} -> ztyp Same.operation -> zproof -> zproof
79414
6cacfbce33ba more operations;
wenzelm
parents: 79405
diff changeset
   307
  val map_class_proof: (ztyp * class, zproof) Same.function -> zproof -> zproof
80605
c5c53d0b6155 more operations;
wenzelm
parents: 80603
diff changeset
   308
  val maxidx_type: ztyp -> int -> int
c5c53d0b6155 more operations;
wenzelm
parents: 80603
diff changeset
   309
  val maxidx_term: zterm -> int -> int
c5c53d0b6155 more operations;
wenzelm
parents: 80603
diff changeset
   310
  val maxidx_proof: zproof -> int -> int
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   311
  val ztyp_of: typ -> ztyp
80586
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
   312
  val ztyp_dummy: ztyp
80580
78106701061c tuned module structure;
wenzelm
parents: 80579
diff changeset
   313
  val typ_of_tvar: indexname * sort -> typ
78106701061c tuned module structure;
wenzelm
parents: 80579
diff changeset
   314
  val typ_of: ztyp -> typ
80608
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
   315
  val init_cache: theory -> theory option
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
   316
  val exit_cache: theory -> theory option
80581
7b6c4595d122 clarified scope of cache: per theory body;
wenzelm
parents: 80580
diff changeset
   317
  val reset_cache: theory -> theory
80583
9a40ec7a2027 more operations;
wenzelm
parents: 80582
diff changeset
   318
  val check_cache: theory -> {ztyp: int, typ: int} option
80581
7b6c4595d122 clarified scope of cache: per theory body;
wenzelm
parents: 80580
diff changeset
   319
  val ztyp_cache: theory -> typ -> ztyp
7b6c4595d122 clarified scope of cache: per theory body;
wenzelm
parents: 80580
diff changeset
   320
  val typ_cache: theory -> ztyp -> typ
79158
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   321
  val zterm_cache: theory -> {zterm: term -> zterm, ztyp: typ -> ztyp}
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   322
  val zterm_of: theory -> term -> zterm
80608
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
   323
  val zterm_dummy_pattern: ztyp -> zterm
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
   324
  val zterm_type: ztyp -> zterm
79158
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   325
  val term_of: theory -> zterm -> term
79298
77e4e69fd0e1 more operations;
wenzelm
parents: 79286
diff changeset
   326
  val beta_norm_term_same: zterm Same.operation
77e4e69fd0e1 more operations;
wenzelm
parents: 79286
diff changeset
   327
  val beta_norm_proof_same: zproof Same.operation
79302
fed9791928bf less ambitious normalization: term abstractions over terms and proofs, but not proofs over proofs (which may be large);
wenzelm
parents: 79301
diff changeset
   328
  val beta_norm_prooft_same: zproof -> zproof
79298
77e4e69fd0e1 more operations;
wenzelm
parents: 79286
diff changeset
   329
  val beta_norm_term: zterm -> zterm
77e4e69fd0e1 more operations;
wenzelm
parents: 79286
diff changeset
   330
  val beta_norm_proof: zproof -> zproof
79302
fed9791928bf less ambitious normalization: term abstractions over terms and proofs, but not proofs over proofs (which may be large);
wenzelm
parents: 79301
diff changeset
   331
  val beta_norm_prooft: zproof -> zproof
80581
7b6c4595d122 clarified scope of cache: per theory body;
wenzelm
parents: 80580
diff changeset
   332
  val norm_type: theory -> Type.tyenv -> ztyp -> ztyp
79200
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   333
  val norm_term: theory -> Envir.env -> zterm -> zterm
79270
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   334
  val norm_proof: theory -> Envir.env -> term list -> zproof -> zproof
80267
ea908185a597 more operations;
wenzelm
parents: 80266
diff changeset
   335
  val zproof_const_typargs: zproof_const -> ((indexname * sort) * ztyp) list
ea908185a597 more operations;
wenzelm
parents: 80266
diff changeset
   336
  val zproof_const_args: zproof_const -> ((indexname * ztyp) * zterm) list
79311
e4a9a861856b omit pointless future: proof terms are built sequentially;
wenzelm
parents: 79303
diff changeset
   337
  type zbox = serial * (zterm * zproof)
79279
d9a7ee1bd070 minor performance tuning: more concise union;
wenzelm
parents: 79277
diff changeset
   338
  val zbox_ord: zbox ord
d9a7ee1bd070 minor performance tuning: more concise union;
wenzelm
parents: 79277
diff changeset
   339
  type zboxes = zbox Ord_List.T
79265
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   340
  val union_zboxes: zboxes -> zboxes -> zboxes
79279
d9a7ee1bd070 minor performance tuning: more concise union;
wenzelm
parents: 79277
diff changeset
   341
  val unions_zboxes: zboxes list -> zboxes
79425
0875c87b4a4b clarified signature;
wenzelm
parents: 79422
diff changeset
   342
  val add_box_proof: {unconstrain: bool} -> theory ->
0875c87b4a4b clarified signature;
wenzelm
parents: 79422
diff changeset
   343
    term list -> term -> zproof -> zboxes -> zproof * zboxes
80289
40a6a6ac1669 tuned signature;
wenzelm
parents: 80286
diff changeset
   344
  val thm_proof: theory -> Thm_Name.P -> term list -> term -> zproof -> zbox * zproof
79126
bdb33a2d4167 clarified const_proof vs. zproof_name;
wenzelm
parents: 79124
diff changeset
   345
  val axiom_proof:  theory -> string -> term -> zproof
bdb33a2d4167 clarified const_proof vs. zproof_name;
wenzelm
parents: 79124
diff changeset
   346
  val oracle_proof:  theory -> string -> term -> zproof
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   347
  val assume_proof: theory -> term -> zproof
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   348
  val trivial_proof: theory -> term -> zproof
79414
6cacfbce33ba more operations;
wenzelm
parents: 79405
diff changeset
   349
  val implies_intr_proof': zterm -> zproof -> zproof
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   350
  val implies_intr_proof: theory -> term -> zproof -> zproof
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   351
  val forall_intr_proof: theory -> typ -> string * term -> zproof -> zproof
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   352
  val forall_elim_proof: theory -> term -> zproof -> zproof
79128
b6f5d4392388 more zproofs;
wenzelm
parents: 79126
diff changeset
   353
  val of_class_proof: typ * class -> zproof
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   354
  val reflexive_proof: theory -> typ -> term -> zproof
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   355
  val symmetric_proof: theory -> typ -> term -> term -> zproof -> zproof
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   356
  val transitive_proof: theory -> typ -> term -> term -> term -> zproof -> zproof -> zproof
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   357
  val equal_intr_proof: theory -> term -> term -> zproof -> zproof -> zproof
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   358
  val equal_elim_proof: theory -> term -> term -> zproof -> zproof -> zproof
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   359
  val abstract_rule_proof: theory -> typ -> typ -> string * term -> term -> term -> zproof -> zproof
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   360
  val combination_proof: theory -> typ -> typ -> term -> term -> term -> term ->
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   361
    zproof -> zproof -> zproof
79133
cfe995369655 more zproofs;
wenzelm
parents: 79132
diff changeset
   362
  val generalize_proof: Names.set * Names.set -> int -> zproof -> zproof
79149
810679c5ed3c more zproofs;
wenzelm
parents: 79148
diff changeset
   363
  val instantiate_proof: theory ->
810679c5ed3c more zproofs;
wenzelm
parents: 79148
diff changeset
   364
    ((indexname * sort) * typ) list * ((indexname * typ) * term) list -> zproof -> zproof
79135
db2dc7634d62 more zproofs;
wenzelm
parents: 79133
diff changeset
   365
  val varifyT_proof: ((string * sort) * (indexname * sort)) list -> zproof -> zproof
79152
4189e10f1524 more zproofs;
wenzelm
parents: 79150
diff changeset
   366
  val legacy_freezeT_proof: term -> zproof -> zproof
79155
53288743c2f0 more zproofs;
wenzelm
parents: 79154
diff changeset
   367
  val rotate_proof: theory -> term list -> term -> (string * typ) list ->
53288743c2f0 more zproofs;
wenzelm
parents: 79154
diff changeset
   368
    term list -> int -> zproof -> zproof
53288743c2f0 more zproofs;
wenzelm
parents: 79154
diff changeset
   369
  val permute_prems_proof: theory -> term list -> int -> int -> zproof -> zproof
79234
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   370
  val incr_indexes_proof: int -> zproof -> zproof
79237
f97fe7ad62a7 proper ZTerm.lift_proof (amending 4a1a25bdf81d);
wenzelm
parents: 79234
diff changeset
   371
  val lift_proof: theory -> term -> int -> term list -> zproof -> zproof
79270
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   372
  val assumption_proof: theory -> Envir.env -> term list -> term -> int -> term list ->
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   373
    zproof -> zproof
79261
2e6fcc331f10 more zproofs;
wenzelm
parents: 79259
diff changeset
   374
  val bicompose_proof: theory -> Envir.env -> int -> bool -> term list -> term list ->
79270
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   375
    term option -> term list -> int -> int -> term list -> zproof -> zproof -> zproof
79425
0875c87b4a4b clarified signature;
wenzelm
parents: 79422
diff changeset
   376
  type sorts_proof = (class * class -> zproof) * (string * class list list * class -> zproof)
0875c87b4a4b clarified signature;
wenzelm
parents: 79422
diff changeset
   377
  val of_sort_proof: Sorts.algebra -> sorts_proof -> (typ * class -> zproof) ->
79405
f4fdf5eebcac pro-forma support for ZTerm.sorts_zproof;
wenzelm
parents: 79388
diff changeset
   378
    typ * sort -> zproof list
79425
0875c87b4a4b clarified signature;
wenzelm
parents: 79422
diff changeset
   379
  val unconstrainT_proof: theory -> sorts_proof -> Logic.unconstrain_context -> zproof -> zproof
80586
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
   380
  val encode_ztyp: ztyp XML.Encode.T
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
   381
  val encode_zterm: {typed_vars: bool} -> zterm XML.Encode.T
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
   382
  val encode_zproof: {typed_vars: bool} -> zproof XML.Encode.T
80608
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
   383
  val standard_vars: Name.context -> zterm * zproof option ->
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
   384
    {typargs: (string * sort) list, args: (string * ztyp) list, prop: zterm, proof: zproof option}
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   385
end;
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   386
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   387
structure ZTerm: ZTERM =
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   388
struct
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   389
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   390
datatype ztyp = datatype ztyp;
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   391
datatype zterm = datatype zterm;
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   392
datatype zproof = datatype zproof;
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   393
79265
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   394
exception ZTERM of string * ztyp list * zterm list * zproof list;
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   395
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   396
open ZTerm;
79098
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   397
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   398
79155
53288743c2f0 more zproofs;
wenzelm
parents: 79154
diff changeset
   399
(* derived operations *)
53288743c2f0 more zproofs;
wenzelm
parents: 79154
diff changeset
   400
79234
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   401
val ZFuns = Library.foldr ZFun;
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   402
79212
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   403
val ZAbsts = fold_rev (fn (x, T) => fn prf => ZAbst (x, T, prf));
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   404
val ZAbsps = fold_rev (fn t => fn prf => ZAbsp ("H", t, prf));
79155
53288743c2f0 more zproofs;
wenzelm
parents: 79154
diff changeset
   405
79212
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   406
val ZAppts = Library.foldl ZAppt;
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   407
val ZAppps = Library.foldl ZAppp;
79155
53288743c2f0 more zproofs;
wenzelm
parents: 79154
diff changeset
   408
79234
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   409
fun combound (t, n, k) =
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   410
  if k > 0 then ZApp (combound (t, n + 1, k - 1), ZBound n) else t;
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   411
80605
c5c53d0b6155 more operations;
wenzelm
parents: 80603
diff changeset
   412
val strip_sortsT_same = map_tvars_same (fn (_, []) => raise Same.SAME | (a, _) => ZTVar (a, []));
c5c53d0b6155 more operations;
wenzelm
parents: 80603
diff changeset
   413
val strip_sorts_same = map_types_same strip_sortsT_same;
c5c53d0b6155 more operations;
wenzelm
parents: 80603
diff changeset
   414
c5c53d0b6155 more operations;
wenzelm
parents: 80603
diff changeset
   415
val strip_sortsT = Same.commit strip_sortsT_same;
c5c53d0b6155 more operations;
wenzelm
parents: 80603
diff changeset
   416
val strip_sorts = Same.commit strip_sorts_same;
c5c53d0b6155 more operations;
wenzelm
parents: 80603
diff changeset
   417
79155
53288743c2f0 more zproofs;
wenzelm
parents: 79154
diff changeset
   418
79283
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   419
(* increment bound variables *)
79200
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   420
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   421
fun incr_bv_same inc =
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   422
  if inc = 0 then fn _ => Same.same
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   423
  else
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   424
    let
79285
3c542c1087f1 tuned whitespace;
wenzelm
parents: 79283
diff changeset
   425
      fun term lev (ZBound i) =
3c542c1087f1 tuned whitespace;
wenzelm
parents: 79283
diff changeset
   426
            if i >= lev then ZBound (i + inc) else raise Same.SAME
79200
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   427
        | term lev (ZAbs (a, T, t)) = ZAbs (a, T, term (lev + 1) t)
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   428
        | term lev (ZApp (t, u)) =
79285
3c542c1087f1 tuned whitespace;
wenzelm
parents: 79283
diff changeset
   429
            (ZApp (term lev t, Same.commit (term lev) u)
3c542c1087f1 tuned whitespace;
wenzelm
parents: 79283
diff changeset
   430
              handle Same.SAME => ZApp (t, term lev u))
79200
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   431
        | term _ _ = raise Same.SAME;
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   432
    in term end;
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   433
79283
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   434
fun incr_proof_bv_same incp inct =
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   435
  if incp = 0 andalso inct = 0 then fn _ => fn _ => Same.same
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   436
  else
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   437
    let
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   438
      val term = incr_bv_same inct;
79200
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   439
79283
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   440
      fun proof plev _ (ZBoundp i) =
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   441
            if i >= plev then ZBoundp (i + incp) else raise Same.SAME
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   442
        | proof plev tlev (ZAbsp (a, t, p)) =
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   443
            (ZAbsp (a, term tlev t, Same.commit (proof (plev + 1) tlev) p)
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   444
              handle Same.SAME => ZAbsp (a, t, proof (plev + 1) tlev p))
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   445
        | proof plev tlev (ZAbst (a, T, p)) = ZAbst (a, T, proof plev (tlev + 1) p)
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   446
        | proof plev tlev (ZAppp (p, q)) =
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   447
            (ZAppp (proof plev tlev p, Same.commit (proof plev tlev) q)
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   448
              handle Same.SAME => ZAppp (p, proof plev tlev q))
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   449
        | proof plev tlev (ZAppt (p, t)) =
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   450
            (ZAppt (proof plev tlev p, Same.commit (term tlev) t)
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   451
              handle Same.SAME => ZAppt (p, term tlev t))
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   452
        | proof _ _ _ = raise Same.SAME;
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   453
    in proof end;
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   454
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   455
fun incr_bv inc lev = Same.commit (incr_bv_same inc lev);
79200
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   456
fun incr_boundvars inc = incr_bv inc 0;
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   457
79283
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   458
fun incr_proof_bv incp inct plev tlev = Same.commit (incr_proof_bv_same incp inct plev tlev);
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   459
fun incr_proof_boundvars incp inct = incr_proof_bv incp inct 0 0;
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   460
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   461
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   462
(* substitution of bound variables *)
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   463
79281
28342f38da5c clarified signature, following Term.subst_bounds_same;
wenzelm
parents: 79279
diff changeset
   464
fun subst_term_bound_same arg =
79200
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   465
  let
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   466
    fun term lev (ZBound i) =
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   467
          if i < lev then raise Same.SAME   (*var is locally bound*)
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   468
          else if i = lev then incr_boundvars lev arg
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   469
          else ZBound (i - 1)   (*loose: change it*)
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   470
      | term lev (ZAbs (a, T, t)) = ZAbs (a, T, term (lev + 1) t)
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   471
      | term lev (ZApp (t, u)) =
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   472
          (ZApp (term lev t, Same.commit (term lev) u)
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   473
            handle Same.SAME => ZApp (t, term lev u))
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   474
      | term _ _ = raise Same.SAME;
79281
28342f38da5c clarified signature, following Term.subst_bounds_same;
wenzelm
parents: 79279
diff changeset
   475
  in term end;
28342f38da5c clarified signature, following Term.subst_bounds_same;
wenzelm
parents: 79279
diff changeset
   476
79283
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   477
fun subst_proof_bound_same arg =
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   478
  let
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   479
    val term = subst_term_bound_same arg;
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   480
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   481
    fun proof lev (ZAbsp (a, t, p)) =
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   482
          (ZAbsp (a, term lev t, Same.commit (proof lev) p)
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   483
            handle Same.SAME => ZAbsp (a, t, proof lev p))
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   484
      | proof lev (ZAbst (a, T, p)) = ZAbst (a, T, proof (lev + 1) p)
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   485
      | proof lev (ZAppp (p, q)) =
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   486
          (ZAppp (proof lev p, Same.commit (proof lev) q)
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   487
            handle Same.SAME => ZAppp (p, proof lev q))
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   488
      | proof lev (ZAppt (p, t)) =
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   489
          (ZAppt (proof lev p, Same.commit (term lev) t)
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   490
            handle Same.SAME => ZAppt (p, term lev t))
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   491
      | proof _ _ = raise Same.SAME;
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   492
  in proof end;
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   493
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   494
fun subst_proof_boundp_same arg =
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   495
  let
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   496
    fun proof plev tlev (ZBoundp i) =
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   497
          if i < plev then raise Same.SAME   (*var is locally bound*)
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   498
          else if i = plev then incr_proof_boundvars plev tlev arg
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   499
          else ZBoundp (i - 1)   (*loose: change it*)
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   500
      | proof plev tlev (ZAbsp (a, t, p)) = ZAbsp (a, t, proof (plev + 1) tlev p)
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   501
      | proof plev tlev (ZAbst (a, T, p)) = ZAbst (a, T, proof plev (tlev + 1) p)
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   502
      | proof plev tlev (ZAppp (p, q)) =
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   503
          (ZAppp (proof plev tlev p, Same.commit (proof plev tlev) q)
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   504
            handle Same.SAME => ZAppp (p, proof plev tlev q))
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   505
      | proof plev tlev (ZAppt (p, t)) = ZAppt (proof plev tlev p, t)
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   506
      | proof _ _ _ = raise Same.SAME;
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   507
  in proof end;
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   508
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   509
fun subst_term_bound arg body = Same.commit (subst_term_bound_same arg 0) body;
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   510
fun subst_proof_bound arg body = Same.commit (subst_proof_bound_same arg 0) body;
2c5d4b4ea3a2 more operations, following proofterm.ML;
wenzelm
parents: 79281
diff changeset
   511
fun subst_proof_boundp arg body = Same.commit (subst_proof_boundp_same arg 0 0) body;
79200
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   512
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   513
79268
154166613b40 tuned comments;
wenzelm
parents: 79266
diff changeset
   514
(* substitution of free or schematic variables *)
79132
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   515
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   516
fun subst_type_same tvar =
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   517
  let
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   518
    fun typ (ZTVar x) = tvar x
79326
8a2921053511 tuned whitespace;
wenzelm
parents: 79325
diff changeset
   519
      | typ (ZFun (T, U)) =
8a2921053511 tuned whitespace;
wenzelm
parents: 79325
diff changeset
   520
          (ZFun (typ T, Same.commit typ U)
8a2921053511 tuned whitespace;
wenzelm
parents: 79325
diff changeset
   521
            handle Same.SAME => ZFun (T, typ U))
79132
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   522
      | typ ZProp = raise Same.SAME
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   523
      | typ (ZType0 _) = raise Same.SAME
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   524
      | typ (ZType1 (a, T)) = ZType1 (a, typ T)
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   525
      | typ (ZType (a, Ts)) = ZType (a, Same.map typ Ts);
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   526
  in typ end;
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   527
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   528
fun subst_term_same typ var =
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   529
  let
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   530
    fun term (ZVar (x, T)) =
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   531
          let val (T', same) = Same.commit_id typ T in
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   532
            (case Same.catch var (x, T') of
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   533
              NONE => if same then raise Same.SAME else ZVar (x, T')
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   534
            | SOME t' => t')
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   535
          end
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   536
      | term (ZBound _) = raise Same.SAME
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   537
      | term (ZConst0 _) = raise Same.SAME
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   538
      | term (ZConst1 (a, T)) = ZConst1 (a, typ T)
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   539
      | term (ZConst (a, Ts)) = ZConst (a, Same.map typ Ts)
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   540
      | term (ZAbs (a, T, t)) =
79326
8a2921053511 tuned whitespace;
wenzelm
parents: 79325
diff changeset
   541
          (ZAbs (a, typ T, Same.commit term t)
8a2921053511 tuned whitespace;
wenzelm
parents: 79325
diff changeset
   542
            handle Same.SAME => ZAbs (a, T, term t))
79132
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   543
      | term (ZApp (t, u)) =
79326
8a2921053511 tuned whitespace;
wenzelm
parents: 79325
diff changeset
   544
          (ZApp (term t, Same.commit term u)
8a2921053511 tuned whitespace;
wenzelm
parents: 79325
diff changeset
   545
            handle Same.SAME => ZApp (t, term u))
80293
453eccb886f2 clarified signature;
wenzelm
parents: 80289
diff changeset
   546
      | term (OFCLASS (T, c)) = OFCLASS (typ T, c);
79132
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   547
  in term end;
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   548
79270
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   549
fun instantiate_type_same instT =
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   550
  if ZTVars.is_empty instT then Same.same
80579
69cf3c308d6c clarified signature: more operations;
wenzelm
parents: 80560
diff changeset
   551
  else #apply (ZTypes.unsynchronized_cache (subst_type_same (Same.function (ZTVars.lookup instT))));
79270
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   552
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   553
fun instantiate_term_same typ inst =
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   554
  subst_term_same typ (Same.function (ZVars.lookup inst));
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   555
79268
154166613b40 tuned comments;
wenzelm
parents: 79266
diff changeset
   556
79475
9eb9882f1845 more thorough treatment of hidden type variables within zproof;
wenzelm
parents: 79474
diff changeset
   557
(* fold types/terms within proof *)
9eb9882f1845 more thorough treatment of hidden type variables within zproof;
wenzelm
parents: 79474
diff changeset
   558
9eb9882f1845 more thorough treatment of hidden type variables within zproof;
wenzelm
parents: 79474
diff changeset
   559
fun fold_proof {hyps} typ term =
9eb9882f1845 more thorough treatment of hidden type variables within zproof;
wenzelm
parents: 79474
diff changeset
   560
  let
80560
960b866b1117 tuned signature;
wenzelm
parents: 80294
diff changeset
   561
    fun proof ZNop = I
80262
d49f3a1c06a6 tuned signature;
wenzelm
parents: 79478
diff changeset
   562
      | proof (ZConstp (_, (instT, inst))) =
79475
9eb9882f1845 more thorough treatment of hidden type variables within zproof;
wenzelm
parents: 79474
diff changeset
   563
          ZTVars.fold (typ o #2) instT #> ZVars.fold (term o #2) inst
9eb9882f1845 more thorough treatment of hidden type variables within zproof;
wenzelm
parents: 79474
diff changeset
   564
      | proof (ZBoundp _) = I
9eb9882f1845 more thorough treatment of hidden type variables within zproof;
wenzelm
parents: 79474
diff changeset
   565
      | proof (ZAbst (_, T, p)) = typ T #> proof p
9eb9882f1845 more thorough treatment of hidden type variables within zproof;
wenzelm
parents: 79474
diff changeset
   566
      | proof (ZAbsp (_, t, p)) = term t #> proof p
9eb9882f1845 more thorough treatment of hidden type variables within zproof;
wenzelm
parents: 79474
diff changeset
   567
      | proof (ZAppt (p, t)) = proof p #> term t
9eb9882f1845 more thorough treatment of hidden type variables within zproof;
wenzelm
parents: 79474
diff changeset
   568
      | proof (ZAppp (p, q)) = proof p #> proof q
79476
wenzelm
parents: 79475
diff changeset
   569
      | proof (ZHyp h) = hyps ? term h
80293
453eccb886f2 clarified signature;
wenzelm
parents: 80289
diff changeset
   570
      | proof (OFCLASSp (T, _)) = hyps ? typ T;
79475
9eb9882f1845 more thorough treatment of hidden type variables within zproof;
wenzelm
parents: 79474
diff changeset
   571
  in proof end;
9eb9882f1845 more thorough treatment of hidden type variables within zproof;
wenzelm
parents: 79474
diff changeset
   572
9eb9882f1845 more thorough treatment of hidden type variables within zproof;
wenzelm
parents: 79474
diff changeset
   573
fun fold_proof_types hyps typ =
9eb9882f1845 more thorough treatment of hidden type variables within zproof;
wenzelm
parents: 79474
diff changeset
   574
  fold_proof hyps typ (fold_types typ);
9eb9882f1845 more thorough treatment of hidden type variables within zproof;
wenzelm
parents: 79474
diff changeset
   575
9eb9882f1845 more thorough treatment of hidden type variables within zproof;
wenzelm
parents: 79474
diff changeset
   576
79268
154166613b40 tuned comments;
wenzelm
parents: 79266
diff changeset
   577
(* map types/terms within proof *)
154166613b40 tuned comments;
wenzelm
parents: 79266
diff changeset
   578
79318
74e245625a67 more informative exception;
wenzelm
parents: 79315
diff changeset
   579
exception BAD_INST of ((indexname * ztyp) * zterm) list
74e245625a67 more informative exception;
wenzelm
parents: 79315
diff changeset
   580
74e245625a67 more informative exception;
wenzelm
parents: 79315
diff changeset
   581
fun make_inst inst =
79320
bbac3e8a5070 more permissive: allow collapse of term variables for equal results, e.g. relevant for metis (line 1882 of "~~/src/HOL/List.thy");
wenzelm
parents: 79318
diff changeset
   582
  ZVars.build (inst |> fold (ZVars.insert (op aconv_zterm)))
bbac3e8a5070 more permissive: allow collapse of term variables for equal results, e.g. relevant for metis (line 1882 of "~~/src/HOL/List.thy");
wenzelm
parents: 79318
diff changeset
   583
    handle ZVars.DUP _ => raise BAD_INST inst;
79318
74e245625a67 more informative exception;
wenzelm
parents: 79315
diff changeset
   584
79145
a9c55fef42b0 tuned signature;
wenzelm
parents: 79144
diff changeset
   585
fun map_insts_same typ term (instT, inst) =
a9c55fef42b0 tuned signature;
wenzelm
parents: 79144
diff changeset
   586
  let
a9c55fef42b0 tuned signature;
wenzelm
parents: 79144
diff changeset
   587
    val changed = Unsynchronized.ref false;
79146
feb94ac5df41 more accurate treatment of term variables after instantiation of type variables;
wenzelm
parents: 79145
diff changeset
   588
    fun apply f x =
feb94ac5df41 more accurate treatment of term variables after instantiation of type variables;
wenzelm
parents: 79145
diff changeset
   589
      (case Same.catch f x of
feb94ac5df41 more accurate treatment of term variables after instantiation of type variables;
wenzelm
parents: 79145
diff changeset
   590
        NONE => NONE
feb94ac5df41 more accurate treatment of term variables after instantiation of type variables;
wenzelm
parents: 79145
diff changeset
   591
      | some => (changed := true; some));
feb94ac5df41 more accurate treatment of term variables after instantiation of type variables;
wenzelm
parents: 79145
diff changeset
   592
79145
a9c55fef42b0 tuned signature;
wenzelm
parents: 79144
diff changeset
   593
    val instT' =
a9c55fef42b0 tuned signature;
wenzelm
parents: 79144
diff changeset
   594
      (instT, instT) |-> ZTVars.fold (fn (v, T) =>
79146
feb94ac5df41 more accurate treatment of term variables after instantiation of type variables;
wenzelm
parents: 79145
diff changeset
   595
        (case apply typ T of
feb94ac5df41 more accurate treatment of term variables after instantiation of type variables;
wenzelm
parents: 79145
diff changeset
   596
          NONE => I
feb94ac5df41 more accurate treatment of term variables after instantiation of type variables;
wenzelm
parents: 79145
diff changeset
   597
        | SOME T' => ZTVars.update (v, T')));
feb94ac5df41 more accurate treatment of term variables after instantiation of type variables;
wenzelm
parents: 79145
diff changeset
   598
feb94ac5df41 more accurate treatment of term variables after instantiation of type variables;
wenzelm
parents: 79145
diff changeset
   599
    val vars' =
feb94ac5df41 more accurate treatment of term variables after instantiation of type variables;
wenzelm
parents: 79145
diff changeset
   600
      (inst, ZVars.empty) |-> ZVars.fold (fn ((v, T), _) =>
feb94ac5df41 more accurate treatment of term variables after instantiation of type variables;
wenzelm
parents: 79145
diff changeset
   601
        (case apply typ T of
feb94ac5df41 more accurate treatment of term variables after instantiation of type variables;
wenzelm
parents: 79145
diff changeset
   602
          NONE => I
feb94ac5df41 more accurate treatment of term variables after instantiation of type variables;
wenzelm
parents: 79145
diff changeset
   603
        | SOME T' => ZVars.add ((v, T), (v, T'))));
feb94ac5df41 more accurate treatment of term variables after instantiation of type variables;
wenzelm
parents: 79145
diff changeset
   604
79145
a9c55fef42b0 tuned signature;
wenzelm
parents: 79144
diff changeset
   605
    val inst' =
79146
feb94ac5df41 more accurate treatment of term variables after instantiation of type variables;
wenzelm
parents: 79145
diff changeset
   606
      if ZVars.is_empty vars' then
feb94ac5df41 more accurate treatment of term variables after instantiation of type variables;
wenzelm
parents: 79145
diff changeset
   607
        (inst, inst) |-> ZVars.fold (fn (v, t) =>
feb94ac5df41 more accurate treatment of term variables after instantiation of type variables;
wenzelm
parents: 79145
diff changeset
   608
          (case apply term t of
feb94ac5df41 more accurate treatment of term variables after instantiation of type variables;
wenzelm
parents: 79145
diff changeset
   609
            NONE => I
feb94ac5df41 more accurate treatment of term variables after instantiation of type variables;
wenzelm
parents: 79145
diff changeset
   610
          | SOME t' => ZVars.update (v, t')))
feb94ac5df41 more accurate treatment of term variables after instantiation of type variables;
wenzelm
parents: 79145
diff changeset
   611
      else
79325
wenzelm
parents: 79320
diff changeset
   612
        build (inst |> ZVars.fold_rev (fn (v, t) =>
wenzelm
parents: 79320
diff changeset
   613
          cons (the_default v (ZVars.lookup vars' v), the_default t (apply term t))))
79318
74e245625a67 more informative exception;
wenzelm
parents: 79315
diff changeset
   614
        |> make_inst;
79145
a9c55fef42b0 tuned signature;
wenzelm
parents: 79144
diff changeset
   615
  in if ! changed then (instT', inst') else raise Same.SAME end;
a9c55fef42b0 tuned signature;
wenzelm
parents: 79144
diff changeset
   616
79418
3a66bcb208b8 more operations (see also 8368160d3c65);
wenzelm
parents: 79417
diff changeset
   617
fun map_proof_same {hyps} typ term =
79132
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   618
  let
80560
960b866b1117 tuned signature;
wenzelm
parents: 80294
diff changeset
   619
    fun proof ZNop = raise Same.SAME
80262
d49f3a1c06a6 tuned signature;
wenzelm
parents: 79478
diff changeset
   620
      | proof (ZConstp (a, (instT, inst))) =
d49f3a1c06a6 tuned signature;
wenzelm
parents: 79478
diff changeset
   621
          ZConstp (a, map_insts_same typ term (instT, inst))
79212
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   622
      | proof (ZBoundp _) = raise Same.SAME
79132
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   623
      | proof (ZAbst (a, T, p)) =
79326
8a2921053511 tuned whitespace;
wenzelm
parents: 79325
diff changeset
   624
          (ZAbst (a, typ T, Same.commit proof p)
8a2921053511 tuned whitespace;
wenzelm
parents: 79325
diff changeset
   625
            handle Same.SAME => ZAbst (a, T, proof p))
79212
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   626
      | proof (ZAbsp (a, t, p)) =
79326
8a2921053511 tuned whitespace;
wenzelm
parents: 79325
diff changeset
   627
          (ZAbsp (a, term t, Same.commit proof p)
8a2921053511 tuned whitespace;
wenzelm
parents: 79325
diff changeset
   628
            handle Same.SAME => ZAbsp (a, t, proof p))
79132
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   629
      | proof (ZAppt (p, t)) =
79326
8a2921053511 tuned whitespace;
wenzelm
parents: 79325
diff changeset
   630
          (ZAppt (proof p, Same.commit term t)
8a2921053511 tuned whitespace;
wenzelm
parents: 79325
diff changeset
   631
            handle Same.SAME => ZAppt (p, term t))
79212
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   632
      | proof (ZAppp (p, q)) =
79326
8a2921053511 tuned whitespace;
wenzelm
parents: 79325
diff changeset
   633
          (ZAppp (proof p, Same.commit proof q)
8a2921053511 tuned whitespace;
wenzelm
parents: 79325
diff changeset
   634
            handle Same.SAME => ZAppp (p, proof q))
79476
wenzelm
parents: 79475
diff changeset
   635
      | proof (ZHyp h) = if hyps then ZHyp (term h) else raise Same.SAME
80293
453eccb886f2 clarified signature;
wenzelm
parents: 80289
diff changeset
   636
      | proof (OFCLASSp (T, c)) = if hyps then OFCLASSp (typ T, c) else raise Same.SAME;
79132
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   637
  in proof end;
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   638
79418
3a66bcb208b8 more operations (see also 8368160d3c65);
wenzelm
parents: 79417
diff changeset
   639
fun map_proof hyps typ term = Same.commit (map_proof_same hyps typ term);
3a66bcb208b8 more operations (see also 8368160d3c65);
wenzelm
parents: 79417
diff changeset
   640
fun map_proof_types hyps typ = map_proof hyps typ (subst_term_same typ Same.same);
79144
wenzelm
parents: 79136
diff changeset
   641
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   642
79414
6cacfbce33ba more operations;
wenzelm
parents: 79405
diff changeset
   643
(* map class proofs *)
6cacfbce33ba more operations;
wenzelm
parents: 79405
diff changeset
   644
6cacfbce33ba more operations;
wenzelm
parents: 79405
diff changeset
   645
fun map_class_proof class =
6cacfbce33ba more operations;
wenzelm
parents: 79405
diff changeset
   646
  let
80293
453eccb886f2 clarified signature;
wenzelm
parents: 80289
diff changeset
   647
    fun proof (OFCLASSp C) = class C
79414
6cacfbce33ba more operations;
wenzelm
parents: 79405
diff changeset
   648
      | proof (ZAbst (a, T, p)) = ZAbst (a, T, proof p)
6cacfbce33ba more operations;
wenzelm
parents: 79405
diff changeset
   649
      | proof (ZAbsp (a, t, p)) = ZAbsp (a, t, proof p)
6cacfbce33ba more operations;
wenzelm
parents: 79405
diff changeset
   650
      | proof (ZAppt (p, t)) = ZAppt (proof p, t)
6cacfbce33ba more operations;
wenzelm
parents: 79405
diff changeset
   651
      | proof (ZAppp (p, q)) =
6cacfbce33ba more operations;
wenzelm
parents: 79405
diff changeset
   652
          (ZAppp (proof p, Same.commit proof q)
6cacfbce33ba more operations;
wenzelm
parents: 79405
diff changeset
   653
            handle Same.SAME => ZAppp (p, proof q))
6cacfbce33ba more operations;
wenzelm
parents: 79405
diff changeset
   654
      | proof _ = raise Same.SAME;
6cacfbce33ba more operations;
wenzelm
parents: 79405
diff changeset
   655
  in Same.commit proof end;
6cacfbce33ba more operations;
wenzelm
parents: 79405
diff changeset
   656
6cacfbce33ba more operations;
wenzelm
parents: 79405
diff changeset
   657
80605
c5c53d0b6155 more operations;
wenzelm
parents: 80603
diff changeset
   658
(* maximum index of variables *)
c5c53d0b6155 more operations;
wenzelm
parents: 80603
diff changeset
   659
c5c53d0b6155 more operations;
wenzelm
parents: 80603
diff changeset
   660
val maxidx_type = fold_tvars (fn ((_, i), _) => Integer.max i);
c5c53d0b6155 more operations;
wenzelm
parents: 80603
diff changeset
   661
c5c53d0b6155 more operations;
wenzelm
parents: 80603
diff changeset
   662
fun maxidx_term t =
c5c53d0b6155 more operations;
wenzelm
parents: 80603
diff changeset
   663
  fold_types maxidx_type t #>
c5c53d0b6155 more operations;
wenzelm
parents: 80603
diff changeset
   664
  fold_aterms (fn ZVar ((_, i), _) => Integer.max i | _ => I) t;
c5c53d0b6155 more operations;
wenzelm
parents: 80603
diff changeset
   665
c5c53d0b6155 more operations;
wenzelm
parents: 80603
diff changeset
   666
val maxidx_proof = fold_proof {hyps = false} maxidx_type maxidx_term;
c5c53d0b6155 more operations;
wenzelm
parents: 80603
diff changeset
   667
c5c53d0b6155 more operations;
wenzelm
parents: 80603
diff changeset
   668
80580
78106701061c tuned module structure;
wenzelm
parents: 80579
diff changeset
   669
(* convert ztyp vs. regular typ *)
79098
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   670
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   671
fun ztyp_of (TFree (a, S)) = ZTVar ((a, ~1), S)
79098
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   672
  | ztyp_of (TVar v) = ZTVar v
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   673
  | ztyp_of (Type ("fun", [T, U])) = ZFun (ztyp_of T, ztyp_of U)
79421
wenzelm
parents: 79420
diff changeset
   674
  | ztyp_of (Type ("prop", [])) = ZProp
wenzelm
parents: 79420
diff changeset
   675
  | ztyp_of (Type (c, [])) = ZType0 c
79420
4c3346b4b100 clarified datatype ztyp: omit special case that rarely occurs (thanks to ZClass and ZClassp);
wenzelm
parents: 79419
diff changeset
   676
  | ztyp_of (Type (c, [T])) = ZType1 (c, ztyp_of T)
79098
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   677
  | ztyp_of (Type (c, ts)) = ZType (c, map ztyp_of ts);
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   678
80586
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
   679
val ztyp_dummy = ztyp_of dummyT;
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
   680
80580
78106701061c tuned module structure;
wenzelm
parents: 80579
diff changeset
   681
fun typ_of_tvar ((a, ~1), S) = TFree (a, S)
78106701061c tuned module structure;
wenzelm
parents: 80579
diff changeset
   682
  | typ_of_tvar v = TVar v;
78106701061c tuned module structure;
wenzelm
parents: 80579
diff changeset
   683
78106701061c tuned module structure;
wenzelm
parents: 80579
diff changeset
   684
fun typ_of (ZTVar v) = typ_of_tvar v
78106701061c tuned module structure;
wenzelm
parents: 80579
diff changeset
   685
  | typ_of (ZFun (T, U)) = typ_of T --> typ_of U
78106701061c tuned module structure;
wenzelm
parents: 80579
diff changeset
   686
  | typ_of ZProp = propT
78106701061c tuned module structure;
wenzelm
parents: 80579
diff changeset
   687
  | typ_of (ZType0 c) = Type (c, [])
78106701061c tuned module structure;
wenzelm
parents: 80579
diff changeset
   688
  | typ_of (ZType1 (c, T)) = Type (c, [typ_of T])
78106701061c tuned module structure;
wenzelm
parents: 80579
diff changeset
   689
  | typ_of (ZType (c, Ts)) = Type (c, map typ_of Ts);
78106701061c tuned module structure;
wenzelm
parents: 80579
diff changeset
   690
80581
7b6c4595d122 clarified scope of cache: per theory body;
wenzelm
parents: 80580
diff changeset
   691
7b6c4595d122 clarified scope of cache: per theory body;
wenzelm
parents: 80580
diff changeset
   692
(* cache within theory context *)
7b6c4595d122 clarified scope of cache: per theory body;
wenzelm
parents: 80580
diff changeset
   693
7b6c4595d122 clarified scope of cache: per theory body;
wenzelm
parents: 80580
diff changeset
   694
local
7b6c4595d122 clarified scope of cache: per theory body;
wenzelm
parents: 80580
diff changeset
   695
7b6c4595d122 clarified scope of cache: per theory body;
wenzelm
parents: 80580
diff changeset
   696
structure Data = Theory_Data
7b6c4595d122 clarified scope of cache: per theory body;
wenzelm
parents: 80580
diff changeset
   697
(
7b6c4595d122 clarified scope of cache: per theory body;
wenzelm
parents: 80580
diff changeset
   698
  type T = (ztyp Typtab.cache_ops * typ ZTypes.cache_ops) option;
7b6c4595d122 clarified scope of cache: per theory body;
wenzelm
parents: 80580
diff changeset
   699
  val empty = NONE;
7b6c4595d122 clarified scope of cache: per theory body;
wenzelm
parents: 80580
diff changeset
   700
  val merge = K NONE;
7b6c4595d122 clarified scope of cache: per theory body;
wenzelm
parents: 80580
diff changeset
   701
);
7b6c4595d122 clarified scope of cache: per theory body;
wenzelm
parents: 80580
diff changeset
   702
7b6c4595d122 clarified scope of cache: per theory body;
wenzelm
parents: 80580
diff changeset
   703
fun make_ztyp_cache () = Typtab.unsynchronized_cache ztyp_of;
7b6c4595d122 clarified scope of cache: per theory body;
wenzelm
parents: 80580
diff changeset
   704
fun make_typ_cache () = ZTypes.unsynchronized_cache typ_of;
7b6c4595d122 clarified scope of cache: per theory body;
wenzelm
parents: 80580
diff changeset
   705
80608
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
   706
in
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
   707
80581
7b6c4595d122 clarified scope of cache: per theory body;
wenzelm
parents: 80580
diff changeset
   708
fun init_cache thy =
7b6c4595d122 clarified scope of cache: per theory body;
wenzelm
parents: 80580
diff changeset
   709
  if is_some (Data.get thy) then NONE
7b6c4595d122 clarified scope of cache: per theory body;
wenzelm
parents: 80580
diff changeset
   710
  else SOME (Data.put (SOME (make_ztyp_cache (), make_typ_cache ())) thy);
7b6c4595d122 clarified scope of cache: per theory body;
wenzelm
parents: 80580
diff changeset
   711
7b6c4595d122 clarified scope of cache: per theory body;
wenzelm
parents: 80580
diff changeset
   712
fun exit_cache thy =
7b6c4595d122 clarified scope of cache: per theory body;
wenzelm
parents: 80580
diff changeset
   713
  (case Data.get thy of
7b6c4595d122 clarified scope of cache: per theory body;
wenzelm
parents: 80580
diff changeset
   714
    SOME (cache1, cache2) => (#reset cache1 (); #reset cache2 (); SOME (Data.put NONE thy))
7b6c4595d122 clarified scope of cache: per theory body;
wenzelm
parents: 80580
diff changeset
   715
  | NONE => NONE);
7b6c4595d122 clarified scope of cache: per theory body;
wenzelm
parents: 80580
diff changeset
   716
7b6c4595d122 clarified scope of cache: per theory body;
wenzelm
parents: 80580
diff changeset
   717
val _ = Theory.setup (Theory.at_begin init_cache #> Theory.at_end exit_cache);
7b6c4595d122 clarified scope of cache: per theory body;
wenzelm
parents: 80580
diff changeset
   718
7b6c4595d122 clarified scope of cache: per theory body;
wenzelm
parents: 80580
diff changeset
   719
fun reset_cache thy =
7b6c4595d122 clarified scope of cache: per theory body;
wenzelm
parents: 80580
diff changeset
   720
  (case Data.get thy of
7b6c4595d122 clarified scope of cache: per theory body;
wenzelm
parents: 80580
diff changeset
   721
    SOME (cache1, cache2) => (#reset cache1 (); #reset cache2 (); thy)
7b6c4595d122 clarified scope of cache: per theory body;
wenzelm
parents: 80580
diff changeset
   722
  | NONE => thy);
7b6c4595d122 clarified scope of cache: per theory body;
wenzelm
parents: 80580
diff changeset
   723
80583
9a40ec7a2027 more operations;
wenzelm
parents: 80582
diff changeset
   724
fun check_cache thy =
9a40ec7a2027 more operations;
wenzelm
parents: 80582
diff changeset
   725
  Data.get thy
9a40ec7a2027 more operations;
wenzelm
parents: 80582
diff changeset
   726
  |> Option.map (fn (cache1, cache2) => {ztyp = #size cache1 (), typ = #size cache2 ()});
9a40ec7a2027 more operations;
wenzelm
parents: 80582
diff changeset
   727
80581
7b6c4595d122 clarified scope of cache: per theory body;
wenzelm
parents: 80580
diff changeset
   728
fun ztyp_cache thy =
7b6c4595d122 clarified scope of cache: per theory body;
wenzelm
parents: 80580
diff changeset
   729
  (case Data.get thy of
7b6c4595d122 clarified scope of cache: per theory body;
wenzelm
parents: 80580
diff changeset
   730
    SOME (cache, _) => cache
7b6c4595d122 clarified scope of cache: per theory body;
wenzelm
parents: 80580
diff changeset
   731
  | NONE => make_ztyp_cache ()) |> #apply;
7b6c4595d122 clarified scope of cache: per theory body;
wenzelm
parents: 80580
diff changeset
   732
7b6c4595d122 clarified scope of cache: per theory body;
wenzelm
parents: 80580
diff changeset
   733
fun typ_cache thy =
7b6c4595d122 clarified scope of cache: per theory body;
wenzelm
parents: 80580
diff changeset
   734
  (case Data.get thy of
7b6c4595d122 clarified scope of cache: per theory body;
wenzelm
parents: 80580
diff changeset
   735
    SOME (_, cache) => cache
7b6c4595d122 clarified scope of cache: per theory body;
wenzelm
parents: 80580
diff changeset
   736
  | NONE => make_typ_cache ()) |> #apply;
7b6c4595d122 clarified scope of cache: per theory body;
wenzelm
parents: 80580
diff changeset
   737
7b6c4595d122 clarified scope of cache: per theory body;
wenzelm
parents: 80580
diff changeset
   738
end;
80580
78106701061c tuned module structure;
wenzelm
parents: 80579
diff changeset
   739
78106701061c tuned module structure;
wenzelm
parents: 80579
diff changeset
   740
78106701061c tuned module structure;
wenzelm
parents: 80579
diff changeset
   741
(* convert zterm vs. regular term *)
79163
9ddcaca41ed2 more operations;
wenzelm
parents: 79161
diff changeset
   742
79226
0b87e04d0b68 tuned signature;
wenzelm
parents: 79214
diff changeset
   743
fun zterm_cache thy =
79158
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   744
  let
79226
0b87e04d0b68 tuned signature;
wenzelm
parents: 79214
diff changeset
   745
    val typargs = Consts.typargs (Sign.consts_of thy);
79158
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   746
80581
7b6c4595d122 clarified scope of cache: per theory body;
wenzelm
parents: 80580
diff changeset
   747
    val ztyp = ztyp_cache thy;
79158
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   748
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   749
    fun zterm (Free (x, T)) = ZVar ((x, ~1), ztyp T)
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   750
      | zterm (Var (xi, T)) = ZVar (xi, ztyp T)
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   751
      | zterm (Bound i) = ZBound i
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   752
      | zterm (Const (c, T)) =
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   753
          (case typargs (c, T) of
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   754
            [] => ZConst0 c
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   755
          | [T] => ZConst1 (c, ztyp T)
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   756
          | Ts => ZConst (c, map ztyp Ts))
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   757
      | zterm (Abs (a, T, b)) = ZAbs (a, ztyp T, zterm b)
80294
eec06d39e5fa clarified signature: prefer explicit operation;
wenzelm
parents: 80293
diff changeset
   758
      | zterm (tm as t $ u) =
eec06d39e5fa clarified signature: prefer explicit operation;
wenzelm
parents: 80293
diff changeset
   759
          (case try Logic.match_of_class tm of
eec06d39e5fa clarified signature: prefer explicit operation;
wenzelm
parents: 80293
diff changeset
   760
            SOME (T, c) => OFCLASS (ztyp T, c)
eec06d39e5fa clarified signature: prefer explicit operation;
wenzelm
parents: 80293
diff changeset
   761
          | NONE => ZApp (zterm t, zterm u));
79158
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   762
  in {ztyp = ztyp, zterm = zterm} end;
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   763
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   764
val zterm_of = #zterm o zterm_cache;
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   765
80608
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
   766
fun zterm_dummy_pattern T = ZConst1 ("Pure.dummy_pattern", T);
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
   767
fun zterm_type T = ZConst1 ("Pure.type", T);
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
   768
79226
0b87e04d0b68 tuned signature;
wenzelm
parents: 79214
diff changeset
   769
fun term_of thy =
79098
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   770
  let
79226
0b87e04d0b68 tuned signature;
wenzelm
parents: 79214
diff changeset
   771
    val instance = Consts.instance (Sign.consts_of thy);
0b87e04d0b68 tuned signature;
wenzelm
parents: 79214
diff changeset
   772
79098
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   773
    fun const (c, Ts) = Const (c, instance (c, Ts));
79226
0b87e04d0b68 tuned signature;
wenzelm
parents: 79214
diff changeset
   774
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   775
    fun term (ZVar ((x, ~1), T)) = Free (x, typ_of T)
79098
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   776
      | term (ZVar (xi, T)) = Var (xi, typ_of T)
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   777
      | term (ZBound i) = Bound i
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   778
      | term (ZConst0 c) = const (c, [])
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   779
      | term (ZConst1 (c, T)) = const (c, [typ_of T])
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   780
      | term (ZConst (c, Ts)) = const (c, map typ_of Ts)
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   781
      | term (ZAbs (a, T, b)) = Abs (a, typ_of T, term b)
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   782
      | term (ZApp (t, u)) = term t $ term u
80293
453eccb886f2 clarified signature;
wenzelm
parents: 80289
diff changeset
   783
      | term (OFCLASS (T, c)) = Logic.mk_of_class (typ_of T, c);
79098
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   784
  in term end;
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   785
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   786
79298
77e4e69fd0e1 more operations;
wenzelm
parents: 79286
diff changeset
   787
(* beta contraction *)
79200
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   788
79286
366a5ad2f2b3 more thorough beta contraction;
wenzelm
parents: 79285
diff changeset
   789
val beta_norm_term_same =
79271
b14b289caaf6 minor performance tuning: more direct beta_norm;
wenzelm
parents: 79270
diff changeset
   790
  let
79299
74a90157ee89 tuned, following Envir.norm_term;
wenzelm
parents: 79298
diff changeset
   791
    fun norm (ZAbs (a, T, t)) = ZAbs (a, T, Same.commit norm t)
74a90157ee89 tuned, following Envir.norm_term;
wenzelm
parents: 79298
diff changeset
   792
      | norm (ZApp (ZAbs (_, _, body), t)) = Same.commit norm (subst_term_bound t body)
79271
b14b289caaf6 minor performance tuning: more direct beta_norm;
wenzelm
parents: 79270
diff changeset
   793
      | norm (ZApp (f, t)) =
b14b289caaf6 minor performance tuning: more direct beta_norm;
wenzelm
parents: 79270
diff changeset
   794
          ((case norm f of
79286
366a5ad2f2b3 more thorough beta contraction;
wenzelm
parents: 79285
diff changeset
   795
             ZAbs (_, _, body) => Same.commit norm (subst_term_bound t body)
79271
b14b289caaf6 minor performance tuning: more direct beta_norm;
wenzelm
parents: 79270
diff changeset
   796
           | nf => ZApp (nf, Same.commit norm t))
b14b289caaf6 minor performance tuning: more direct beta_norm;
wenzelm
parents: 79270
diff changeset
   797
          handle Same.SAME => ZApp (f, norm t))
b14b289caaf6 minor performance tuning: more direct beta_norm;
wenzelm
parents: 79270
diff changeset
   798
      | norm _ = raise Same.SAME;
b14b289caaf6 minor performance tuning: more direct beta_norm;
wenzelm
parents: 79270
diff changeset
   799
  in norm end;
b14b289caaf6 minor performance tuning: more direct beta_norm;
wenzelm
parents: 79270
diff changeset
   800
79302
fed9791928bf less ambitious normalization: term abstractions over terms and proofs, but not proofs over proofs (which may be large);
wenzelm
parents: 79301
diff changeset
   801
val beta_norm_prooft_same =
fed9791928bf less ambitious normalization: term abstractions over terms and proofs, but not proofs over proofs (which may be large);
wenzelm
parents: 79301
diff changeset
   802
  let
fed9791928bf less ambitious normalization: term abstractions over terms and proofs, but not proofs over proofs (which may be large);
wenzelm
parents: 79301
diff changeset
   803
    val term = beta_norm_term_same;
fed9791928bf less ambitious normalization: term abstractions over terms and proofs, but not proofs over proofs (which may be large);
wenzelm
parents: 79301
diff changeset
   804
fed9791928bf less ambitious normalization: term abstractions over terms and proofs, but not proofs over proofs (which may be large);
wenzelm
parents: 79301
diff changeset
   805
    fun norm (ZAbst (a, T, p)) = ZAbst (a, T, norm p)
fed9791928bf less ambitious normalization: term abstractions over terms and proofs, but not proofs over proofs (which may be large);
wenzelm
parents: 79301
diff changeset
   806
      | norm (ZAppt (ZAbst (_, _, body), t)) = Same.commit norm (subst_proof_bound t body)
fed9791928bf less ambitious normalization: term abstractions over terms and proofs, but not proofs over proofs (which may be large);
wenzelm
parents: 79301
diff changeset
   807
      | norm (ZAppt (f, t)) =
fed9791928bf less ambitious normalization: term abstractions over terms and proofs, but not proofs over proofs (which may be large);
wenzelm
parents: 79301
diff changeset
   808
          ((case norm f of
fed9791928bf less ambitious normalization: term abstractions over terms and proofs, but not proofs over proofs (which may be large);
wenzelm
parents: 79301
diff changeset
   809
             ZAbst (_, _, body) => Same.commit norm (subst_proof_bound t body)
fed9791928bf less ambitious normalization: term abstractions over terms and proofs, but not proofs over proofs (which may be large);
wenzelm
parents: 79301
diff changeset
   810
           | nf => ZAppt (nf, Same.commit term t))
fed9791928bf less ambitious normalization: term abstractions over terms and proofs, but not proofs over proofs (which may be large);
wenzelm
parents: 79301
diff changeset
   811
          handle Same.SAME => ZAppt (f, term t))
fed9791928bf less ambitious normalization: term abstractions over terms and proofs, but not proofs over proofs (which may be large);
wenzelm
parents: 79301
diff changeset
   812
      | norm _ = raise Same.SAME;
fed9791928bf less ambitious normalization: term abstractions over terms and proofs, but not proofs over proofs (which may be large);
wenzelm
parents: 79301
diff changeset
   813
  in norm end;
fed9791928bf less ambitious normalization: term abstractions over terms and proofs, but not proofs over proofs (which may be large);
wenzelm
parents: 79301
diff changeset
   814
79286
366a5ad2f2b3 more thorough beta contraction;
wenzelm
parents: 79285
diff changeset
   815
val beta_norm_proof_same =
366a5ad2f2b3 more thorough beta contraction;
wenzelm
parents: 79285
diff changeset
   816
  let
366a5ad2f2b3 more thorough beta contraction;
wenzelm
parents: 79285
diff changeset
   817
    val term = beta_norm_term_same;
366a5ad2f2b3 more thorough beta contraction;
wenzelm
parents: 79285
diff changeset
   818
79300
236fa4b32afb more thorough beta contraction, following Envir.norm_term;
wenzelm
parents: 79299
diff changeset
   819
    fun norm (ZAbst (a, T, p)) = ZAbst (a, T, norm p)
236fa4b32afb more thorough beta contraction, following Envir.norm_term;
wenzelm
parents: 79299
diff changeset
   820
      | norm (ZAbsp (a, t, p)) =
236fa4b32afb more thorough beta contraction, following Envir.norm_term;
wenzelm
parents: 79299
diff changeset
   821
          (ZAbsp (a, term t, Same.commit norm p)
236fa4b32afb more thorough beta contraction, following Envir.norm_term;
wenzelm
parents: 79299
diff changeset
   822
            handle Same.SAME => ZAbsp (a, t, norm p))
236fa4b32afb more thorough beta contraction, following Envir.norm_term;
wenzelm
parents: 79299
diff changeset
   823
      | norm (ZAppt (ZAbst (_, _, body), t)) = Same.commit norm (subst_proof_bound t body)
79301
wenzelm
parents: 79300
diff changeset
   824
      | norm (ZAppp (ZAbsp (_, _, body), p)) = Same.commit norm (subst_proof_boundp p body)
79286
366a5ad2f2b3 more thorough beta contraction;
wenzelm
parents: 79285
diff changeset
   825
      | norm (ZAppt (f, t)) =
366a5ad2f2b3 more thorough beta contraction;
wenzelm
parents: 79285
diff changeset
   826
          ((case norm f of
366a5ad2f2b3 more thorough beta contraction;
wenzelm
parents: 79285
diff changeset
   827
             ZAbst (_, _, body) => Same.commit norm (subst_proof_bound t body)
366a5ad2f2b3 more thorough beta contraction;
wenzelm
parents: 79285
diff changeset
   828
           | nf => ZAppt (nf, Same.commit term t))
366a5ad2f2b3 more thorough beta contraction;
wenzelm
parents: 79285
diff changeset
   829
          handle Same.SAME => ZAppt (f, term t))
366a5ad2f2b3 more thorough beta contraction;
wenzelm
parents: 79285
diff changeset
   830
      | norm (ZAppp (f, p)) =
366a5ad2f2b3 more thorough beta contraction;
wenzelm
parents: 79285
diff changeset
   831
          ((case norm f of
366a5ad2f2b3 more thorough beta contraction;
wenzelm
parents: 79285
diff changeset
   832
             ZAbsp (_, _, body) => Same.commit norm (subst_proof_boundp p body)
366a5ad2f2b3 more thorough beta contraction;
wenzelm
parents: 79285
diff changeset
   833
           | nf => ZAppp (nf, Same.commit norm p))
366a5ad2f2b3 more thorough beta contraction;
wenzelm
parents: 79285
diff changeset
   834
          handle Same.SAME => ZAppp (f, norm p))
366a5ad2f2b3 more thorough beta contraction;
wenzelm
parents: 79285
diff changeset
   835
      | norm _ = raise Same.SAME;
366a5ad2f2b3 more thorough beta contraction;
wenzelm
parents: 79285
diff changeset
   836
  in norm end;
366a5ad2f2b3 more thorough beta contraction;
wenzelm
parents: 79285
diff changeset
   837
79298
77e4e69fd0e1 more operations;
wenzelm
parents: 79286
diff changeset
   838
val beta_norm_term = Same.commit beta_norm_term_same;
77e4e69fd0e1 more operations;
wenzelm
parents: 79286
diff changeset
   839
val beta_norm_proof = Same.commit beta_norm_proof_same;
79302
fed9791928bf less ambitious normalization: term abstractions over terms and proofs, but not proofs over proofs (which may be large);
wenzelm
parents: 79301
diff changeset
   840
val beta_norm_prooft = Same.commit beta_norm_prooft_same;
79298
77e4e69fd0e1 more operations;
wenzelm
parents: 79286
diff changeset
   841
77e4e69fd0e1 more operations;
wenzelm
parents: 79286
diff changeset
   842
77e4e69fd0e1 more operations;
wenzelm
parents: 79286
diff changeset
   843
(* normalization wrt. environment and beta contraction *)
77e4e69fd0e1 more operations;
wenzelm
parents: 79286
diff changeset
   844
79200
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   845
fun norm_type_same ztyp tyenv =
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   846
  if Vartab.is_empty tyenv then Same.same
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   847
  else
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   848
    let
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   849
      fun norm (ZTVar v) =
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   850
            (case Type.lookup tyenv v of
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   851
              SOME U => Same.commit norm (ztyp U)
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   852
            | NONE => raise Same.SAME)
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   853
        | norm (ZFun (T, U)) =
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   854
            (ZFun (norm T, Same.commit norm U)
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   855
              handle Same.SAME => ZFun (T, norm U))
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   856
        | norm ZProp = raise Same.SAME
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   857
        | norm (ZType0 _) = raise Same.SAME
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   858
        | norm (ZType1 (a, T)) = ZType1 (a, norm T)
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   859
        | norm (ZType (a, Ts)) = ZType (a, Same.map norm Ts);
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   860
    in norm end;
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   861
80582
1bc7eef961ff clarified scope of cache: avoid nested typ_cache;
wenzelm
parents: 80581
diff changeset
   862
fun norm_term_same {ztyp, zterm} (envir as Envir.Envir {tyenv, tenv, ...}) =
79269
2c65d3356ef9 proper scope of cache (amending 61af3e917597);
wenzelm
parents: 79268
diff changeset
   863
  let
2c65d3356ef9 proper scope of cache (amending 61af3e917597);
wenzelm
parents: 79268
diff changeset
   864
    val lookup =
2c65d3356ef9 proper scope of cache (amending 61af3e917597);
wenzelm
parents: 79268
diff changeset
   865
      if Vartab.is_empty tenv then K NONE
80582
1bc7eef961ff clarified scope of cache: avoid nested typ_cache;
wenzelm
parents: 80581
diff changeset
   866
      else
1bc7eef961ff clarified scope of cache: avoid nested typ_cache;
wenzelm
parents: 80581
diff changeset
   867
        #apply (ZVars.unsynchronized_cache
1bc7eef961ff clarified scope of cache: avoid nested typ_cache;
wenzelm
parents: 80581
diff changeset
   868
          (apsnd typ_of #> Envir.lookup envir #> Option.map zterm));
79200
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   869
79269
2c65d3356ef9 proper scope of cache (amending 61af3e917597);
wenzelm
parents: 79268
diff changeset
   870
    val normT = norm_type_same ztyp tyenv;
79200
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   871
79269
2c65d3356ef9 proper scope of cache (amending 61af3e917597);
wenzelm
parents: 79268
diff changeset
   872
    fun norm (ZVar (xi, T)) =
2c65d3356ef9 proper scope of cache (amending 61af3e917597);
wenzelm
parents: 79268
diff changeset
   873
          (case lookup (xi, T) of
2c65d3356ef9 proper scope of cache (amending 61af3e917597);
wenzelm
parents: 79268
diff changeset
   874
            SOME u => Same.commit norm u
2c65d3356ef9 proper scope of cache (amending 61af3e917597);
wenzelm
parents: 79268
diff changeset
   875
          | NONE => ZVar (xi, normT T))
2c65d3356ef9 proper scope of cache (amending 61af3e917597);
wenzelm
parents: 79268
diff changeset
   876
      | norm (ZBound _) = raise Same.SAME
2c65d3356ef9 proper scope of cache (amending 61af3e917597);
wenzelm
parents: 79268
diff changeset
   877
      | norm (ZConst0 _) = raise Same.SAME
2c65d3356ef9 proper scope of cache (amending 61af3e917597);
wenzelm
parents: 79268
diff changeset
   878
      | norm (ZConst1 (a, T)) = ZConst1 (a, normT T)
2c65d3356ef9 proper scope of cache (amending 61af3e917597);
wenzelm
parents: 79268
diff changeset
   879
      | norm (ZConst (a, Ts)) = ZConst (a, Same.map normT Ts)
2c65d3356ef9 proper scope of cache (amending 61af3e917597);
wenzelm
parents: 79268
diff changeset
   880
      | norm (ZAbs (a, T, t)) =
2c65d3356ef9 proper scope of cache (amending 61af3e917597);
wenzelm
parents: 79268
diff changeset
   881
          (ZAbs (a, normT T, Same.commit norm t)
2c65d3356ef9 proper scope of cache (amending 61af3e917597);
wenzelm
parents: 79268
diff changeset
   882
            handle Same.SAME => ZAbs (a, T, norm t))
79281
28342f38da5c clarified signature, following Term.subst_bounds_same;
wenzelm
parents: 79279
diff changeset
   883
      | norm (ZApp (ZAbs (_, _, body), t)) = Same.commit norm (subst_term_bound t body)
79269
2c65d3356ef9 proper scope of cache (amending 61af3e917597);
wenzelm
parents: 79268
diff changeset
   884
      | norm (ZApp (f, t)) =
2c65d3356ef9 proper scope of cache (amending 61af3e917597);
wenzelm
parents: 79268
diff changeset
   885
          ((case norm f of
79281
28342f38da5c clarified signature, following Term.subst_bounds_same;
wenzelm
parents: 79279
diff changeset
   886
             ZAbs (_, _, body) => Same.commit norm (subst_term_bound t body)
79269
2c65d3356ef9 proper scope of cache (amending 61af3e917597);
wenzelm
parents: 79268
diff changeset
   887
           | nf => ZApp (nf, Same.commit norm t))
2c65d3356ef9 proper scope of cache (amending 61af3e917597);
wenzelm
parents: 79268
diff changeset
   888
          handle Same.SAME => ZApp (f, norm t))
2c65d3356ef9 proper scope of cache (amending 61af3e917597);
wenzelm
parents: 79268
diff changeset
   889
      | norm _ = raise Same.SAME;
79286
366a5ad2f2b3 more thorough beta contraction;
wenzelm
parents: 79285
diff changeset
   890
  in fn t => if Envir.is_empty envir then beta_norm_term_same t else norm t end;
79200
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   891
79270
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   892
fun norm_proof_cache (cache as {ztyp, ...}) (envir as Envir.Envir {tyenv, ...}) =
79269
2c65d3356ef9 proper scope of cache (amending 61af3e917597);
wenzelm
parents: 79268
diff changeset
   893
  let
79270
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   894
    val norm_tvar = ZTVar #> Same.commit (norm_type_same ztyp tyenv);
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   895
    val norm_var = ZVar #> Same.commit (norm_term_same cache envir);
79269
2c65d3356ef9 proper scope of cache (amending 61af3e917597);
wenzelm
parents: 79268
diff changeset
   896
  in
79270
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   897
    fn visible => fn prf =>
79302
fed9791928bf less ambitious normalization: term abstractions over terms and proofs, but not proofs over proofs (which may be large);
wenzelm
parents: 79301
diff changeset
   898
      if Envir.is_empty envir orelse null visible then beta_norm_prooft prf
79270
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   899
      else
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   900
        let
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   901
          fun add_tvar v tab =
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   902
            if ZTVars.defined tab v then tab else ZTVars.update (v, norm_tvar v) tab;
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   903
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   904
          val inst_typ =
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   905
            if Vartab.is_empty tyenv then Same.same
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   906
            else
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   907
              ZTVars.build (visible |> (fold o Term.fold_types o Term.fold_atyps)
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   908
                (fn TVar v => add_tvar v | _ => I))
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   909
              |> instantiate_type_same;
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   910
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   911
          fun add_var (a, T) tab =
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   912
            let val v = (a, Same.commit inst_typ (ztyp T))
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   913
            in if ZVars.defined tab v then tab else ZVars.update (v, norm_var v) tab end;
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   914
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   915
          val inst_term =
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   916
            ZVars.build (visible |> (fold o Term.fold_aterms) (fn Var v => add_var v | _ => I))
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   917
            |> instantiate_term_same inst_typ;
79272
899f37f6d218 proper beta_norm after instantiation (amending 90c5aadcc4b2);
wenzelm
parents: 79271
diff changeset
   918
79286
366a5ad2f2b3 more thorough beta contraction;
wenzelm
parents: 79285
diff changeset
   919
          val norm_term = Same.compose beta_norm_term_same inst_term;
79418
3a66bcb208b8 more operations (see also 8368160d3c65);
wenzelm
parents: 79417
diff changeset
   920
        in beta_norm_prooft (map_proof {hyps = false} inst_typ norm_term prf) end
79269
2c65d3356ef9 proper scope of cache (amending 61af3e917597);
wenzelm
parents: 79268
diff changeset
   921
  end;
79210
5ed6f16a5f7c clarified signature: support shared cache;
wenzelm
parents: 79205
diff changeset
   922
80581
7b6c4595d122 clarified scope of cache: per theory body;
wenzelm
parents: 80580
diff changeset
   923
fun norm_type thy tyenv = Same.commit (norm_type_same (ztyp_cache thy) tyenv);
80582
1bc7eef961ff clarified scope of cache: avoid nested typ_cache;
wenzelm
parents: 80581
diff changeset
   924
fun norm_term thy envir = Same.commit (norm_term_same (zterm_cache thy) envir);
1bc7eef961ff clarified scope of cache: avoid nested typ_cache;
wenzelm
parents: 80581
diff changeset
   925
fun norm_proof thy envir = norm_proof_cache (zterm_cache thy) envir;
79200
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   926
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   927
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   928
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   929
(** proof construction **)
79113
5109e4b2a292 pro-forma support for optional zproof: no proper content yet;
wenzelm
parents: 79098
diff changeset
   930
79161
3f532c76d0ad tuned structure;
wenzelm
parents: 79160
diff changeset
   931
(* constants *)
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   932
80262
d49f3a1c06a6 tuned signature;
wenzelm
parents: 79478
diff changeset
   933
fun zproof_const (a, A) : zproof_const =
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   934
  let
79154
e47db1e15a22 minor performance tuning;
wenzelm
parents: 79153
diff changeset
   935
    val instT =
79263
bf2e724ff57e clarified signature;
wenzelm
parents: 79261
diff changeset
   936
      ZTVars.build (A |> (fold_types o fold_tvars) (fn v => fn tab =>
79154
e47db1e15a22 minor performance tuning;
wenzelm
parents: 79153
diff changeset
   937
        if ZTVars.defined tab v then tab else ZTVars.update (v, ZTVar v) tab));
e47db1e15a22 minor performance tuning;
wenzelm
parents: 79153
diff changeset
   938
    val inst =
80266
d52be75ae60b tuned signature;
wenzelm
parents: 80265
diff changeset
   939
      ZVars.build (A |> fold_vars (fn v => fn tab =>
d52be75ae60b tuned signature;
wenzelm
parents: 80265
diff changeset
   940
        if ZVars.defined tab v then tab else ZVars.update (v, ZVar v) tab));
80262
d49f3a1c06a6 tuned signature;
wenzelm
parents: 79478
diff changeset
   941
  in ((a, A), (instT, inst)) end;
79126
bdb33a2d4167 clarified const_proof vs. zproof_name;
wenzelm
parents: 79124
diff changeset
   942
80267
ea908185a597 more operations;
wenzelm
parents: 80266
diff changeset
   943
fun zproof_const_typargs (((_, A), (instT, _)): zproof_const) =
ea908185a597 more operations;
wenzelm
parents: 80266
diff changeset
   944
  ZTVars.build (A |> ZTVars.add_tvars) |> ZTVars.list_set
ea908185a597 more operations;
wenzelm
parents: 80266
diff changeset
   945
  |> map (fn v => (v, the_default (ZTVar v) (ZTVars.lookup instT v)));
ea908185a597 more operations;
wenzelm
parents: 80266
diff changeset
   946
ea908185a597 more operations;
wenzelm
parents: 80266
diff changeset
   947
fun zproof_const_args (((_, A), (_, inst)): zproof_const) =
ea908185a597 more operations;
wenzelm
parents: 80266
diff changeset
   948
  ZVars.build (A |> ZVars.add_vars) |> ZVars.list_set
ea908185a597 more operations;
wenzelm
parents: 80266
diff changeset
   949
  |> map (fn v => (v, the_default (ZVar v) (ZVars.lookup inst v)));
ea908185a597 more operations;
wenzelm
parents: 80266
diff changeset
   950
80264
71c1cf9e7413 tuned signature;
wenzelm
parents: 80262
diff changeset
   951
fun make_const_proof (f, g) ((a, insts): zproof_const) =
79263
bf2e724ff57e clarified signature;
wenzelm
parents: 79261
diff changeset
   952
  let
79417
a4eae462f224 proper support for complex types, not just type variables (amending 623789141e39);
wenzelm
parents: 79416
diff changeset
   953
    val typ = subst_type_same (Same.function (fn ((x, _), _) => try f x));
79416
623789141e39 proper instantiation for make_const_proof, notably change of types for term variables;
wenzelm
parents: 79415
diff changeset
   954
    val term = Same.function (fn ZVar ((x, _), _) => try g x | _ => NONE);
80262
d49f3a1c06a6 tuned signature;
wenzelm
parents: 79478
diff changeset
   955
  in ZConstp (a, Same.commit (map_insts_same typ term) insts) end;
79161
3f532c76d0ad tuned structure;
wenzelm
parents: 79160
diff changeset
   956
3f532c76d0ad tuned structure;
wenzelm
parents: 79160
diff changeset
   957
79265
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   958
(* closed proof boxes *)
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   959
79311
e4a9a861856b omit pointless future: proof terms are built sequentially;
wenzelm
parents: 79303
diff changeset
   960
type zbox = serial * (zterm * zproof);
79279
d9a7ee1bd070 minor performance tuning: more concise union;
wenzelm
parents: 79277
diff changeset
   961
val zbox_ord: zbox ord = fn ((i, _), (j, _)) => int_ord (j, i);
79265
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   962
79279
d9a7ee1bd070 minor performance tuning: more concise union;
wenzelm
parents: 79277
diff changeset
   963
type zboxes = zbox Ord_List.T;
d9a7ee1bd070 minor performance tuning: more concise union;
wenzelm
parents: 79277
diff changeset
   964
val union_zboxes = Ord_List.union zbox_ord;
d9a7ee1bd070 minor performance tuning: more concise union;
wenzelm
parents: 79277
diff changeset
   965
val unions_zboxes = Ord_List.unions zbox_ord;
d9a7ee1bd070 minor performance tuning: more concise union;
wenzelm
parents: 79277
diff changeset
   966
val add_zboxes = Ord_List.insert zbox_ord;
79265
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   967
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   968
local
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   969
79419
93f26d333fb5 clarified box_proof: use sort constraints within the logic;
wenzelm
parents: 79418
diff changeset
   970
fun close_prop prems prop =
93f26d333fb5 clarified box_proof: use sort constraints within the logic;
wenzelm
parents: 79418
diff changeset
   971
  fold_rev (fn A => fn B => ZApp (ZApp (ZConst0 "Pure.imp", A), B)) prems prop;
79265
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   972
79428
4cd892d1a676 omit syntactic of_class check, which is in conflict with sort constraints within the logic;
wenzelm
parents: 79427
diff changeset
   973
fun close_proof prems prf =
79265
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   974
  let
79419
93f26d333fb5 clarified box_proof: use sort constraints within the logic;
wenzelm
parents: 79418
diff changeset
   975
    val m = length prems - 1;
93f26d333fb5 clarified box_proof: use sort constraints within the logic;
wenzelm
parents: 79418
diff changeset
   976
    val bounds = ZTerms.build (prems |> fold_index (fn (i, h) => ZTerms.update (h, m - i)));
93f26d333fb5 clarified box_proof: use sort constraints within the logic;
wenzelm
parents: 79418
diff changeset
   977
    fun get_bound lev t = ZTerms.lookup bounds t |> Option.map (fn i => ZBoundp (lev + i));
79265
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   978
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   979
    fun proof lev (ZHyp t) =
79419
93f26d333fb5 clarified box_proof: use sort constraints within the logic;
wenzelm
parents: 79418
diff changeset
   980
          (case get_bound lev t of
93f26d333fb5 clarified box_proof: use sort constraints within the logic;
wenzelm
parents: 79418
diff changeset
   981
            SOME p => p
79428
4cd892d1a676 omit syntactic of_class check, which is in conflict with sort constraints within the logic;
wenzelm
parents: 79427
diff changeset
   982
          | NONE => raise ZTERM ("Loose bound in proof term", [], [t], [prf]))
80293
453eccb886f2 clarified signature;
wenzelm
parents: 80289
diff changeset
   983
      | proof lev (OFCLASSp C) =
453eccb886f2 clarified signature;
wenzelm
parents: 80289
diff changeset
   984
          (case get_bound lev (OFCLASS C) of
79419
93f26d333fb5 clarified box_proof: use sort constraints within the logic;
wenzelm
parents: 79418
diff changeset
   985
            SOME p => p
79428
4cd892d1a676 omit syntactic of_class check, which is in conflict with sort constraints within the logic;
wenzelm
parents: 79427
diff changeset
   986
          | NONE => raise Same.SAME)
79265
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   987
      | proof lev (ZAbst (x, T, p)) = ZAbst (x, T, proof lev p)
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   988
      | proof lev (ZAbsp (x, t, p)) = ZAbsp (x, t, proof (lev + 1) p)
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   989
      | proof lev (ZAppt (p, t)) = ZAppt (proof lev p, t)
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   990
      | proof lev (ZAppp (p, q)) =
79326
8a2921053511 tuned whitespace;
wenzelm
parents: 79325
diff changeset
   991
          (ZAppp (proof lev p, Same.commit (proof lev) q)
8a2921053511 tuned whitespace;
wenzelm
parents: 79325
diff changeset
   992
            handle Same.SAME => ZAppp (p, proof lev q))
79265
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   993
      | proof _ _ = raise Same.SAME;
79419
93f26d333fb5 clarified box_proof: use sort constraints within the logic;
wenzelm
parents: 79418
diff changeset
   994
  in ZAbsps prems (Same.commit (proof 0) prf) end;
79265
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   995
80286
00d68f324056 tuned signature: just one ZThm is sufficient;
wenzelm
parents: 80268
diff changeset
   996
fun box_proof {unconstrain} thy thm_name hyps concl prf =
79265
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   997
  let
79428
4cd892d1a676 omit syntactic of_class check, which is in conflict with sort constraints within the logic;
wenzelm
parents: 79427
diff changeset
   998
    val {zterm, ...} = zterm_cache thy;
79419
93f26d333fb5 clarified box_proof: use sort constraints within the logic;
wenzelm
parents: 79418
diff changeset
   999
79477
4c719b31a0c2 minor performance tuning;
wenzelm
parents: 79476
diff changeset
  1000
    val present_set_prf =
4c719b31a0c2 minor performance tuning;
wenzelm
parents: 79476
diff changeset
  1001
      ZTVars.build ((fold_proof_types {hyps = true} o fold_tvars) ZTVars.add_set prf);
79475
9eb9882f1845 more thorough treatment of hidden type variables within zproof;
wenzelm
parents: 79474
diff changeset
  1002
    val present_set =
9eb9882f1845 more thorough treatment of hidden type variables within zproof;
wenzelm
parents: 79474
diff changeset
  1003
      Types.build (Types.add_atyps concl #> fold Types.add_atyps hyps #>
79478
5c1451900bec clarified order, disregard structure of proof;
wenzelm
parents: 79477
diff changeset
  1004
        ZTVars.fold (Types.add_set o typ_of_tvar o #1) present_set_prf);
79429
637d7d896929 more zproofs, underlying Proofterm.unconstrain_thm_proof / Thm.unconstrainT;
wenzelm
parents: 79428
diff changeset
  1005
    val ucontext as {constraints, outer_constraints, ...} =
637d7d896929 more zproofs, underlying Proofterm.unconstrain_thm_proof / Thm.unconstrainT;
wenzelm
parents: 79428
diff changeset
  1006
      Logic.unconstrain_context [] present_set;
79419
93f26d333fb5 clarified box_proof: use sort constraints within the logic;
wenzelm
parents: 79418
diff changeset
  1007
93f26d333fb5 clarified box_proof: use sort constraints within the logic;
wenzelm
parents: 79418
diff changeset
  1008
    val typ_operation = #typ_operation ucontext {strip_sorts = true};
93f26d333fb5 clarified box_proof: use sort constraints within the logic;
wenzelm
parents: 79418
diff changeset
  1009
    val unconstrain_typ = Same.commit typ_operation;
93f26d333fb5 clarified box_proof: use sort constraints within the logic;
wenzelm
parents: 79418
diff changeset
  1010
    val unconstrain_ztyp =
80579
69cf3c308d6c clarified signature: more operations;
wenzelm
parents: 80560
diff changeset
  1011
      #apply (ZTypes.unsynchronized_cache
69cf3c308d6c clarified signature: more operations;
wenzelm
parents: 80560
diff changeset
  1012
        (Same.function_eq (op =) (typ_of #> unconstrain_typ #> ztyp_of)));
79419
93f26d333fb5 clarified box_proof: use sort constraints within the logic;
wenzelm
parents: 79418
diff changeset
  1013
    val unconstrain_zterm = zterm o Term.map_types typ_operation;
93f26d333fb5 clarified box_proof: use sort constraints within the logic;
wenzelm
parents: 79418
diff changeset
  1014
    val unconstrain_proof = Same.commit (map_proof_types {hyps = true} unconstrain_ztyp);
79265
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
  1015
79419
93f26d333fb5 clarified box_proof: use sort constraints within the logic;
wenzelm
parents: 79418
diff changeset
  1016
    val constrain_instT =
79429
637d7d896929 more zproofs, underlying Proofterm.unconstrain_thm_proof / Thm.unconstrainT;
wenzelm
parents: 79428
diff changeset
  1017
      if unconstrain then ZTVars.empty
637d7d896929 more zproofs, underlying Proofterm.unconstrain_thm_proof / Thm.unconstrainT;
wenzelm
parents: 79428
diff changeset
  1018
      else
637d7d896929 more zproofs, underlying Proofterm.unconstrain_thm_proof / Thm.unconstrainT;
wenzelm
parents: 79428
diff changeset
  1019
        ZTVars.build (present_set |> Types.fold (fn (T, _) =>
637d7d896929 more zproofs, underlying Proofterm.unconstrain_thm_proof / Thm.unconstrainT;
wenzelm
parents: 79428
diff changeset
  1020
          let
637d7d896929 more zproofs, underlying Proofterm.unconstrain_thm_proof / Thm.unconstrainT;
wenzelm
parents: 79428
diff changeset
  1021
            val ZTVar v = ztyp_of (unconstrain_typ T) and U = ztyp_of T;
637d7d896929 more zproofs, underlying Proofterm.unconstrain_thm_proof / Thm.unconstrainT;
wenzelm
parents: 79428
diff changeset
  1022
            val equal = (case U of ZTVar u => u = v | _ => false);
637d7d896929 more zproofs, underlying Proofterm.unconstrain_thm_proof / Thm.unconstrainT;
wenzelm
parents: 79428
diff changeset
  1023
          in not equal ? ZTVars.add (v, U) end));
79419
93f26d333fb5 clarified box_proof: use sort constraints within the logic;
wenzelm
parents: 79418
diff changeset
  1024
    val constrain_proof =
79426
b5ba5b767444 minor performance tuning;
wenzelm
parents: 79425
diff changeset
  1025
      if ZTVars.is_empty constrain_instT then I
b5ba5b767444 minor performance tuning;
wenzelm
parents: 79425
diff changeset
  1026
      else
b5ba5b767444 minor performance tuning;
wenzelm
parents: 79425
diff changeset
  1027
        map_proof_types {hyps = true}
b5ba5b767444 minor performance tuning;
wenzelm
parents: 79425
diff changeset
  1028
          (subst_type_same (Same.function (ZTVars.lookup constrain_instT)));
79419
93f26d333fb5 clarified box_proof: use sort constraints within the logic;
wenzelm
parents: 79418
diff changeset
  1029
79429
637d7d896929 more zproofs, underlying Proofterm.unconstrain_thm_proof / Thm.unconstrainT;
wenzelm
parents: 79428
diff changeset
  1030
    val hyps' = map unconstrain_zterm hyps;
637d7d896929 more zproofs, underlying Proofterm.unconstrain_thm_proof / Thm.unconstrainT;
wenzelm
parents: 79428
diff changeset
  1031
    val prems = map (zterm o #2) constraints @ hyps';
79419
93f26d333fb5 clarified box_proof: use sort constraints within the logic;
wenzelm
parents: 79418
diff changeset
  1032
    val prop' = beta_norm_term (close_prop prems (unconstrain_zterm concl));
79428
4cd892d1a676 omit syntactic of_class check, which is in conflict with sort constraints within the logic;
wenzelm
parents: 79427
diff changeset
  1033
    val prf' = beta_norm_prooft (close_proof prems (unconstrain_proof prf));
79265
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
  1034
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
  1035
    val i = serial ();
79312
8db60cadad86 clarified signature;
wenzelm
parents: 79311
diff changeset
  1036
    val zbox: zbox = (i, (prop', prf'));
79429
637d7d896929 more zproofs, underlying Proofterm.unconstrain_thm_proof / Thm.unconstrainT;
wenzelm
parents: 79428
diff changeset
  1037
80286
00d68f324056 tuned signature: just one ZThm is sufficient;
wenzelm
parents: 80268
diff changeset
  1038
    val proof_name =
00d68f324056 tuned signature: just one ZThm is sufficient;
wenzelm
parents: 80268
diff changeset
  1039
      ZThm {theory_name = Context.theory_long_name thy, thm_name = thm_name, serial = i};
00d68f324056 tuned signature: just one ZThm is sufficient;
wenzelm
parents: 80268
diff changeset
  1040
00d68f324056 tuned signature: just one ZThm is sufficient;
wenzelm
parents: 80268
diff changeset
  1041
    val const = constrain_proof (ZConstp (zproof_const (proof_name, prop')));
79429
637d7d896929 more zproofs, underlying Proofterm.unconstrain_thm_proof / Thm.unconstrainT;
wenzelm
parents: 79428
diff changeset
  1042
    val args1 =
637d7d896929 more zproofs, underlying Proofterm.unconstrain_thm_proof / Thm.unconstrainT;
wenzelm
parents: 79428
diff changeset
  1043
      outer_constraints |> map (fn (T, c) =>
80293
453eccb886f2 clarified signature;
wenzelm
parents: 80289
diff changeset
  1044
        OFCLASSp (ztyp_of (if unconstrain then unconstrain_typ T else T), c));
79429
637d7d896929 more zproofs, underlying Proofterm.unconstrain_thm_proof / Thm.unconstrainT;
wenzelm
parents: 79428
diff changeset
  1045
    val args2 = if unconstrain then map ZHyp hyps' else map (ZHyp o zterm) hyps;
637d7d896929 more zproofs, underlying Proofterm.unconstrain_thm_proof / Thm.unconstrainT;
wenzelm
parents: 79428
diff changeset
  1046
  in (zbox, ZAppps (ZAppps (const, args1), args2)) end;
79312
8db60cadad86 clarified signature;
wenzelm
parents: 79311
diff changeset
  1047
79313
3b03af5125de use strict Global_Theory.register_proofs as checkpoint for stored zproof, and thus reduce current zboxes;
wenzelm
parents: 79312
diff changeset
  1048
in
3b03af5125de use strict Global_Theory.register_proofs as checkpoint for stored zproof, and thus reduce current zboxes;
wenzelm
parents: 79312
diff changeset
  1049
80286
00d68f324056 tuned signature: just one ZThm is sufficient;
wenzelm
parents: 80268
diff changeset
  1050
val thm_proof = box_proof {unconstrain = false};
79313
3b03af5125de use strict Global_Theory.register_proofs as checkpoint for stored zproof, and thus reduce current zboxes;
wenzelm
parents: 79312
diff changeset
  1051
79429
637d7d896929 more zproofs, underlying Proofterm.unconstrain_thm_proof / Thm.unconstrainT;
wenzelm
parents: 79428
diff changeset
  1052
fun add_box_proof unconstrain thy hyps concl prf zboxes =
79422
371ee5494d15 tuned signature: canonical argument order;
wenzelm
parents: 79421
diff changeset
  1053
  let
80286
00d68f324056 tuned signature: just one ZThm is sufficient;
wenzelm
parents: 80268
diff changeset
  1054
    val (zbox, prf') = box_proof unconstrain thy Thm_Name.none hyps concl prf;
79422
371ee5494d15 tuned signature: canonical argument order;
wenzelm
parents: 79421
diff changeset
  1055
    val zboxes' = add_zboxes zbox zboxes;
371ee5494d15 tuned signature: canonical argument order;
wenzelm
parents: 79421
diff changeset
  1056
  in (prf', zboxes') end;
79265
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
  1057
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
  1058
end;
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
  1059
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
  1060
79161
3f532c76d0ad tuned structure;
wenzelm
parents: 79160
diff changeset
  1061
(* basic logic *)
3f532c76d0ad tuned structure;
wenzelm
parents: 79160
diff changeset
  1062
80265
wenzelm
parents: 80264
diff changeset
  1063
fun zproof_axiom thy name A = zproof_const (ZAxiom name, zterm_of thy A);
wenzelm
parents: 80264
diff changeset
  1064
val axiom_proof = ZConstp ooo zproof_axiom;
79161
3f532c76d0ad tuned structure;
wenzelm
parents: 79160
diff changeset
  1065
79263
bf2e724ff57e clarified signature;
wenzelm
parents: 79261
diff changeset
  1066
fun oracle_proof thy name A =
80262
d49f3a1c06a6 tuned signature;
wenzelm
parents: 79478
diff changeset
  1067
  ZConstp (zproof_const (ZOracle name, zterm_of thy A));
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
  1068
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
  1069
fun assume_proof thy A =
79158
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
  1070
  ZHyp (zterm_of thy A);
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
  1071
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
  1072
fun trivial_proof thy A =
79212
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
  1073
  ZAbsp ("H", zterm_of thy A, ZBoundp 0);
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
  1074
79414
6cacfbce33ba more operations;
wenzelm
parents: 79405
diff changeset
  1075
fun implies_intr_proof' h prf =
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
  1076
  let
79277
7c415c73ebf7 tuned, following close_proof;
wenzelm
parents: 79276
diff changeset
  1077
    fun proof lev (ZHyp t) = if aconv_zterm (h, t) then ZBoundp lev else raise Same.SAME
7c415c73ebf7 tuned, following close_proof;
wenzelm
parents: 79276
diff changeset
  1078
      | proof lev (ZAbst (x, T, p)) = ZAbst (x, T, proof lev p)
7c415c73ebf7 tuned, following close_proof;
wenzelm
parents: 79276
diff changeset
  1079
      | proof lev (ZAbsp (x, t, p)) = ZAbsp (x, t, proof (lev + 1) p)
7c415c73ebf7 tuned, following close_proof;
wenzelm
parents: 79276
diff changeset
  1080
      | proof lev (ZAppt (p, t)) = ZAppt (proof lev p, t)
7c415c73ebf7 tuned, following close_proof;
wenzelm
parents: 79276
diff changeset
  1081
      | proof lev (ZAppp (p, q)) =
79326
8a2921053511 tuned whitespace;
wenzelm
parents: 79325
diff changeset
  1082
          (ZAppp (proof lev p, Same.commit (proof lev) q)
8a2921053511 tuned whitespace;
wenzelm
parents: 79325
diff changeset
  1083
            handle Same.SAME => ZAppp (p, proof lev q))
79157
00962876301c tuned names;
wenzelm
parents: 79156
diff changeset
  1084
      | proof _ _ = raise Same.SAME;
79212
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
  1085
  in ZAbsp ("H", h, Same.commit (proof 0) prf) end;
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
  1086
79414
6cacfbce33ba more operations;
wenzelm
parents: 79405
diff changeset
  1087
fun implies_intr_proof thy = implies_intr_proof' o zterm_of thy;
6cacfbce33ba more operations;
wenzelm
parents: 79405
diff changeset
  1088
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
  1089
fun forall_intr_proof thy T (a, x) prf =
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
  1090
  let
79158
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
  1091
    val {ztyp, zterm} = zterm_cache thy;
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
  1092
    val Z = ztyp T;
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
  1093
    val z = zterm x;
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
  1094
79157
00962876301c tuned names;
wenzelm
parents: 79156
diff changeset
  1095
    fun term i b =
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
  1096
      if aconv_zterm (b, z) then ZBound i
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
  1097
      else
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
  1098
        (case b of
79157
00962876301c tuned names;
wenzelm
parents: 79156
diff changeset
  1099
          ZAbs (x, T, t) => ZAbs (x, T, term (i + 1) t)
79156
3b272da1d165 minor performance tuning;
wenzelm
parents: 79155
diff changeset
  1100
        | ZApp (t, u) =>
79326
8a2921053511 tuned whitespace;
wenzelm
parents: 79325
diff changeset
  1101
            (ZApp (term i t, Same.commit (term i) u)
8a2921053511 tuned whitespace;
wenzelm
parents: 79325
diff changeset
  1102
              handle Same.SAME => ZApp (t, term i u))
79156
3b272da1d165 minor performance tuning;
wenzelm
parents: 79155
diff changeset
  1103
        | _ => raise Same.SAME);
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
  1104
79157
00962876301c tuned names;
wenzelm
parents: 79156
diff changeset
  1105
    fun proof i (ZAbst (x, T, prf)) = ZAbst (x, T, proof (i + 1) prf)
79212
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
  1106
      | proof i (ZAbsp (x, t, prf)) =
79326
8a2921053511 tuned whitespace;
wenzelm
parents: 79325
diff changeset
  1107
          (ZAbsp (x, term i t, Same.commit (proof i) prf)
8a2921053511 tuned whitespace;
wenzelm
parents: 79325
diff changeset
  1108
            handle Same.SAME => ZAbsp (x, t, proof i prf))
79157
00962876301c tuned names;
wenzelm
parents: 79156
diff changeset
  1109
      | proof i (ZAppt (p, t)) =
79326
8a2921053511 tuned whitespace;
wenzelm
parents: 79325
diff changeset
  1110
          (ZAppt (proof i p, Same.commit (term i) t)
8a2921053511 tuned whitespace;
wenzelm
parents: 79325
diff changeset
  1111
            handle Same.SAME => ZAppt (p, term i t))
79212
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
  1112
      | proof i (ZAppp (p, q)) =
79326
8a2921053511 tuned whitespace;
wenzelm
parents: 79325
diff changeset
  1113
          (ZAppp (proof i p, Same.commit (proof i) q)
8a2921053511 tuned whitespace;
wenzelm
parents: 79325
diff changeset
  1114
            handle Same.SAME => ZAppp (p, proof i q))
79157
00962876301c tuned names;
wenzelm
parents: 79156
diff changeset
  1115
      | proof _ _ = raise Same.SAME;
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
  1116
79157
00962876301c tuned names;
wenzelm
parents: 79156
diff changeset
  1117
  in ZAbst (a, Z, Same.commit (proof 0) prf) end;
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
  1118
79158
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
  1119
fun forall_elim_proof thy t p = ZAppt (p, zterm_of thy t);
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
  1120
80293
453eccb886f2 clarified signature;
wenzelm
parents: 80289
diff changeset
  1121
fun of_class_proof (T, c) = OFCLASSp (ztyp_of T, c);
79128
b6f5d4392388 more zproofs;
wenzelm
parents: 79126
diff changeset
  1122
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
  1123
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
  1124
(* equality *)
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
  1125
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
  1126
local
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
  1127
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
  1128
val thy0 =
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
  1129
  Context.the_global_context ()
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
  1130
  |> Sign.add_types_global [(Binding.name "fun", 2, NoSyn), (Binding.name "prop", 0, NoSyn)]
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
  1131
  |> Sign.local_path
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
  1132
  |> Sign.add_consts
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
  1133
   [(Binding.name "all", (Term.aT [] --> propT) --> propT, NoSyn),
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
  1134
    (Binding.name "imp", propT --> propT --> propT, NoSyn),
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
  1135
    (Binding.name "eq", Term.aT [] --> Term.aT [] --> propT, NoSyn)];
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
  1136
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
  1137
val [reflexive_axiom, symmetric_axiom, transitive_axiom, equal_intr_axiom, equal_elim_axiom,
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
  1138
  abstract_rule_axiom, combination_axiom] =
80265
wenzelm
parents: 80264
diff changeset
  1139
    Theory.equality_axioms |> map (fn (b, t) => zproof_axiom thy0 (Sign.full_name thy0 b) t);
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
  1140
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
  1141
in
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
  1142
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
  1143
val is_reflexive_proof =
80262
d49f3a1c06a6 tuned signature;
wenzelm
parents: 79478
diff changeset
  1144
  fn ZConstp ((ZAxiom "Pure.reflexive", _), _) => true | _ => false;
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
  1145
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
  1146
fun reflexive_proof thy T t =
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
  1147
  let
79158
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
  1148
    val {ztyp, zterm} = zterm_cache thy;
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
  1149
    val A = ztyp T;
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
  1150
    val x = zterm t;
79263
bf2e724ff57e clarified signature;
wenzelm
parents: 79261
diff changeset
  1151
  in make_const_proof (fn "'a" => A, fn "x" => x) reflexive_axiom end;
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
  1152
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
  1153
fun symmetric_proof thy T t u prf =
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
  1154
  if is_reflexive_proof prf then prf
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
  1155
  else
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
  1156
    let
79158
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
  1157
      val {ztyp, zterm} = zterm_cache thy;
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
  1158
      val A = ztyp T;
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
  1159
      val x = zterm t;
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
  1160
      val y = zterm u;
79263
bf2e724ff57e clarified signature;
wenzelm
parents: 79261
diff changeset
  1161
      val ax = make_const_proof (fn "'a" => A, fn "x" => x | "y" => y) symmetric_axiom;
79212
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
  1162
    in ZAppp (ax, prf) end;
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
  1163
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
  1164
fun transitive_proof thy T t u v prf1 prf2 =
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
  1165
  if is_reflexive_proof prf1 then prf2
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
  1166
  else if is_reflexive_proof prf2 then prf1
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
  1167
  else
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
  1168
    let
79158
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
  1169
      val {ztyp, zterm} = zterm_cache thy;
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
  1170
      val A = ztyp T;
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
  1171
      val x = zterm t;
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
  1172
      val y = zterm u;
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
  1173
      val z = zterm v;
79263
bf2e724ff57e clarified signature;
wenzelm
parents: 79261
diff changeset
  1174
      val ax = make_const_proof (fn "'a" => A, fn "x" => x | "y" => y | "z" => z) transitive_axiom;
79212
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
  1175
    in ZAppp (ZAppp (ax, prf1), prf2) end;
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
  1176
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
  1177
fun equal_intr_proof thy t u prf1 prf2 =
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
  1178
  let
79160
wenzelm
parents: 79158
diff changeset
  1179
    val {zterm, ...} = zterm_cache thy;
79158
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
  1180
    val A = zterm t;
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
  1181
    val B = zterm u;
79263
bf2e724ff57e clarified signature;
wenzelm
parents: 79261
diff changeset
  1182
    val ax = make_const_proof (undefined, fn "A" => A | "B" => B) equal_intr_axiom;
79212
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
  1183
  in ZAppp (ZAppp (ax, prf1), prf2) end;
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
  1184
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
  1185
fun equal_elim_proof thy t u prf1 prf2 =
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
  1186
  let
79160
wenzelm
parents: 79158
diff changeset
  1187
    val {zterm, ...} = zterm_cache thy;
79158
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
  1188
    val A = zterm t;
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
  1189
    val B = zterm u;
79263
bf2e724ff57e clarified signature;
wenzelm
parents: 79261
diff changeset
  1190
    val ax = make_const_proof (undefined, fn "A" => A | "B" => B) equal_elim_axiom;
79212
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
  1191
  in ZAppp (ZAppp (ax, prf1), prf2) end;
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
  1192
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
  1193
fun abstract_rule_proof thy T U x t u prf =
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
  1194
  let
79158
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
  1195
    val {ztyp, zterm} = zterm_cache thy;
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
  1196
    val A = ztyp T;
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
  1197
    val B = ztyp U;
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
  1198
    val f = zterm t;
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
  1199
    val g = zterm u;
79126
bdb33a2d4167 clarified const_proof vs. zproof_name;
wenzelm
parents: 79124
diff changeset
  1200
    val ax =
79263
bf2e724ff57e clarified signature;
wenzelm
parents: 79261
diff changeset
  1201
      make_const_proof (fn "'a" => A | "'b" => B, fn "f" => f | "g" => g)
79126
bdb33a2d4167 clarified const_proof vs. zproof_name;
wenzelm
parents: 79124
diff changeset
  1202
        abstract_rule_axiom;
79212
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
  1203
  in ZAppp (ax, forall_intr_proof thy T x prf) end;
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
  1204
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
  1205
fun combination_proof thy T U f g t u prf1 prf2 =
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
  1206
  let
79158
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
  1207
    val {ztyp, zterm} = zterm_cache thy;
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
  1208
    val A = ztyp T;
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
  1209
    val B = ztyp U;
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
  1210
    val f' = zterm f;
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
  1211
    val g' = zterm g;
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
  1212
    val x = zterm t;
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
  1213
    val y = zterm u;
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
  1214
    val ax =
79263
bf2e724ff57e clarified signature;
wenzelm
parents: 79261
diff changeset
  1215
      make_const_proof (fn "'a" => A | "'b" => B, fn "f" => f' | "g" => g' | "x" => x | "y" => y)
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
  1216
        combination_axiom;
79212
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
  1217
  in ZAppp (ZAppp (ax, prf1), prf2) end;
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
  1218
79098
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
  1219
end;
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
  1220
79133
cfe995369655 more zproofs;
wenzelm
parents: 79132
diff changeset
  1221
cfe995369655 more zproofs;
wenzelm
parents: 79132
diff changeset
  1222
(* substitution *)
cfe995369655 more zproofs;
wenzelm
parents: 79132
diff changeset
  1223
cfe995369655 more zproofs;
wenzelm
parents: 79132
diff changeset
  1224
fun generalize_proof (tfrees, frees) idx prf =
cfe995369655 more zproofs;
wenzelm
parents: 79132
diff changeset
  1225
  let
cfe995369655 more zproofs;
wenzelm
parents: 79132
diff changeset
  1226
    val typ =
79326
8a2921053511 tuned whitespace;
wenzelm
parents: 79325
diff changeset
  1227
      if Names.is_empty tfrees then Same.same
8a2921053511 tuned whitespace;
wenzelm
parents: 79325
diff changeset
  1228
      else
80579
69cf3c308d6c clarified signature: more operations;
wenzelm
parents: 80560
diff changeset
  1229
        #apply (ZTypes.unsynchronized_cache
79163
9ddcaca41ed2 more operations;
wenzelm
parents: 79161
diff changeset
  1230
          (subst_type_same (fn ((a, i), S) =>
9ddcaca41ed2 more operations;
wenzelm
parents: 79161
diff changeset
  1231
            if i = ~1 andalso Names.defined tfrees a then ZTVar ((a, idx), S)
80579
69cf3c308d6c clarified signature: more operations;
wenzelm
parents: 80560
diff changeset
  1232
            else raise Same.SAME)));
79136
wenzelm
parents: 79135
diff changeset
  1233
    val term =
79147
bfe5c20074e4 proper substitution of types within term;
wenzelm
parents: 79146
diff changeset
  1234
      subst_term_same typ (fn ((x, i), T) =>
bfe5c20074e4 proper substitution of types within term;
wenzelm
parents: 79146
diff changeset
  1235
        if i = ~1 andalso Names.defined frees x then ZVar ((x, idx), T)
bfe5c20074e4 proper substitution of types within term;
wenzelm
parents: 79146
diff changeset
  1236
        else raise Same.SAME);
79418
3a66bcb208b8 more operations (see also 8368160d3c65);
wenzelm
parents: 79417
diff changeset
  1237
  in map_proof {hyps = false} typ term prf end;
79133
cfe995369655 more zproofs;
wenzelm
parents: 79132
diff changeset
  1238
79149
810679c5ed3c more zproofs;
wenzelm
parents: 79148
diff changeset
  1239
fun instantiate_proof thy (Ts, ts) prf =
810679c5ed3c more zproofs;
wenzelm
parents: 79148
diff changeset
  1240
  let
79158
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
  1241
    val {ztyp, zterm} = zterm_cache thy;
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
  1242
    val instT = ZTVars.build (Ts |> fold (fn (v, T) => ZTVars.add (v, ztyp T)));
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
  1243
    val inst = ZVars.build (ts |> fold (fn ((v, T), t) => ZVars.add ((v, ztyp T), zterm t)));
79270
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
  1244
    val typ = instantiate_type_same instT;
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
  1245
    val term = instantiate_term_same typ inst;
79418
3a66bcb208b8 more operations (see also 8368160d3c65);
wenzelm
parents: 79417
diff changeset
  1246
  in map_proof {hyps = false} typ term prf end;
79149
810679c5ed3c more zproofs;
wenzelm
parents: 79148
diff changeset
  1247
79135
db2dc7634d62 more zproofs;
wenzelm
parents: 79133
diff changeset
  1248
fun varifyT_proof names prf =
db2dc7634d62 more zproofs;
wenzelm
parents: 79133
diff changeset
  1249
  if null names then prf
db2dc7634d62 more zproofs;
wenzelm
parents: 79133
diff changeset
  1250
  else
db2dc7634d62 more zproofs;
wenzelm
parents: 79133
diff changeset
  1251
    let
db2dc7634d62 more zproofs;
wenzelm
parents: 79133
diff changeset
  1252
      val tab = ZTVars.build (names |> fold (fn ((a, S), b) => ZTVars.add (((a, ~1), S), b)));
79136
wenzelm
parents: 79135
diff changeset
  1253
      val typ =
80579
69cf3c308d6c clarified signature: more operations;
wenzelm
parents: 80560
diff changeset
  1254
        #apply (ZTypes.unsynchronized_cache (subst_type_same (fn v =>
79136
wenzelm
parents: 79135
diff changeset
  1255
          (case ZTVars.lookup tab v of
wenzelm
parents: 79135
diff changeset
  1256
            NONE => raise Same.SAME
80579
69cf3c308d6c clarified signature: more operations;
wenzelm
parents: 80560
diff changeset
  1257
          | SOME w => ZTVar w))));
79418
3a66bcb208b8 more operations (see also 8368160d3c65);
wenzelm
parents: 79417
diff changeset
  1258
    in map_proof_types {hyps = false} typ prf end;
79135
db2dc7634d62 more zproofs;
wenzelm
parents: 79133
diff changeset
  1259
79152
4189e10f1524 more zproofs;
wenzelm
parents: 79150
diff changeset
  1260
fun legacy_freezeT_proof t prf =
4189e10f1524 more zproofs;
wenzelm
parents: 79150
diff changeset
  1261
  (case Type.legacy_freezeT t of
4189e10f1524 more zproofs;
wenzelm
parents: 79150
diff changeset
  1262
    NONE => prf
4189e10f1524 more zproofs;
wenzelm
parents: 79150
diff changeset
  1263
  | SOME f =>
4189e10f1524 more zproofs;
wenzelm
parents: 79150
diff changeset
  1264
      let
4189e10f1524 more zproofs;
wenzelm
parents: 79150
diff changeset
  1265
        val tvar = ztyp_of o Same.function f;
80579
69cf3c308d6c clarified signature: more operations;
wenzelm
parents: 80560
diff changeset
  1266
        val typ = #apply (ZTypes.unsynchronized_cache (subst_type_same tvar));
79418
3a66bcb208b8 more operations (see also 8368160d3c65);
wenzelm
parents: 79417
diff changeset
  1267
      in map_proof_types {hyps = false} typ prf end);
79152
4189e10f1524 more zproofs;
wenzelm
parents: 79150
diff changeset
  1268
79155
53288743c2f0 more zproofs;
wenzelm
parents: 79154
diff changeset
  1269
53288743c2f0 more zproofs;
wenzelm
parents: 79154
diff changeset
  1270
(* permutations *)
53288743c2f0 more zproofs;
wenzelm
parents: 79154
diff changeset
  1271
53288743c2f0 more zproofs;
wenzelm
parents: 79154
diff changeset
  1272
fun rotate_proof thy Bs Bi' params asms m prf =
53288743c2f0 more zproofs;
wenzelm
parents: 79154
diff changeset
  1273
  let
79158
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
  1274
    val {ztyp, zterm} = zterm_cache thy;
79155
53288743c2f0 more zproofs;
wenzelm
parents: 79154
diff changeset
  1275
    val i = length asms;
53288743c2f0 more zproofs;
wenzelm
parents: 79154
diff changeset
  1276
    val j = length Bs;
53288743c2f0 more zproofs;
wenzelm
parents: 79154
diff changeset
  1277
  in
79212
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
  1278
    ZAbsps (map zterm Bs @ [zterm Bi']) (ZAppps (prf, map ZBoundp
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
  1279
      (j downto 1) @ [ZAbsts (map (apsnd ztyp) params) (ZAbsps (map zterm asms)
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
  1280
        (ZAppps (ZAppts (ZBoundp i, map ZBound ((length params - 1) downto 0)),
79326
8a2921053511 tuned whitespace;
wenzelm
parents: 79325
diff changeset
  1281
          map ZBoundp (((i - m - 1) downto 0) @ ((i - 1) downto (i - m))))))]))
79155
53288743c2f0 more zproofs;
wenzelm
parents: 79154
diff changeset
  1282
  end;
53288743c2f0 more zproofs;
wenzelm
parents: 79154
diff changeset
  1283
53288743c2f0 more zproofs;
wenzelm
parents: 79154
diff changeset
  1284
fun permute_prems_proof thy prems' j k prf =
53288743c2f0 more zproofs;
wenzelm
parents: 79154
diff changeset
  1285
  let
79160
wenzelm
parents: 79158
diff changeset
  1286
    val {zterm, ...} = zterm_cache thy;
79155
53288743c2f0 more zproofs;
wenzelm
parents: 79154
diff changeset
  1287
    val n = length prems';
53288743c2f0 more zproofs;
wenzelm
parents: 79154
diff changeset
  1288
  in
79212
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
  1289
    ZAbsps (map zterm prems')
79326
8a2921053511 tuned whitespace;
wenzelm
parents: 79325
diff changeset
  1290
      (ZAppps (prf, map ZBoundp ((n - 1 downto n - j) @ (k - 1 downto 0) @ (n - j - 1 downto k))))
79155
53288743c2f0 more zproofs;
wenzelm
parents: 79154
diff changeset
  1291
  end;
53288743c2f0 more zproofs;
wenzelm
parents: 79154
diff changeset
  1292
79211
35ead2206eb1 more zproofs;
wenzelm
parents: 79210
diff changeset
  1293
79234
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1294
(* lifting *)
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1295
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1296
fun incr_tvar_same inc =
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1297
  if inc = 0 then Same.same
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1298
  else
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1299
    let fun tvar ((a, i), S) = if i >= 0 then ZTVar ((a, i + inc), S) else raise Same.SAME
80579
69cf3c308d6c clarified signature: more operations;
wenzelm
parents: 80560
diff changeset
  1300
    in #apply (ZTypes.unsynchronized_cache (subst_type_same tvar)) end;
79234
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1301
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1302
fun incr_indexes_proof inc prf =
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1303
  let
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1304
    val typ = incr_tvar_same inc;
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1305
    fun var ((x, i), T) = if i >= 0 then ZVar ((x, i + inc), T) else raise Same.SAME;
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1306
    val term = subst_term_same typ var;
79418
3a66bcb208b8 more operations (see also 8368160d3c65);
wenzelm
parents: 79417
diff changeset
  1307
  in map_proof {hyps = false} typ term prf end;
79234
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1308
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1309
fun lift_proof thy gprop inc prems prf =
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1310
  let
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1311
    val {ztyp, zterm} = zterm_cache thy;
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1312
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1313
    val typ = incr_tvar_same inc;
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1314
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1315
    fun term Ts lev =
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1316
      if null Ts andalso inc = 0 then Same.same
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1317
      else
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1318
        let
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1319
          val n = length Ts;
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1320
          fun incr lev (ZVar ((x, i), T)) =
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1321
                if i >= 0 then combound (ZVar ((x, i + inc), ZFuns (Ts, Same.commit typ T)), lev, n)
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1322
                else raise Same.SAME
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1323
            | incr _ (ZBound _) = raise Same.SAME
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1324
            | incr _ (ZConst0 _) = raise Same.SAME
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1325
            | incr _ (ZConst1 (c, T)) = ZConst1 (c, typ T)
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1326
            | incr _ (ZConst (c, Ts)) = ZConst (c, Same.map typ Ts)
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1327
            | incr lev (ZAbs (x, T, t)) =
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1328
                (ZAbs (x, typ T, Same.commit (incr (lev + 1)) t)
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1329
                  handle Same.SAME => ZAbs (x, T, incr (lev + 1) t))
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1330
            | incr lev (ZApp (t, u)) =
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1331
                (ZApp (incr lev t, Same.commit (incr lev) u)
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1332
                  handle Same.SAME => ZApp (t, incr lev u))
80293
453eccb886f2 clarified signature;
wenzelm
parents: 80289
diff changeset
  1333
            | incr _ (OFCLASS (T, c)) = OFCLASS (typ T, c);
79234
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1334
        in incr lev end;
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1335
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1336
    fun proof Ts lev (ZAbst (a, T, p)) =
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1337
          (ZAbst (a, typ T, Same.commit (proof Ts (lev + 1)) p)
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1338
            handle Same.SAME => ZAbst (a, T, proof Ts (lev + 1) p))
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1339
      | proof Ts lev (ZAbsp (a, t, p)) =
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1340
          (ZAbsp (a, term Ts lev t, Same.commit (proof Ts lev) p)
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1341
            handle Same.SAME => ZAbsp (a, t, proof Ts lev p))
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1342
      | proof Ts lev (ZAppt (p, t)) =
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1343
          (ZAppt (proof Ts lev p, Same.commit (term Ts lev) t)
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1344
            handle Same.SAME => ZAppt (p, term Ts lev t))
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1345
      | proof Ts lev (ZAppp (p, q)) =
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1346
          (ZAppp (proof Ts lev p, Same.commit (proof Ts lev) q)
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1347
            handle Same.SAME => ZAppp (p, proof Ts lev q))
80262
d49f3a1c06a6 tuned signature;
wenzelm
parents: 79478
diff changeset
  1348
      | proof Ts lev (ZConstp (a, insts)) =
d49f3a1c06a6 tuned signature;
wenzelm
parents: 79478
diff changeset
  1349
          ZConstp (a, map_insts_same typ (term Ts lev) insts)
80293
453eccb886f2 clarified signature;
wenzelm
parents: 80289
diff changeset
  1350
      | proof _ _ (OFCLASSp (T, c)) = OFCLASSp (typ T, c)
79234
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1351
      | proof _ _ _ = raise Same.SAME;
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1352
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1353
    val k = length prems;
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1354
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1355
    fun mk_app b (i, j, p) =
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1356
      if b then (i - 1, j, ZAppp (p, ZBoundp i)) else (i, j - 1, ZAppt (p, ZBound j));
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1357
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1358
    fun lift Ts bs i j (Const ("Pure.imp", _) $ A $ B) =
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1359
          ZAbsp ("H", Same.commit (term Ts 0) (zterm A), lift Ts (true :: bs) (i + 1) j B)
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1360
      | lift Ts bs i j (Const ("Pure.all", _) $ Abs (a, T, t)) =
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1361
          let val T' = ztyp T
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1362
          in ZAbst (a, T', lift (T' :: Ts) (false :: bs) i (j + 1) t) end
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1363
      | lift Ts bs i j _ =
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1364
          ZAppps (Same.commit (proof (rev Ts) 0) prf,
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1365
            map (fn k => (#3 (fold_rev mk_app bs (i - 1, j - 1, ZBoundp k)))) (i + k - 1 downto i));
79237
f97fe7ad62a7 proper ZTerm.lift_proof (amending 4a1a25bdf81d);
wenzelm
parents: 79234
diff changeset
  1366
  in ZAbsps (map zterm prems) (lift [] [] 0 0 gprop) end;
79234
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1367
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1368
79211
35ead2206eb1 more zproofs;
wenzelm
parents: 79210
diff changeset
  1369
(* higher-order resolution *)
35ead2206eb1 more zproofs;
wenzelm
parents: 79210
diff changeset
  1370
35ead2206eb1 more zproofs;
wenzelm
parents: 79210
diff changeset
  1371
fun mk_asm_prf C i m =
35ead2206eb1 more zproofs;
wenzelm
parents: 79210
diff changeset
  1372
  let
79212
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
  1373
    fun imp _ i 0 = ZBoundp i
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
  1374
      | imp (ZApp (ZApp (ZConst0 "Pure.imp", A), B)) i m = ZAbsp ("H", A, imp B (i + 1) (m - 1))
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
  1375
      | imp _ i _ = ZBoundp i;
79211
35ead2206eb1 more zproofs;
wenzelm
parents: 79210
diff changeset
  1376
    fun all (ZApp (ZConst1 ("Pure.all", _), ZAbs (a, T, t))) = ZAbst (a, T, all t)
35ead2206eb1 more zproofs;
wenzelm
parents: 79210
diff changeset
  1377
      | all t = imp t (~ i) m
35ead2206eb1 more zproofs;
wenzelm
parents: 79210
diff changeset
  1378
  in all C end;
35ead2206eb1 more zproofs;
wenzelm
parents: 79210
diff changeset
  1379
79270
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
  1380
fun assumption_proof thy envir Bs Bi n visible prf =
79211
35ead2206eb1 more zproofs;
wenzelm
parents: 79210
diff changeset
  1381
  let
80582
1bc7eef961ff clarified scope of cache: avoid nested typ_cache;
wenzelm
parents: 80581
diff changeset
  1382
    val cache as {zterm, ...} = zterm_cache thy;
79211
35ead2206eb1 more zproofs;
wenzelm
parents: 79210
diff changeset
  1383
    val normt = zterm #> Same.commit (norm_term_same cache envir);
35ead2206eb1 more zproofs;
wenzelm
parents: 79210
diff changeset
  1384
  in
79212
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
  1385
    ZAbsps (map normt Bs)
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
  1386
      (ZAppps (prf, map ZBoundp (length Bs - 1 downto 0) @ [mk_asm_prf (normt Bi) n ~1]))
79270
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
  1387
    |> norm_proof_cache cache envir visible
79211
35ead2206eb1 more zproofs;
wenzelm
parents: 79210
diff changeset
  1388
  end;
35ead2206eb1 more zproofs;
wenzelm
parents: 79210
diff changeset
  1389
79261
2e6fcc331f10 more zproofs;
wenzelm
parents: 79259
diff changeset
  1390
fun flatten_params_proof i j n (ZApp (ZApp (ZConst0 "Pure.imp", A), B), k) =
2e6fcc331f10 more zproofs;
wenzelm
parents: 79259
diff changeset
  1391
      ZAbsp ("H", A, flatten_params_proof (i + 1) j n (B, k))
2e6fcc331f10 more zproofs;
wenzelm
parents: 79259
diff changeset
  1392
  | flatten_params_proof i j n (ZApp (ZConst1 ("Pure.all", _), ZAbs (a, T, t)), k) =
2e6fcc331f10 more zproofs;
wenzelm
parents: 79259
diff changeset
  1393
      ZAbst (a, T, flatten_params_proof i (j + 1) n (t, k))
2e6fcc331f10 more zproofs;
wenzelm
parents: 79259
diff changeset
  1394
  | flatten_params_proof i j n (_, k) =
2e6fcc331f10 more zproofs;
wenzelm
parents: 79259
diff changeset
  1395
      ZAppps (ZAppts (ZBoundp (k + i),
2e6fcc331f10 more zproofs;
wenzelm
parents: 79259
diff changeset
  1396
        map ZBound (j - 1 downto 0)), map ZBoundp (remove (op =) (i - n) (i - 1 downto 0)));
2e6fcc331f10 more zproofs;
wenzelm
parents: 79259
diff changeset
  1397
79270
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
  1398
fun bicompose_proof thy env smax flatten Bs As A oldAs n m visible rprf sprf =
79261
2e6fcc331f10 more zproofs;
wenzelm
parents: 79259
diff changeset
  1399
  let
80582
1bc7eef961ff clarified scope of cache: avoid nested typ_cache;
wenzelm
parents: 80581
diff changeset
  1400
    val cache as {zterm, ...} = zterm_cache thy;
79261
2e6fcc331f10 more zproofs;
wenzelm
parents: 79259
diff changeset
  1401
    val normt = zterm #> Same.commit (norm_term_same cache env);
79270
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
  1402
    val normp = norm_proof_cache cache env visible;
79261
2e6fcc331f10 more zproofs;
wenzelm
parents: 79259
diff changeset
  1403
2e6fcc331f10 more zproofs;
wenzelm
parents: 79259
diff changeset
  1404
    val lb = length Bs;
2e6fcc331f10 more zproofs;
wenzelm
parents: 79259
diff changeset
  1405
    val la = length As;
2e6fcc331f10 more zproofs;
wenzelm
parents: 79259
diff changeset
  1406
2e6fcc331f10 more zproofs;
wenzelm
parents: 79259
diff changeset
  1407
    fun proof p q =
2e6fcc331f10 more zproofs;
wenzelm
parents: 79259
diff changeset
  1408
      ZAbsps (map normt (Bs @ As))
2e6fcc331f10 more zproofs;
wenzelm
parents: 79259
diff changeset
  1409
        (ZAppp (ZAppps (q, map ZBoundp (lb + la - 1 downto la)),
2e6fcc331f10 more zproofs;
wenzelm
parents: 79259
diff changeset
  1410
          ZAppps (p, (if n > 0 then [mk_asm_prf (normt (the A)) n m] else []) @
2e6fcc331f10 more zproofs;
wenzelm
parents: 79259
diff changeset
  1411
            map (if flatten then flatten_params_proof 0 0 n else ZBoundp o snd)
2e6fcc331f10 more zproofs;
wenzelm
parents: 79259
diff changeset
  1412
              (map normt oldAs ~~ (la - 1 downto 0)))));
2e6fcc331f10 more zproofs;
wenzelm
parents: 79259
diff changeset
  1413
  in
2e6fcc331f10 more zproofs;
wenzelm
parents: 79259
diff changeset
  1414
    if Envir.is_empty env then proof rprf sprf
2e6fcc331f10 more zproofs;
wenzelm
parents: 79259
diff changeset
  1415
    else proof (normp rprf) (if Envir.above env smax then sprf else normp sprf)
2e6fcc331f10 more zproofs;
wenzelm
parents: 79259
diff changeset
  1416
  end;
2e6fcc331f10 more zproofs;
wenzelm
parents: 79259
diff changeset
  1417
79405
f4fdf5eebcac pro-forma support for ZTerm.sorts_zproof;
wenzelm
parents: 79388
diff changeset
  1418
f4fdf5eebcac pro-forma support for ZTerm.sorts_zproof;
wenzelm
parents: 79388
diff changeset
  1419
(* sort constraints within the logic *)
f4fdf5eebcac pro-forma support for ZTerm.sorts_zproof;
wenzelm
parents: 79388
diff changeset
  1420
79425
0875c87b4a4b clarified signature;
wenzelm
parents: 79422
diff changeset
  1421
type sorts_proof = (class * class -> zproof) * (string * class list list * class -> zproof);
79405
f4fdf5eebcac pro-forma support for ZTerm.sorts_zproof;
wenzelm
parents: 79388
diff changeset
  1422
f4fdf5eebcac pro-forma support for ZTerm.sorts_zproof;
wenzelm
parents: 79388
diff changeset
  1423
fun of_sort_proof algebra (classrel_proof, arity_proof) hyps =
f4fdf5eebcac pro-forma support for ZTerm.sorts_zproof;
wenzelm
parents: 79388
diff changeset
  1424
  Sorts.of_sort_derivation algebra
f4fdf5eebcac pro-forma support for ZTerm.sorts_zproof;
wenzelm
parents: 79388
diff changeset
  1425
   {class_relation = fn _ => fn _ => fn (prf, c1) => fn c2 =>
f4fdf5eebcac pro-forma support for ZTerm.sorts_zproof;
wenzelm
parents: 79388
diff changeset
  1426
      if c1 = c2 then prf else ZAppp (classrel_proof (c1, c2), prf),
f4fdf5eebcac pro-forma support for ZTerm.sorts_zproof;
wenzelm
parents: 79388
diff changeset
  1427
    type_constructor = fn (a, _) => fn dom => fn c =>
f4fdf5eebcac pro-forma support for ZTerm.sorts_zproof;
wenzelm
parents: 79388
diff changeset
  1428
      let val Ss = map (map snd) dom and prfs = maps (map fst) dom
f4fdf5eebcac pro-forma support for ZTerm.sorts_zproof;
wenzelm
parents: 79388
diff changeset
  1429
      in ZAppps (arity_proof (a, Ss, c), prfs) end,
f4fdf5eebcac pro-forma support for ZTerm.sorts_zproof;
wenzelm
parents: 79388
diff changeset
  1430
    type_variable = fn typ => map (fn c => (hyps (typ, c), c)) (Type.sort_of_atyp typ)};
f4fdf5eebcac pro-forma support for ZTerm.sorts_zproof;
wenzelm
parents: 79388
diff changeset
  1431
79414
6cacfbce33ba more operations;
wenzelm
parents: 79405
diff changeset
  1432
fun unconstrainT_proof thy sorts_proof (ucontext: Logic.unconstrain_context) =
6cacfbce33ba more operations;
wenzelm
parents: 79405
diff changeset
  1433
  let
80584
wenzelm
parents: 80583
diff changeset
  1434
    val algebra = Sign.classes_of thy;
wenzelm
parents: 80583
diff changeset
  1435
80582
1bc7eef961ff clarified scope of cache: avoid nested typ_cache;
wenzelm
parents: 80581
diff changeset
  1436
    val cache = zterm_cache thy;
1bc7eef961ff clarified scope of cache: avoid nested typ_cache;
wenzelm
parents: 80581
diff changeset
  1437
    val typ_cache = typ_cache thy;
79414
6cacfbce33ba more operations;
wenzelm
parents: 79405
diff changeset
  1438
6cacfbce33ba more operations;
wenzelm
parents: 79405
diff changeset
  1439
    val typ =
80579
69cf3c308d6c clarified signature: more operations;
wenzelm
parents: 80560
diff changeset
  1440
      #apply (ZTypes.unsynchronized_cache
69cf3c308d6c clarified signature: more operations;
wenzelm
parents: 80560
diff changeset
  1441
        (typ_of #> #typ_operation ucontext {strip_sorts = true} #> ztyp_of));
79414
6cacfbce33ba more operations;
wenzelm
parents: 79405
diff changeset
  1442
6cacfbce33ba more operations;
wenzelm
parents: 79405
diff changeset
  1443
    val typ_sort = #typ_operation ucontext {strip_sorts = false};
6cacfbce33ba more operations;
wenzelm
parents: 79405
diff changeset
  1444
6cacfbce33ba more operations;
wenzelm
parents: 79405
diff changeset
  1445
    fun hyps T =
6cacfbce33ba more operations;
wenzelm
parents: 79405
diff changeset
  1446
      (case AList.lookup (op =) (#constraints ucontext) T of
6cacfbce33ba more operations;
wenzelm
parents: 79405
diff changeset
  1447
        SOME t => ZHyp (#zterm cache t)
6cacfbce33ba more operations;
wenzelm
parents: 79405
diff changeset
  1448
      | NONE => raise Fail "unconstrainT_proof: missing constraint");
6cacfbce33ba more operations;
wenzelm
parents: 79405
diff changeset
  1449
6cacfbce33ba more operations;
wenzelm
parents: 79405
diff changeset
  1450
    fun class (T, c) =
80582
1bc7eef961ff clarified scope of cache: avoid nested typ_cache;
wenzelm
parents: 80581
diff changeset
  1451
      let val T' = Same.commit typ_sort (typ_cache T)
79414
6cacfbce33ba more operations;
wenzelm
parents: 79405
diff changeset
  1452
      in the_single (of_sort_proof algebra sorts_proof hyps (T', [c])) end;
6cacfbce33ba more operations;
wenzelm
parents: 79405
diff changeset
  1453
  in
79418
3a66bcb208b8 more operations (see also 8368160d3c65);
wenzelm
parents: 79417
diff changeset
  1454
    map_proof_types {hyps = false} typ #> map_class_proof class #> beta_norm_prooft
79414
6cacfbce33ba more operations;
wenzelm
parents: 79405
diff changeset
  1455
    #> fold_rev (implies_intr_proof' o #zterm cache o #2) (#constraints ucontext)
6cacfbce33ba more operations;
wenzelm
parents: 79405
diff changeset
  1456
  end;
6cacfbce33ba more operations;
wenzelm
parents: 79405
diff changeset
  1457
80586
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
  1458
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
  1459
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
  1460
(** XML data representation **)
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
  1461
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
  1462
(* encode *)
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
  1463
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
  1464
local
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
  1465
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
  1466
open XML.Encode Term_XML.Encode;
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
  1467
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
  1468
fun ztyp T = T |> variant
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
  1469
 [fn ZFun args => (["fun"], pair ztyp ztyp args)
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
  1470
   | ZProp => (["prop"], [])
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
  1471
   | ZType0 a => ([a], [])
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
  1472
   | ZType1 (a, b) => ([a], list ztyp [b])
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
  1473
   | ZType (a, b) => ([a], list ztyp b),
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
  1474
  fn ZTVar ((a, ~1), b) => ([a], sort b),
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
  1475
  fn ZTVar (a, b) => (indexname a, sort b)];
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
  1476
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
  1477
fun zvar_type {typed_vars} T =
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
  1478
  if typed_vars andalso T <> ztyp_dummy then ztyp T else [];
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
  1479
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
  1480
fun zterm flag t = t |> variant
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
  1481
 [fn ZConst0 a => ([a], [])
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
  1482
   | ZConst1 (a, b) => ([a], list ztyp [b])
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
  1483
   | ZConst (a, b) => ([a], list ztyp b),
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
  1484
  fn ZVar ((a, ~1), b) => ([a], zvar_type flag b),
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
  1485
  fn ZVar (a, b) => (indexname a, zvar_type flag b),
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
  1486
  fn ZBound a => ([], int a),
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
  1487
  fn ZAbs (a, b, c) => ([a], pair ztyp (zterm flag) (b, c)),
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
  1488
  fn ZApp a => ([], pair (zterm flag) (zterm flag) a),
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
  1489
  fn OFCLASS (a, b) => ([b], ztyp a)];
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
  1490
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
  1491
fun zproof flag prf = prf |> variant
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
  1492
 [fn ZNop => ([], []),
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
  1493
  fn ZBoundp a => ([], int a),
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
  1494
  fn ZAbst (a, b, c) => ([a], pair ztyp (zproof flag) (b, c)),
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
  1495
  fn ZAbsp (a, b, c) => ([a], pair (zterm flag) (zproof flag) (b, c)),
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
  1496
  fn ZAppt a => ([], pair (zproof flag) (zterm flag) a),
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
  1497
  fn ZAppp a => ([], pair (zproof flag) (zproof flag) a),
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
  1498
  fn ZHyp a => ([], zterm flag a),
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
  1499
  fn ZConstp (c as ((ZAxiom a, b), _)) => ([a], list (ztyp o #2) (zproof_const_typargs c)),
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
  1500
  fn OFCLASSp (a, b) => ([b], ztyp a),
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
  1501
  fn ZConstp (c as ((ZOracle a, b), _)) => ([a], list (ztyp o #2) (zproof_const_typargs c)),
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
  1502
  fn ZConstp (c as ((ZThm {theory_name, thm_name = (name, _), serial}, b), _)) =>
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
  1503
    ([int_atom serial, theory_name, #1 name, int_atom (#2 name)],
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
  1504
      list (ztyp o #2) (zproof_const_typargs c))];
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
  1505
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
  1506
in
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
  1507
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
  1508
val encode_ztyp = ztyp;
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
  1509
val encode_zterm = zterm;
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
  1510
val encode_zproof = zproof;
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
  1511
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
  1512
end;
80586
b8733a141c26 uniform export via ztyp/zterm/zproof;
wenzelm
parents: 80584
diff changeset
  1513
80608
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1514
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1515
(* standardization of variables for export: only frees and named bounds *)
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1516
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1517
local
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1518
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1519
fun declare_frees_term t = fold_vars (fn ((x, ~1), _) => Name.declare x | _ => I) t;
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1520
val declare_frees_proof = fold_proof {hyps = true} (K I) declare_frees_term;
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1521
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1522
val (variant_abs_term, variant_abs_proof) =
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1523
  let
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1524
    fun term bs (ZAbs (x, T, t)) =
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1525
          let
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1526
            val x' = #1 (Name.variant x (declare_frees_term t bs));
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1527
            val bs' = Name.declare x' bs;
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1528
          in ZAbs (x', T, Same.commit_if (x <> x') (term bs') t) end
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1529
      | term bs (ZApp (t, u)) =
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1530
          (ZApp (term bs t, Same.commit (term bs) u)
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1531
            handle Same.SAME => ZApp (t, term bs u))
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1532
      | term _ _ = raise Same.SAME;
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1533
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1534
    fun proof bs (ZAbst (x, T, p)) =
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1535
          let
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1536
            val x' = #1 (Name.variant x (declare_frees_proof p bs));
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1537
            val bs' = Name.declare x' bs;
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1538
          in ZAbst (x', T, Same.commit_if (x <> x') (proof bs') p) end
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1539
      | proof bs (ZAbsp (x, t, p)) =
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1540
          let
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1541
            val x' = #1 (Name.variant x (declare_frees_term t (declare_frees_proof p bs)));
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1542
            val (t', term_eq) = Same.commit_id (term bs) t;
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1543
            val bs' = Name.declare x' bs;
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1544
          in ZAbsp (x', t', Same.commit_if (x <> x' orelse not term_eq) (proof bs') p) end
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1545
      | proof bs (ZAppt (p, t)) =
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1546
          (ZAppt (proof bs p, Same.commit (term bs) t)
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1547
            handle Same.SAME => ZAppt (p, term bs t))
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1548
      | proof bs (ZAppp (p, q)) =
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1549
          (ZAppp (proof bs p, Same.commit (proof bs) q)
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1550
            handle Same.SAME => ZAppp (p, proof bs q))
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1551
      | proof bs (ZHyp t) = ZHyp (term bs t)
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1552
      | proof _ _ = raise Same.SAME;
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1553
  in (term Name.context, proof Name.context) end;
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1554
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1555
val used_frees_type = fold_tvars (fn ((a, ~1), _) => Name.declare a | _ => I);
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1556
fun used_frees_term t = fold_types used_frees_type t #> declare_frees_term t;
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1557
val used_frees_proof = fold_proof {hyps = true} used_frees_type used_frees_term;
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1558
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1559
fun hidden_types prop proof =
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1560
  let
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1561
    val visible = (fold_types o fold_tvars) (insert (op =)) prop [];
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1562
    val add_hiddenT = fold_tvars (fn v => not (member (op =) visible v) ? insert (op =) v);
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1563
  in rev (fold_proof {hyps = true} add_hiddenT (fold_types add_hiddenT) proof []) end;
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1564
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1565
fun standard_hidden_types prop proof =
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1566
  let
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1567
    val hidden = hidden_types prop proof;
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1568
    val idx = maxidx_term prop (maxidx_proof proof ~1) + 1;
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1569
    fun zvar (v as (_, S)) =
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1570
      if not (member (op =) hidden v) then raise Same.SAME
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1571
      else if null S then ztyp_dummy
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1572
      else ZTVar (("'", idx), S);
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1573
    val typ = map_tvars_same zvar;
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1574
  in proof |> not (null hidden) ? map_proof {hyps = true} typ (map_types typ) end;
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1575
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1576
fun standard_hidden_terms prop proof =
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1577
  let
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1578
    fun add_unless excluded (ZVar v) = not (member (op =) excluded v) ? insert (op =) v
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1579
      | add_unless _ _ = I;
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1580
    val visible = fold_aterms (add_unless []) prop [];
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1581
    val hidden = fold_proof {hyps = true} (K I) (fold_aterms (add_unless visible)) proof [];
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1582
    fun var (v as (_, T)) =
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1583
      if member (op =) hidden v then zterm_dummy_pattern T else raise Same.SAME;
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1584
    val term = map_vars_same var;
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1585
  in proof |> not (null hidden) ? map_proof {hyps = true} Same.same term end;
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1586
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1587
fun standard_inst add mk (v as ((x, i), T)) (inst, used) =
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1588
  let
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1589
    val (x', used') = Name.variant_bound x used;
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1590
    val inst' = if x = x' andalso i = ~1 then inst else add (v, mk ((x', ~1), T)) inst;
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1591
  in (inst', used') end;
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1592
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1593
fun standard_inst_type used prf =
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1594
  let
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1595
    val add_tvars = fold_tvars (fn v => ZTVars.add (v, ()));
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1596
    val (instT, _) =
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1597
      (ZTVars.empty, used) |> ZTVars.fold (standard_inst ZTVars.add ZTVar o #1)
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1598
        (TVars.build (prf |> fold_proof {hyps = true} add_tvars (fold_types add_tvars)));
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1599
  in instantiate_type_same instT end;
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1600
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1601
fun standard_inst_term used inst_type prf =
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1602
  let
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1603
    val add_vars = fold_vars (fn (x, T) => ZVars.add ((x, Same.commit inst_type T), ()));
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1604
    val (inst, _) =
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1605
      (ZVars.empty, used) |> ZVars.fold (standard_inst ZVars.add ZVar o #1)
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1606
        (ZVars.build (prf |> fold_proof {hyps = true} (K I) add_vars));
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1607
  in instantiate_term_same inst_type inst end;
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1608
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1609
val typargs_type = fold_tvars (fn ((a, ~1), S) => TFrees.add_set (a, S) | _ => I);
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1610
val typargs_term = fold_types typargs_type;
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1611
val typargs_proof = fold_proof {hyps = true} typargs_type typargs_term;
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1612
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1613
val add_standard_vars_term = fold_aterms
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1614
  (fn ZVar ((x, ~1), T) =>
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1615
      (fn env =>
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1616
        (case AList.lookup (op =) env x of
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1617
          NONE => (x, T) :: env
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1618
        | SOME T' =>
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1619
            if T = T' then env
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1620
            else
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1621
              raise TYPE ("standard_vars_env: type conflict for variable " ^ quote x,
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1622
                [typ_of T, typ_of T'], [])))
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1623
    | _ => I);
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1624
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1625
val add_standard_vars = fold_proof {hyps = true} (K I) add_standard_vars_term;
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1626
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1627
in
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1628
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1629
fun standard_vars used (prop, opt_prf) =
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1630
  let
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1631
    val prf = the_default ZNop opt_prf
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1632
      |> standard_hidden_types prop
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1633
      |> standard_hidden_terms prop;
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1634
    val prop_prf = ZAppp (ZHyp prop, prf);
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1635
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1636
    val used' = used |> used_frees_proof prop_prf;
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1637
    val inst_type = standard_inst_type used' prop_prf;
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1638
    val inst_term = standard_inst_term used' inst_type prop_prf;
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1639
    val inst_proof = map_proof_same {hyps = true} inst_type inst_term;
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1640
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1641
    val prop' = prop |> Same.commit (Same.compose variant_abs_term inst_term);
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1642
    val opt_proof' =
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1643
      if is_none opt_prf then NONE
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1644
      else SOME (prf |> Same.commit (Same.compose variant_abs_proof inst_proof));
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1645
    val proofs' = the_list opt_proof';
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1646
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1647
    val args = build_rev (add_standard_vars_term prop' #> fold add_standard_vars proofs');
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1648
    val typargs = TFrees.list_set (TFrees.build (typargs_term prop' #> fold typargs_proof proofs'));
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1649
  in {typargs = typargs, args = args, prop = prop', proof = opt_proof'} end;
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1650
80588
419576354249 tuned whitespace;
wenzelm
parents: 80586
diff changeset
  1651
end;
80608
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1652
0b8922e351a3 clarified export: replaced Proofterm.standard_vars by ZTerm.standard_vars;
wenzelm
parents: 80605
diff changeset
  1653
end;