src/Pure/zterm.ML
author wenzelm
Sun, 17 Dec 2023 21:43:14 +0100
changeset 79273 d1e5f6d1ddca
parent 79272 899f37f6d218
child 79275 8368160d3c65
permissions -rw-r--r--
clarified signature;
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
  | ZItself of ztyp
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
    16
  | ZType0 of string               (*type constant*)
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
    17
  | ZType1 of string * ztyp        (*type constructor: 1 argument*)
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
    18
  | ZType of string * ztyp list    (*type constructor: >= 2 arguments*)
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
    19
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
    20
datatype zterm =
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
    21
    ZVar of indexname * ztyp       (*free: index ~1*)
79098
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
    22
  | ZBound of int
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
    23
  | ZConst0 of string              (*monomorphic constant*)
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
    24
  | ZConst1 of string * ztyp       (*polymorphic constant: 1 type argument*)
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
    25
  | ZConst of string * ztyp list   (*polymorphic constant: >= 2 type arguments*)
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
    26
  | ZAbs of string * ztyp * zterm
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
    27
  | ZApp of zterm * zterm
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
    28
  | ZClass of ztyp * class         (*OFCLASS proposition*)
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
    29
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
    30
structure ZTerm =
79098
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
    31
struct
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
    32
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
    33
(* fold *)
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
    34
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
    35
fun fold_tvars f (ZTVar v) = f v
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
    36
  | fold_tvars f (ZFun (T, U)) = fold_tvars f T #> fold_tvars f U
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
    37
  | fold_tvars f (ZItself T) = fold_tvars f T
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
    38
  | fold_tvars f (ZType1 (_, T)) = fold_tvars f T
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
    39
  | fold_tvars f (ZType (_, Ts)) = fold (fold_tvars f) Ts
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
    40
  | fold_tvars _ _ = I;
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
    41
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
    42
fun fold_aterms f (ZApp (t, u)) = fold_aterms f t #> fold_aterms f u
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
    43
  | fold_aterms f (ZAbs (_, _, t)) = fold_aterms f t
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
    44
  | fold_aterms f a = f a;
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
    45
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
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
    51
  | fold_types f (ZClass (T, _)) = f T
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
79264
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
    55
(* type ordering *)
79098
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
    56
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
    57
local
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
    58
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
    59
fun cons_nr (ZTVar _) = 0
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
    60
  | cons_nr (ZFun _) = 1
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
    61
  | cons_nr ZProp = 2
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
    62
  | cons_nr (ZItself _) = 3
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
    63
  | cons_nr (ZType0 _) = 4
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
    64
  | cons_nr (ZType1 _) = 5
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
    65
  | cons_nr (ZType _) = 6;
79098
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
    66
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
    67
val fast_indexname_ord = Term_Ord.fast_indexname_ord;
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
    68
val sort_ord = Term_Ord.sort_ord;
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
    69
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
    70
in
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
    71
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
    72
fun ztyp_ord TU =
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
    73
  if pointer_eq TU then EQUAL
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
    74
  else
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
    75
    (case TU of
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
    76
      (ZTVar (a, A), ZTVar (b, B)) =>
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
    77
        (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
    78
    | (ZFun (T, T'), ZFun (U, U')) =>
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
    79
        (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
    80
    | (ZProp, ZProp) => EQUAL
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
    81
    | (ZItself T, ZItself U) => ztyp_ord (T, U)
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
    82
    | (ZType0 a, ZType0 b) => fast_string_ord (a, b)
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
    83
    | (ZType1 (a, T), ZType1 (b, U)) =>
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
    84
        (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
    85
    | (ZType (a, Ts), ZType (b, Us)) =>
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
    86
        (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
    87
    | (T, U) => int_ord (cons_nr T, cons_nr U));
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
    88
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
    89
end;
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
    90
79264
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
    91
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
    92
(* term ordering and alpha-conversion *)
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
    93
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
    94
local
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
    95
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
    96
fun cons_nr (ZVar _) = 0
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
    97
  | cons_nr (ZBound _) = 1
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
    98
  | cons_nr (ZConst0 _) = 2
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
    99
  | cons_nr (ZConst1 _) = 3
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   100
  | cons_nr (ZConst _) = 4
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   101
  | cons_nr (ZAbs _) = 5
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   102
  | cons_nr (ZApp _) = 6
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   103
  | cons_nr (ZClass _) = 7;
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   104
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   105
fun struct_ord tu =
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   106
  if pointer_eq tu then EQUAL
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   107
  else
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   108
    (case tu of
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   109
      (ZAbs (_, _, t), ZAbs (_, _, u)) => struct_ord (t, u)
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   110
    | (ZApp (t1, t2), ZApp (u1, u2)) =>
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   111
        (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
   112
    | (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
   113
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   114
fun atoms_ord tu =
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   115
  if pointer_eq tu then EQUAL
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   116
  else
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   117
    (case tu of
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   118
      (ZAbs (_, _, t), ZAbs (_, _, u)) => atoms_ord (t, u)
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   119
    | (ZApp (t1, t2), ZApp (u1, u2)) =>
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   120
        (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
   121
    | (ZConst0 a, ZConst0 b) => fast_string_ord (a, b)
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   122
    | (ZConst1 (a, _), ZConst1 (b, _)) => fast_string_ord (a, b)
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   123
    | (ZConst (a, _), ZConst (b, _)) => fast_string_ord (a, b)
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   124
    | (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
   125
    | (ZBound i, ZBound j) => int_ord (i, j)
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   126
    | (ZClass (_, a), ZClass (_, b)) => fast_string_ord (a, b)
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   127
    | _ => EQUAL);
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   128
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   129
fun types_ord tu =
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   130
  if pointer_eq tu then EQUAL
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   131
  else
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   132
    (case tu of
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   133
      (ZAbs (_, T, t), ZAbs (_, U, u)) =>
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   134
        (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
   135
    | (ZApp (t1, t2), ZApp (u1, u2)) =>
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   136
        (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
   137
    | (ZConst1 (_, T), ZConst1 (_, U)) => ztyp_ord (T, U)
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   138
    | (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
   139
    | (ZVar (_, T), ZVar (_, U)) => ztyp_ord (T, U)
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   140
    | (ZClass (T, _), ZClass (U, _)) => ztyp_ord (T, U)
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   141
    | _ => EQUAL);
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   142
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   143
in
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   144
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   145
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
   146
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   147
end;
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   148
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   149
fun aconv_zterm (tm1, tm2) =
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   150
  pointer_eq (tm1, tm2) orelse
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   151
    (case (tm1, tm2) of
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   152
      (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
   153
    | (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
   154
    | (a1, a2) => a1 = a2);
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   155
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   156
end;
79098
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   157
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   158
79264
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   159
(* tables and term items *)
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   160
79163
9ddcaca41ed2 more operations;
wenzelm
parents: 79161
diff changeset
   161
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
   162
structure ZTerms = Table(type key = zterm val ord = ZTerm.fast_zterm_ord);
79163
9ddcaca41ed2 more operations;
wenzelm
parents: 79161
diff changeset
   163
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   164
structure ZTVars:
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   165
sig
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   166
  include TERM_ITEMS
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   167
  val add_tvarsT: ztyp -> set -> set
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   168
  val add_tvars: zterm -> set -> set
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   169
end =
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   170
struct
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   171
  open TVars;
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   172
  val add_tvarsT = ZTerm.fold_tvars add_set;
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   173
  val add_tvars = ZTerm.fold_types add_tvarsT;
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   174
end;
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   175
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   176
structure ZVars:
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   177
sig
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   178
  include TERM_ITEMS
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   179
  val add_vars: zterm -> set -> set
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   180
end =
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   181
struct
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   182
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   183
structure Term_Items = Term_Items
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   184
(
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   185
  type key = indexname * ztyp;
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   186
  val ord = pointer_eq_ord (prod_ord Term_Ord.fast_indexname_ord ZTerm.ztyp_ord);
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   187
);
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   188
open Term_Items;
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   189
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   190
val add_vars = ZTerm.fold_aterms (fn ZVar v => add_set v | _ => I);
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   191
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   192
end;
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   193
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   194
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   195
(* proofs *)
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   196
79126
bdb33a2d4167 clarified const_proof vs. zproof_name;
wenzelm
parents: 79124
diff changeset
   197
datatype zproof_name =
bdb33a2d4167 clarified const_proof vs. zproof_name;
wenzelm
parents: 79124
diff changeset
   198
    ZAxiom of string
bdb33a2d4167 clarified const_proof vs. zproof_name;
wenzelm
parents: 79124
diff changeset
   199
  | ZOracle of string
bdb33a2d4167 clarified const_proof vs. zproof_name;
wenzelm
parents: 79124
diff changeset
   200
  | ZBox of serial;
bdb33a2d4167 clarified const_proof vs. zproof_name;
wenzelm
parents: 79124
diff changeset
   201
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   202
datatype zproof =
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   203
    ZDummy                         (*dummy proof*)
79212
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   204
  | ZConstp of zproof_name * zterm * ztyp ZTVars.table * zterm ZVars.table
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   205
  | ZBoundp of int
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   206
  | ZHyp of zterm
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   207
  | ZAbst of string * ztyp * zproof
79212
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   208
  | ZAbsp of string * zterm * zproof
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   209
  | ZAppt of zproof * zterm
79212
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   210
  | ZAppp of zproof * zproof
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   211
  | ZClassp of ztyp * class;       (*OFCLASS proof from sorts algebra*)
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   212
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   213
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   214
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   215
(*** local ***)
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   216
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   217
signature ZTERM =
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   218
sig
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   219
  datatype ztyp = datatype ztyp
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   220
  datatype zterm = datatype zterm
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   221
  datatype zproof = datatype zproof
79265
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   222
  exception ZTERM of string * ztyp list * zterm list * zproof list
79263
bf2e724ff57e clarified signature;
wenzelm
parents: 79261
diff changeset
   223
  type zproof_const = zproof_name * zterm * ztyp ZTVars.table * zterm ZVars.table
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   224
  val fold_tvars: (indexname * sort -> 'a -> 'a) -> ztyp -> 'a -> 'a
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   225
  val fold_aterms: (zterm -> 'a -> 'a) -> zterm -> 'a -> 'a
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   226
  val fold_types: (ztyp -> 'a -> 'a) -> zterm -> 'a -> 'a
79264
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   227
  val ztyp_ord: ztyp ord
07b93dee105f more operations: zterm ordering that follows fast_term_ord;
wenzelm
parents: 79263
diff changeset
   228
  val fast_zterm_ord: zterm ord
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   229
  val aconv_zterm: zterm * zterm -> bool
79212
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   230
  val ZAbsts: (string * ztyp) list -> zproof -> zproof
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   231
  val ZAbsps: zterm list -> zproof -> zproof
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   232
  val ZAppts: zproof * zterm list -> zproof
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   233
  val ZAppps: zproof * zproof list -> zproof
79214
61af3e917597 more operations;
wenzelm
parents: 79212
diff changeset
   234
  val fold_proof_terms: (zterm -> 'a -> 'a) -> zproof -> 'a -> 'a
61af3e917597 more operations;
wenzelm
parents: 79212
diff changeset
   235
  val exists_proof_terms: (zterm -> bool) -> zproof -> bool
79200
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   236
  val incr_bv_same: int -> int -> zterm Same.operation
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   237
  val incr_bv: int -> int -> zterm -> zterm
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   238
  val incr_boundvars: int -> zterm -> zterm
79273
d1e5f6d1ddca clarified signature;
wenzelm
parents: 79272
diff changeset
   239
  val map_proof: ztyp Same.operation -> zterm Same.operation -> zproof -> zproof
d1e5f6d1ddca clarified signature;
wenzelm
parents: 79272
diff changeset
   240
  val map_proof_types: ztyp Same.operation -> zproof -> zproof
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   241
  val ztyp_of: typ -> ztyp
79158
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   242
  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
   243
  val zterm_of: theory -> term -> zterm
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   244
  val typ_of: ztyp -> typ
79158
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   245
  val term_of: theory -> zterm -> term
79214
61af3e917597 more operations;
wenzelm
parents: 79212
diff changeset
   246
  val could_beta_contract: zterm -> bool
79200
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   247
  val norm_type: Type.tyenv -> ztyp -> ztyp
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   248
  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
   249
  val norm_proof: theory -> Envir.env -> term list -> zproof -> zproof
79265
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   250
  type zboxes = (zterm * zproof future) Inttab.table
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   251
  val empty_zboxes: zboxes
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   252
  val union_zboxes: zboxes -> zboxes -> zboxes
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   253
  val box_proof: theory -> term list -> term -> zboxes * zproof -> zboxes * zproof
79126
bdb33a2d4167 clarified const_proof vs. zproof_name;
wenzelm
parents: 79124
diff changeset
   254
  val axiom_proof:  theory -> string -> term -> zproof
bdb33a2d4167 clarified const_proof vs. zproof_name;
wenzelm
parents: 79124
diff changeset
   255
  val oracle_proof:  theory -> string -> term -> zproof
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   256
  val assume_proof: theory -> term -> zproof
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   257
  val trivial_proof: theory -> term -> zproof
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   258
  val implies_intr_proof: theory -> term -> zproof -> zproof
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   259
  val forall_intr_proof: theory -> typ -> string * term -> zproof -> zproof
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   260
  val forall_elim_proof: theory -> term -> zproof -> zproof
79128
b6f5d4392388 more zproofs;
wenzelm
parents: 79126
diff changeset
   261
  val of_class_proof: typ * class -> zproof
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   262
  val reflexive_proof: theory -> typ -> term -> zproof
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   263
  val symmetric_proof: theory -> typ -> term -> term -> zproof -> zproof
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   264
  val transitive_proof: theory -> typ -> term -> term -> term -> zproof -> zproof -> zproof
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   265
  val equal_intr_proof: theory -> term -> term -> zproof -> zproof -> zproof
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   266
  val equal_elim_proof: theory -> term -> term -> zproof -> zproof -> zproof
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   267
  val abstract_rule_proof: theory -> typ -> typ -> string * term -> term -> term -> zproof -> zproof
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   268
  val combination_proof: theory -> typ -> typ -> term -> term -> term -> term ->
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   269
    zproof -> zproof -> zproof
79133
cfe995369655 more zproofs;
wenzelm
parents: 79132
diff changeset
   270
  val generalize_proof: Names.set * Names.set -> int -> zproof -> zproof
79149
810679c5ed3c more zproofs;
wenzelm
parents: 79148
diff changeset
   271
  val instantiate_proof: theory ->
810679c5ed3c more zproofs;
wenzelm
parents: 79148
diff changeset
   272
    ((indexname * sort) * typ) list * ((indexname * typ) * term) list -> zproof -> zproof
79135
db2dc7634d62 more zproofs;
wenzelm
parents: 79133
diff changeset
   273
  val varifyT_proof: ((string * sort) * (indexname * sort)) list -> zproof -> zproof
79152
4189e10f1524 more zproofs;
wenzelm
parents: 79150
diff changeset
   274
  val legacy_freezeT_proof: term -> zproof -> zproof
79155
53288743c2f0 more zproofs;
wenzelm
parents: 79154
diff changeset
   275
  val rotate_proof: theory -> term list -> term -> (string * typ) list ->
53288743c2f0 more zproofs;
wenzelm
parents: 79154
diff changeset
   276
    term list -> int -> zproof -> zproof
53288743c2f0 more zproofs;
wenzelm
parents: 79154
diff changeset
   277
  val permute_prems_proof: theory -> term list -> int -> int -> zproof -> zproof
79234
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   278
  val incr_indexes_proof: int -> zproof -> zproof
79237
f97fe7ad62a7 proper ZTerm.lift_proof (amending 4a1a25bdf81d);
wenzelm
parents: 79234
diff changeset
   279
  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
   280
  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
   281
    zproof -> zproof
79261
2e6fcc331f10 more zproofs;
wenzelm
parents: 79259
diff changeset
   282
  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
   283
    term option -> term list -> int -> int -> term list -> zproof -> zproof -> zproof
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   284
end;
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   285
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   286
structure ZTerm: ZTERM =
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   287
struct
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   288
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   289
datatype ztyp = datatype ztyp;
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   290
datatype zterm = datatype zterm;
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   291
datatype zproof = datatype zproof;
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   292
79265
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   293
exception ZTERM of string * ztyp list * zterm list * zproof list;
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   294
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   295
open ZTerm;
79098
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   296
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   297
79155
53288743c2f0 more zproofs;
wenzelm
parents: 79154
diff changeset
   298
(* derived operations *)
53288743c2f0 more zproofs;
wenzelm
parents: 79154
diff changeset
   299
79234
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   300
val ZFuns = Library.foldr ZFun;
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   301
79212
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   302
val ZAbsts = fold_rev (fn (x, T) => fn prf => ZAbst (x, T, prf));
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   303
val ZAbsps = fold_rev (fn t => fn prf => ZAbsp ("H", t, prf));
79155
53288743c2f0 more zproofs;
wenzelm
parents: 79154
diff changeset
   304
79212
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   305
val ZAppts = Library.foldl ZAppt;
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   306
val ZAppps = Library.foldl ZAppp;
79155
53288743c2f0 more zproofs;
wenzelm
parents: 79154
diff changeset
   307
79234
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   308
fun combound (t, n, k) =
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   309
  if k > 0 then ZApp (combound (t, n + 1, k - 1), ZBound n) else t;
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   310
79155
53288743c2f0 more zproofs;
wenzelm
parents: 79154
diff changeset
   311
79214
61af3e917597 more operations;
wenzelm
parents: 79212
diff changeset
   312
(* fold *)
61af3e917597 more operations;
wenzelm
parents: 79212
diff changeset
   313
61af3e917597 more operations;
wenzelm
parents: 79212
diff changeset
   314
fun fold_proof_terms f =
61af3e917597 more operations;
wenzelm
parents: 79212
diff changeset
   315
  let
61af3e917597 more operations;
wenzelm
parents: 79212
diff changeset
   316
    fun proof (ZConstp (_, _, _, inst)) = ZVars.fold (f o #2) inst
61af3e917597 more operations;
wenzelm
parents: 79212
diff changeset
   317
      | proof (ZHyp t) = f t
61af3e917597 more operations;
wenzelm
parents: 79212
diff changeset
   318
      | proof (ZAbst (_, _, p)) = proof p
61af3e917597 more operations;
wenzelm
parents: 79212
diff changeset
   319
      | proof (ZAbsp (_, t, p)) = f t #> proof p
61af3e917597 more operations;
wenzelm
parents: 79212
diff changeset
   320
      | proof (ZAppt (p, t)) = proof p #> f t
61af3e917597 more operations;
wenzelm
parents: 79212
diff changeset
   321
      | proof (ZAppp (p, q)) = proof p #> proof q
61af3e917597 more operations;
wenzelm
parents: 79212
diff changeset
   322
      | proof _ = I;
61af3e917597 more operations;
wenzelm
parents: 79212
diff changeset
   323
  in proof end;
61af3e917597 more operations;
wenzelm
parents: 79212
diff changeset
   324
61af3e917597 more operations;
wenzelm
parents: 79212
diff changeset
   325
local exception Found in
61af3e917597 more operations;
wenzelm
parents: 79212
diff changeset
   326
61af3e917597 more operations;
wenzelm
parents: 79212
diff changeset
   327
fun exists_proof_terms P prf =
61af3e917597 more operations;
wenzelm
parents: 79212
diff changeset
   328
  (fold_proof_terms (fn t => fn () => if P t then raise Found else ()) prf (); true)
61af3e917597 more operations;
wenzelm
parents: 79212
diff changeset
   329
    handle Found => true;
61af3e917597 more operations;
wenzelm
parents: 79212
diff changeset
   330
61af3e917597 more operations;
wenzelm
parents: 79212
diff changeset
   331
end;
61af3e917597 more operations;
wenzelm
parents: 79212
diff changeset
   332
61af3e917597 more operations;
wenzelm
parents: 79212
diff changeset
   333
79200
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   334
(* substitution of bound variables *)
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   335
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   336
fun incr_bv_same inc =
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   337
  if inc = 0 then fn _ => Same.same
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   338
  else
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   339
    let
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   340
      fun term lev (ZBound i) = if i >= lev then ZBound (i + inc) else raise Same.SAME
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   341
        | term lev (ZAbs (a, T, t)) = ZAbs (a, T, term (lev + 1) t)
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   342
        | term lev (ZApp (t, u)) =
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   343
            (ZApp (term lev t, Same.commit (term lev) u) handle Same.SAME =>
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   344
              ZApp (t, term lev u))
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   345
        | term _ _ = raise Same.SAME;
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   346
    in term end;
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   347
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   348
fun incr_bv inc lev = Same.commit (incr_bv_same inc lev);
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   349
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   350
fun incr_boundvars inc = incr_bv inc 0;
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   351
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   352
fun subst_bound arg body =
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   353
  let
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   354
    fun term lev (ZBound i) =
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   355
          if i < lev then raise Same.SAME   (*var is locally bound*)
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   356
          else if i = lev then incr_boundvars lev arg
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   357
          else ZBound (i - 1)   (*loose: change it*)
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   358
      | term lev (ZAbs (a, T, t)) = ZAbs (a, T, term (lev + 1) t)
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   359
      | term lev (ZApp (t, u)) =
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   360
          (ZApp (term lev t, Same.commit (term lev) u)
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   361
            handle Same.SAME => ZApp (t, term lev u))
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   362
      | term _ _ = raise Same.SAME;
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   363
  in Same.commit (term 0) body end;
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   364
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   365
79268
154166613b40 tuned comments;
wenzelm
parents: 79266
diff changeset
   366
(* substitution of free or schematic variables *)
79132
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   367
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   368
fun subst_type_same tvar =
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   369
  let
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   370
    fun typ (ZTVar x) = tvar x
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   371
      | typ (ZFun (T, U)) = (ZFun (typ T, Same.commit typ U) handle Same.SAME => ZFun (T, typ U))
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   372
      | typ ZProp = raise Same.SAME
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   373
      | typ (ZItself T) = ZItself (typ T)
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   374
      | typ (ZType0 _) = raise Same.SAME
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   375
      | typ (ZType1 (a, T)) = ZType1 (a, typ T)
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   376
      | typ (ZType (a, Ts)) = ZType (a, Same.map typ Ts);
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   377
  in typ end;
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   378
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   379
fun subst_term_same typ var =
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   380
  let
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   381
    fun term (ZVar (x, T)) =
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   382
          let val (T', same) = Same.commit_id typ T in
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   383
            (case Same.catch var (x, T') of
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   384
              NONE => if same then raise Same.SAME else ZVar (x, T')
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   385
            | SOME t' => t')
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   386
          end
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   387
      | term (ZBound _) = raise Same.SAME
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   388
      | term (ZConst0 _) = raise Same.SAME
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   389
      | term (ZConst1 (a, T)) = ZConst1 (a, typ T)
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   390
      | term (ZConst (a, Ts)) = ZConst (a, Same.map typ Ts)
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   391
      | term (ZAbs (a, T, t)) =
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   392
          (ZAbs (a, typ T, Same.commit term t) handle Same.SAME => ZAbs (a, T, term t))
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   393
      | term (ZApp (t, u)) =
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   394
          (ZApp (term t, Same.commit term u) handle Same.SAME => ZApp (t, term u))
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   395
      | term (ZClass (T, c)) = ZClass (typ T, c);
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   396
  in term end;
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   397
79270
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   398
fun instantiate_type_same instT =
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   399
  if ZTVars.is_empty instT then Same.same
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   400
  else ZTypes.unsynchronized_cache (subst_type_same (Same.function (ZTVars.lookup instT)));
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   401
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   402
fun instantiate_term_same typ inst =
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   403
  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
   404
79268
154166613b40 tuned comments;
wenzelm
parents: 79266
diff changeset
   405
154166613b40 tuned comments;
wenzelm
parents: 79266
diff changeset
   406
(* map types/terms within proof *)
154166613b40 tuned comments;
wenzelm
parents: 79266
diff changeset
   407
79145
a9c55fef42b0 tuned signature;
wenzelm
parents: 79144
diff changeset
   408
fun map_insts_same typ term (instT, inst) =
a9c55fef42b0 tuned signature;
wenzelm
parents: 79144
diff changeset
   409
  let
a9c55fef42b0 tuned signature;
wenzelm
parents: 79144
diff changeset
   410
    val changed = Unsynchronized.ref false;
79146
feb94ac5df41 more accurate treatment of term variables after instantiation of type variables;
wenzelm
parents: 79145
diff changeset
   411
    fun apply f x =
feb94ac5df41 more accurate treatment of term variables after instantiation of type variables;
wenzelm
parents: 79145
diff changeset
   412
      (case Same.catch f x of
feb94ac5df41 more accurate treatment of term variables after instantiation of type variables;
wenzelm
parents: 79145
diff changeset
   413
        NONE => NONE
feb94ac5df41 more accurate treatment of term variables after instantiation of type variables;
wenzelm
parents: 79145
diff changeset
   414
      | some => (changed := true; some));
feb94ac5df41 more accurate treatment of term variables after instantiation of type variables;
wenzelm
parents: 79145
diff changeset
   415
79145
a9c55fef42b0 tuned signature;
wenzelm
parents: 79144
diff changeset
   416
    val instT' =
a9c55fef42b0 tuned signature;
wenzelm
parents: 79144
diff changeset
   417
      (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
   418
        (case apply typ T of
feb94ac5df41 more accurate treatment of term variables after instantiation of type variables;
wenzelm
parents: 79145
diff changeset
   419
          NONE => I
feb94ac5df41 more accurate treatment of term variables after instantiation of type variables;
wenzelm
parents: 79145
diff changeset
   420
        | SOME T' => ZTVars.update (v, T')));
feb94ac5df41 more accurate treatment of term variables after instantiation of type variables;
wenzelm
parents: 79145
diff changeset
   421
feb94ac5df41 more accurate treatment of term variables after instantiation of type variables;
wenzelm
parents: 79145
diff changeset
   422
    val vars' =
feb94ac5df41 more accurate treatment of term variables after instantiation of type variables;
wenzelm
parents: 79145
diff changeset
   423
      (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
   424
        (case apply typ T of
feb94ac5df41 more accurate treatment of term variables after instantiation of type variables;
wenzelm
parents: 79145
diff changeset
   425
          NONE => I
feb94ac5df41 more accurate treatment of term variables after instantiation of type variables;
wenzelm
parents: 79145
diff changeset
   426
        | 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
   427
79145
a9c55fef42b0 tuned signature;
wenzelm
parents: 79144
diff changeset
   428
    val inst' =
79146
feb94ac5df41 more accurate treatment of term variables after instantiation of type variables;
wenzelm
parents: 79145
diff changeset
   429
      if ZVars.is_empty vars' then
feb94ac5df41 more accurate treatment of term variables after instantiation of type variables;
wenzelm
parents: 79145
diff changeset
   430
        (inst, inst) |-> ZVars.fold (fn (v, t) =>
feb94ac5df41 more accurate treatment of term variables after instantiation of type variables;
wenzelm
parents: 79145
diff changeset
   431
          (case apply term t of
feb94ac5df41 more accurate treatment of term variables after instantiation of type variables;
wenzelm
parents: 79145
diff changeset
   432
            NONE => I
feb94ac5df41 more accurate treatment of term variables after instantiation of type variables;
wenzelm
parents: 79145
diff changeset
   433
          | SOME t' => ZVars.update (v, t')))
feb94ac5df41 more accurate treatment of term variables after instantiation of type variables;
wenzelm
parents: 79145
diff changeset
   434
      else
79145
a9c55fef42b0 tuned signature;
wenzelm
parents: 79144
diff changeset
   435
        ZVars.dest inst
79146
feb94ac5df41 more accurate treatment of term variables after instantiation of type variables;
wenzelm
parents: 79145
diff changeset
   436
        |> map (fn (v, t) => (the_default v (ZVars.lookup vars' v), the_default t (apply term t)))
feb94ac5df41 more accurate treatment of term variables after instantiation of type variables;
wenzelm
parents: 79145
diff changeset
   437
        |> ZVars.make_strict;
79145
a9c55fef42b0 tuned signature;
wenzelm
parents: 79144
diff changeset
   438
  in if ! changed then (instT', inst') else raise Same.SAME end;
a9c55fef42b0 tuned signature;
wenzelm
parents: 79144
diff changeset
   439
79132
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   440
fun map_proof_same typ term =
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   441
  let
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   442
    fun proof ZDummy = raise Same.SAME
79212
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   443
      | proof (ZConstp (a, A, instT, inst)) =
79148
99201e7b1d94 proper treatment of ZConstP: term represents body of closure;
wenzelm
parents: 79147
diff changeset
   444
          let val (instT', inst') = map_insts_same typ term (instT, inst)
79212
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   445
          in ZConstp (a, A, instT', inst') end
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   446
      | proof (ZBoundp _) = raise Same.SAME
79132
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   447
      | proof (ZHyp h) = ZHyp (term h)
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   448
      | proof (ZAbst (a, T, p)) =
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   449
          (ZAbst (a, typ T, Same.commit proof p) handle Same.SAME => ZAbst (a, T, proof p))
79212
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   450
      | proof (ZAbsp (a, t, p)) =
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   451
          (ZAbsp (a, term t, Same.commit proof p) handle Same.SAME => ZAbsp (a, t, proof p))
79132
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   452
      | proof (ZAppt (p, t)) =
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   453
          (ZAppt (proof p, Same.commit term t) handle Same.SAME => ZAppt (p, term t))
79212
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   454
      | proof (ZAppp (p, q)) =
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   455
          (ZAppp (proof p, Same.commit proof q) handle Same.SAME => ZAppp (p, proof q))
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   456
      | proof (ZClassp (T, c)) = ZClassp (typ T, c);
79132
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   457
  in proof end;
6d3322477cfd more operations;
wenzelm
parents: 79128
diff changeset
   458
79273
d1e5f6d1ddca clarified signature;
wenzelm
parents: 79272
diff changeset
   459
fun map_proof typ term = Same.commit (map_proof_same typ term);
d1e5f6d1ddca clarified signature;
wenzelm
parents: 79272
diff changeset
   460
fun map_proof_types typ = map_proof typ (subst_term_same typ Same.same);
79144
wenzelm
parents: 79136
diff changeset
   461
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   462
79098
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   463
(* convert ztyp / zterm vs. regular typ / term *)
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   464
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   465
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
   466
  | ztyp_of (TVar v) = ZTVar v
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   467
  | ztyp_of (Type ("fun", [T, U])) = ZFun (ztyp_of T, ztyp_of U)
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   468
  | ztyp_of (Type (c, [])) = if c = "prop" then ZProp else ZType0 c
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   469
  | ztyp_of (Type (c, [T])) = if c = "itself" then ZItself (ztyp_of T) else ZType1 (c, ztyp_of T)
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   470
  | 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
   471
79163
9ddcaca41ed2 more operations;
wenzelm
parents: 79161
diff changeset
   472
fun ztyp_cache () = Typtab.unsynchronized_cache ztyp_of;
9ddcaca41ed2 more operations;
wenzelm
parents: 79161
diff changeset
   473
79226
0b87e04d0b68 tuned signature;
wenzelm
parents: 79214
diff changeset
   474
fun zterm_cache thy =
79158
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   475
  let
79226
0b87e04d0b68 tuned signature;
wenzelm
parents: 79214
diff changeset
   476
    val typargs = Consts.typargs (Sign.consts_of thy);
79158
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   477
79163
9ddcaca41ed2 more operations;
wenzelm
parents: 79161
diff changeset
   478
    val ztyp = ztyp_cache ();
79158
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   479
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   480
    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
   481
      | zterm (Var (xi, T)) = ZVar (xi, ztyp T)
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   482
      | zterm (Bound i) = ZBound i
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   483
      | zterm (Const (c, T)) =
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   484
          (case typargs (c, T) of
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   485
            [] => ZConst0 c
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   486
          | [T] => ZConst1 (c, ztyp T)
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   487
          | Ts => ZConst (c, map ztyp Ts))
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   488
      | zterm (Abs (a, T, b)) = ZAbs (a, ztyp T, zterm b)
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   489
      | zterm ((t as Const (c, _)) $ (u as Const ("Pure.type", _))) =
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   490
          if String.isSuffix Logic.class_suffix c then
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   491
            ZClass (ztyp (Logic.dest_type u), Logic.class_of_const c)
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   492
          else ZApp (zterm t, zterm u)
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   493
      | zterm (t $ u) = ZApp (zterm t, zterm u);
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   494
  in {ztyp = ztyp, zterm = zterm} end;
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   495
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   496
val zterm_of = #zterm o zterm_cache;
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   497
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   498
fun typ_of (ZTVar ((a, ~1), S)) = TFree (a, S)
79098
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   499
  | typ_of (ZTVar v) = TVar v
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   500
  | typ_of (ZFun (T, U)) = typ_of T --> typ_of U
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   501
  | typ_of ZProp = propT
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   502
  | typ_of (ZItself T) = Term.itselfT (typ_of T)
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   503
  | typ_of (ZType0 c) = Type (c, [])
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   504
  | typ_of (ZType1 (c, T)) = Type (c, [typ_of T])
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   505
  | typ_of (ZType (c, Ts)) = Type (c, map typ_of Ts);
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   506
79201
wenzelm
parents: 79200
diff changeset
   507
fun typ_cache () = ZTypes.unsynchronized_cache typ_of;
wenzelm
parents: 79200
diff changeset
   508
79226
0b87e04d0b68 tuned signature;
wenzelm
parents: 79214
diff changeset
   509
fun term_of thy =
79098
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   510
  let
79226
0b87e04d0b68 tuned signature;
wenzelm
parents: 79214
diff changeset
   511
    val instance = Consts.instance (Sign.consts_of thy);
0b87e04d0b68 tuned signature;
wenzelm
parents: 79214
diff changeset
   512
79098
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   513
    fun const (c, Ts) = Const (c, instance (c, Ts));
79226
0b87e04d0b68 tuned signature;
wenzelm
parents: 79214
diff changeset
   514
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   515
    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
   516
      | term (ZVar (xi, T)) = Var (xi, typ_of T)
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   517
      | term (ZBound i) = Bound i
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   518
      | term (ZConst0 c) = const (c, [])
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   519
      | term (ZConst1 (c, T)) = const (c, [typ_of T])
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   520
      | term (ZConst (c, Ts)) = const (c, map typ_of Ts)
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   521
      | 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
   522
      | term (ZApp (t, u)) = term t $ term u
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   523
      | term (ZClass (T, c)) = Logic.mk_of_class (typ_of T, c);
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   524
  in term end;
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   525
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   526
79200
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   527
(* beta normalization wrt. environment *)
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   528
79214
61af3e917597 more operations;
wenzelm
parents: 79212
diff changeset
   529
fun could_beta_contract (ZApp (ZAbs _, _)) = true
61af3e917597 more operations;
wenzelm
parents: 79212
diff changeset
   530
  | could_beta_contract (ZApp (t, u)) = could_beta_contract t orelse could_beta_contract u
61af3e917597 more operations;
wenzelm
parents: 79212
diff changeset
   531
  | could_beta_contract (ZAbs (_, _, b)) = could_beta_contract b
61af3e917597 more operations;
wenzelm
parents: 79212
diff changeset
   532
  | could_beta_contract _ = false;
61af3e917597 more operations;
wenzelm
parents: 79212
diff changeset
   533
79271
b14b289caaf6 minor performance tuning: more direct beta_norm;
wenzelm
parents: 79270
diff changeset
   534
val beta_norm_same =
b14b289caaf6 minor performance tuning: more direct beta_norm;
wenzelm
parents: 79270
diff changeset
   535
  let
b14b289caaf6 minor performance tuning: more direct beta_norm;
wenzelm
parents: 79270
diff changeset
   536
    fun norm (ZApp (ZAbs (_, _, body), t)) = subst_bound t body
b14b289caaf6 minor performance tuning: more direct beta_norm;
wenzelm
parents: 79270
diff changeset
   537
      | norm (ZApp (f, t)) =
b14b289caaf6 minor performance tuning: more direct beta_norm;
wenzelm
parents: 79270
diff changeset
   538
          ((case norm f of
b14b289caaf6 minor performance tuning: more direct beta_norm;
wenzelm
parents: 79270
diff changeset
   539
             ZAbs (_, _, body) => subst_bound t body
b14b289caaf6 minor performance tuning: more direct beta_norm;
wenzelm
parents: 79270
diff changeset
   540
           | nf => ZApp (nf, Same.commit norm t))
b14b289caaf6 minor performance tuning: more direct beta_norm;
wenzelm
parents: 79270
diff changeset
   541
          handle Same.SAME => ZApp (f, norm t))
b14b289caaf6 minor performance tuning: more direct beta_norm;
wenzelm
parents: 79270
diff changeset
   542
      | norm (ZAbs (a, T, t)) = ZAbs (a, T, Same.commit norm t)
b14b289caaf6 minor performance tuning: more direct beta_norm;
wenzelm
parents: 79270
diff changeset
   543
      | norm _ = raise Same.SAME;
b14b289caaf6 minor performance tuning: more direct beta_norm;
wenzelm
parents: 79270
diff changeset
   544
  in norm end;
b14b289caaf6 minor performance tuning: more direct beta_norm;
wenzelm
parents: 79270
diff changeset
   545
79200
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   546
fun norm_type_same ztyp tyenv =
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   547
  if Vartab.is_empty tyenv then Same.same
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   548
  else
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   549
    let
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   550
      fun norm (ZTVar v) =
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   551
            (case Type.lookup tyenv v of
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   552
              SOME U => Same.commit norm (ztyp U)
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   553
            | NONE => raise Same.SAME)
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   554
        | norm (ZFun (T, U)) =
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   555
            (ZFun (norm T, Same.commit norm U)
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   556
              handle Same.SAME => ZFun (T, norm U))
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   557
        | norm ZProp = raise Same.SAME
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   558
        | norm (ZItself T) = ZItself (norm T)
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   559
        | norm (ZType0 _) = raise Same.SAME
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   560
        | norm (ZType1 (a, T)) = ZType1 (a, norm T)
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   561
        | norm (ZType (a, Ts)) = ZType (a, Same.map norm Ts);
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   562
    in norm end;
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   563
79269
2c65d3356ef9 proper scope of cache (amending 61af3e917597);
wenzelm
parents: 79268
diff changeset
   564
fun norm_term_same {ztyp, zterm, typ} (envir as Envir.Envir {tyenv, tenv, ...}) =
2c65d3356ef9 proper scope of cache (amending 61af3e917597);
wenzelm
parents: 79268
diff changeset
   565
  let
2c65d3356ef9 proper scope of cache (amending 61af3e917597);
wenzelm
parents: 79268
diff changeset
   566
    val lookup =
2c65d3356ef9 proper scope of cache (amending 61af3e917597);
wenzelm
parents: 79268
diff changeset
   567
      if Vartab.is_empty tenv then K NONE
2c65d3356ef9 proper scope of cache (amending 61af3e917597);
wenzelm
parents: 79268
diff changeset
   568
      else ZVars.unsynchronized_cache (apsnd typ #> Envir.lookup envir #> Option.map zterm);
79200
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   569
79269
2c65d3356ef9 proper scope of cache (amending 61af3e917597);
wenzelm
parents: 79268
diff changeset
   570
    val normT = norm_type_same ztyp tyenv;
79200
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   571
79269
2c65d3356ef9 proper scope of cache (amending 61af3e917597);
wenzelm
parents: 79268
diff changeset
   572
    fun norm (ZVar (xi, T)) =
2c65d3356ef9 proper scope of cache (amending 61af3e917597);
wenzelm
parents: 79268
diff changeset
   573
          (case lookup (xi, T) of
2c65d3356ef9 proper scope of cache (amending 61af3e917597);
wenzelm
parents: 79268
diff changeset
   574
            SOME u => Same.commit norm u
2c65d3356ef9 proper scope of cache (amending 61af3e917597);
wenzelm
parents: 79268
diff changeset
   575
          | NONE => ZVar (xi, normT T))
2c65d3356ef9 proper scope of cache (amending 61af3e917597);
wenzelm
parents: 79268
diff changeset
   576
      | norm (ZBound _) = raise Same.SAME
2c65d3356ef9 proper scope of cache (amending 61af3e917597);
wenzelm
parents: 79268
diff changeset
   577
      | norm (ZConst0 _) = raise Same.SAME
2c65d3356ef9 proper scope of cache (amending 61af3e917597);
wenzelm
parents: 79268
diff changeset
   578
      | norm (ZConst1 (a, T)) = ZConst1 (a, normT T)
2c65d3356ef9 proper scope of cache (amending 61af3e917597);
wenzelm
parents: 79268
diff changeset
   579
      | norm (ZConst (a, Ts)) = ZConst (a, Same.map normT Ts)
2c65d3356ef9 proper scope of cache (amending 61af3e917597);
wenzelm
parents: 79268
diff changeset
   580
      | norm (ZAbs (a, T, t)) =
2c65d3356ef9 proper scope of cache (amending 61af3e917597);
wenzelm
parents: 79268
diff changeset
   581
          (ZAbs (a, normT T, Same.commit norm t)
2c65d3356ef9 proper scope of cache (amending 61af3e917597);
wenzelm
parents: 79268
diff changeset
   582
            handle Same.SAME => ZAbs (a, T, norm t))
2c65d3356ef9 proper scope of cache (amending 61af3e917597);
wenzelm
parents: 79268
diff changeset
   583
      | norm (ZApp (ZAbs (_, _, body), t)) = Same.commit norm (subst_bound t body)
2c65d3356ef9 proper scope of cache (amending 61af3e917597);
wenzelm
parents: 79268
diff changeset
   584
      | norm (ZApp (f, t)) =
2c65d3356ef9 proper scope of cache (amending 61af3e917597);
wenzelm
parents: 79268
diff changeset
   585
          ((case norm f of
2c65d3356ef9 proper scope of cache (amending 61af3e917597);
wenzelm
parents: 79268
diff changeset
   586
             ZAbs (_, _, body) => Same.commit norm (subst_bound t body)
2c65d3356ef9 proper scope of cache (amending 61af3e917597);
wenzelm
parents: 79268
diff changeset
   587
           | nf => ZApp (nf, Same.commit norm t))
2c65d3356ef9 proper scope of cache (amending 61af3e917597);
wenzelm
parents: 79268
diff changeset
   588
          handle Same.SAME => ZApp (f, norm t))
2c65d3356ef9 proper scope of cache (amending 61af3e917597);
wenzelm
parents: 79268
diff changeset
   589
      | norm _ = raise Same.SAME;
79271
b14b289caaf6 minor performance tuning: more direct beta_norm;
wenzelm
parents: 79270
diff changeset
   590
  in fn t => if Envir.is_empty envir then beta_norm_same t else norm t end;
79200
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   591
79270
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   592
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
   593
  let
79270
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   594
    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
   595
    val norm_var = ZVar #> Same.commit (norm_term_same cache envir);
79269
2c65d3356ef9 proper scope of cache (amending 61af3e917597);
wenzelm
parents: 79268
diff changeset
   596
  in
79270
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   597
    fn visible => fn prf =>
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   598
      if (Envir.is_empty envir orelse null visible)
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   599
        andalso not (exists_proof_terms could_beta_contract prf)
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   600
      then prf
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   601
      else
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   602
        let
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   603
          fun add_tvar v tab =
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   604
            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
   605
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   606
          val inst_typ =
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   607
            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
   608
            else
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   609
              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
   610
                (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
   611
              |> instantiate_type_same;
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   612
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   613
          fun add_var (a, T) tab =
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   614
            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
   615
            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
   616
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   617
          val inst_term =
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   618
            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
   619
            |> instantiate_term_same inst_typ;
79272
899f37f6d218 proper beta_norm after instantiation (amending 90c5aadcc4b2);
wenzelm
parents: 79271
diff changeset
   620
899f37f6d218 proper beta_norm after instantiation (amending 90c5aadcc4b2);
wenzelm
parents: 79271
diff changeset
   621
          val norm_term = Same.compose beta_norm_same inst_term;
79273
d1e5f6d1ddca clarified signature;
wenzelm
parents: 79272
diff changeset
   622
        in map_proof inst_typ norm_term prf end
79269
2c65d3356ef9 proper scope of cache (amending 61af3e917597);
wenzelm
parents: 79268
diff changeset
   623
  end;
79210
5ed6f16a5f7c clarified signature: support shared cache;
wenzelm
parents: 79205
diff changeset
   624
5ed6f16a5f7c clarified signature: support shared cache;
wenzelm
parents: 79205
diff changeset
   625
fun norm_cache thy =
79205
a159cb82afe7 more operations;
wenzelm
parents: 79204
diff changeset
   626
  let
79226
0b87e04d0b68 tuned signature;
wenzelm
parents: 79214
diff changeset
   627
    val {ztyp, zterm} = zterm_cache thy;
79205
a159cb82afe7 more operations;
wenzelm
parents: 79204
diff changeset
   628
    val typ = typ_cache ();
a159cb82afe7 more operations;
wenzelm
parents: 79204
diff changeset
   629
  in {ztyp = ztyp, zterm = zterm, typ = typ} end;
a159cb82afe7 more operations;
wenzelm
parents: 79204
diff changeset
   630
79214
61af3e917597 more operations;
wenzelm
parents: 79212
diff changeset
   631
fun norm_type tyenv = Same.commit (norm_type_same (ztyp_cache ()) tyenv);
61af3e917597 more operations;
wenzelm
parents: 79212
diff changeset
   632
fun norm_term thy envir = Same.commit (norm_term_same (norm_cache thy) envir);
79270
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   633
fun norm_proof thy envir = norm_proof_cache (norm_cache thy) envir;
79200
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   634
f6bbe80f5f41 more operations;
wenzelm
parents: 79163
diff changeset
   635
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   636
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   637
(** proof construction **)
79113
5109e4b2a292 pro-forma support for optional zproof: no proper content yet;
wenzelm
parents: 79098
diff changeset
   638
79161
3f532c76d0ad tuned structure;
wenzelm
parents: 79160
diff changeset
   639
(* constants *)
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   640
79263
bf2e724ff57e clarified signature;
wenzelm
parents: 79261
diff changeset
   641
type zproof_const = zproof_name * zterm * ztyp ZTVars.table * zterm ZVars.table;
bf2e724ff57e clarified signature;
wenzelm
parents: 79261
diff changeset
   642
bf2e724ff57e clarified signature;
wenzelm
parents: 79261
diff changeset
   643
fun zproof_const a A : zproof_const =
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   644
  let
79154
e47db1e15a22 minor performance tuning;
wenzelm
parents: 79153
diff changeset
   645
    val instT =
79263
bf2e724ff57e clarified signature;
wenzelm
parents: 79261
diff changeset
   646
      ZTVars.build (A |> (fold_types o fold_tvars) (fn v => fn tab =>
79154
e47db1e15a22 minor performance tuning;
wenzelm
parents: 79153
diff changeset
   647
        if ZTVars.defined tab v then tab else ZTVars.update (v, ZTVar v) tab));
e47db1e15a22 minor performance tuning;
wenzelm
parents: 79153
diff changeset
   648
    val inst =
79263
bf2e724ff57e clarified signature;
wenzelm
parents: 79261
diff changeset
   649
      ZVars.build (A |> fold_aterms (fn t => fn tab =>
bf2e724ff57e clarified signature;
wenzelm
parents: 79261
diff changeset
   650
        (case t of
bf2e724ff57e clarified signature;
wenzelm
parents: 79261
diff changeset
   651
          ZVar v => if ZVars.defined tab v then tab else ZVars.update (v, t) tab
79154
e47db1e15a22 minor performance tuning;
wenzelm
parents: 79153
diff changeset
   652
        | _ => tab)));
79263
bf2e724ff57e clarified signature;
wenzelm
parents: 79261
diff changeset
   653
  in (a, A, instT, inst) end;
79126
bdb33a2d4167 clarified const_proof vs. zproof_name;
wenzelm
parents: 79124
diff changeset
   654
79263
bf2e724ff57e clarified signature;
wenzelm
parents: 79261
diff changeset
   655
fun make_const_proof (f, g) ((a, A, instT, inst): zproof_const) =
bf2e724ff57e clarified signature;
wenzelm
parents: 79261
diff changeset
   656
  let
bf2e724ff57e clarified signature;
wenzelm
parents: 79261
diff changeset
   657
    val instT' = ZTVars.map (fn ((x, _), _) => fn y => the_default y (try f x)) instT;
bf2e724ff57e clarified signature;
wenzelm
parents: 79261
diff changeset
   658
    val inst' = ZVars.map (fn ((x, _), _) => fn y => the_default y (try g x)) inst;
bf2e724ff57e clarified signature;
wenzelm
parents: 79261
diff changeset
   659
  in ZConstp (a, A, instT', inst') end;
79161
3f532c76d0ad tuned structure;
wenzelm
parents: 79160
diff changeset
   660
3f532c76d0ad tuned structure;
wenzelm
parents: 79160
diff changeset
   661
79265
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   662
(* closed proof boxes *)
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   663
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   664
type zboxes = (zterm * zproof future) Inttab.table;
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   665
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   666
val empty_zboxes: zboxes = Inttab.empty;
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   667
val union_zboxes: zboxes -> zboxes -> zboxes = curry (Inttab.merge (K true));
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   668
fun add_zboxes entry : zboxes -> zboxes = Inttab.update_new entry;
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   669
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   670
local
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   671
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   672
fun close_prop hyps concl =
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   673
  fold_rev (fn A => fn B => ZApp (ZApp (ZConst0 "Pure.imp", A), B)) hyps concl;
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   674
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   675
fun close_proof hyps prf =
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   676
  let
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   677
    val m = length hyps - 1;
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   678
    val bounds = ZTerms.build (hyps |> fold_index (fn (i, h) => ZTerms.update (h, m - i)));
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   679
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   680
    fun proof lev (ZHyp t) =
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   681
          (case ZTerms.lookup bounds t of
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   682
            SOME i => ZBoundp (lev + i)
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   683
          | NONE => raise ZTERM ("Unbound proof hypothesis", [], [t], []))
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   684
      | proof lev (ZAbst (x, T, p)) = ZAbst (x, T, proof lev p)
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   685
      | proof lev (ZAbsp (x, t, p)) = ZAbsp (x, t, proof (lev + 1) p)
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   686
      | proof lev (ZAppt (p, t)) = ZAppt (proof lev p, t)
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   687
      | proof lev (ZAppp (p, q)) =
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   688
          (ZAppp (proof lev p, Same.commit (proof lev) q) handle Same.SAME =>
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   689
            ZAppp (p, proof lev q))
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   690
      | proof _ _ = raise Same.SAME;
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   691
  in ZAbsps hyps (Same.commit (proof 0) prf) end;
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   692
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   693
in
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   694
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   695
fun box_proof thy hyps concl (zboxes: zboxes, prf) =
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   696
  let
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   697
    val {zterm, ...} = zterm_cache thy;
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   698
    val hyps' = map zterm hyps;
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   699
    val concl' = zterm concl;
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   700
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   701
    val prop' = close_prop hyps' concl';
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   702
    val prf' = close_proof hyps' prf;
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   703
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   704
    val i = serial ();
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   705
    val zboxes' = add_zboxes (i, (prop', Future.value prf')) zboxes;
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   706
    val prf'' = ZAppts (ZConstp (zproof_const (ZBox i) prop'), hyps');
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   707
  in (zboxes', prf'') end;
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   708
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   709
end;
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   710
3c194f50beef more zproofs;
wenzelm
parents: 79264
diff changeset
   711
79161
3f532c76d0ad tuned structure;
wenzelm
parents: 79160
diff changeset
   712
(* basic logic *)
3f532c76d0ad tuned structure;
wenzelm
parents: 79160
diff changeset
   713
79263
bf2e724ff57e clarified signature;
wenzelm
parents: 79261
diff changeset
   714
fun axiom_proof thy name A =
bf2e724ff57e clarified signature;
wenzelm
parents: 79261
diff changeset
   715
  ZConstp (zproof_const (ZAxiom name) (zterm_of thy A));
79161
3f532c76d0ad tuned structure;
wenzelm
parents: 79160
diff changeset
   716
79263
bf2e724ff57e clarified signature;
wenzelm
parents: 79261
diff changeset
   717
fun oracle_proof thy name A =
bf2e724ff57e clarified signature;
wenzelm
parents: 79261
diff changeset
   718
  ZConstp (zproof_const (ZOracle name) (zterm_of thy A));
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   719
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   720
fun assume_proof thy A =
79158
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   721
  ZHyp (zterm_of thy A);
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   722
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   723
fun trivial_proof thy A =
79212
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   724
  ZAbsp ("H", zterm_of thy A, ZBoundp 0);
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   725
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   726
fun implies_intr_proof thy A prf =
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   727
  let
79158
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   728
    val h = zterm_of thy A;
79212
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   729
    fun proof i (ZHyp t) = if aconv_zterm (h, t) then ZBoundp i else raise Same.SAME
79157
00962876301c tuned names;
wenzelm
parents: 79156
diff changeset
   730
      | proof i (ZAbst (x, T, p)) = ZAbst (x, T, proof i p)
79212
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   731
      | proof i (ZAbsp (x, t, p)) = ZAbsp (x, t, proof (i + 1) p)
79157
00962876301c tuned names;
wenzelm
parents: 79156
diff changeset
   732
      | proof i (ZAppt (p, t)) = ZAppt (proof i p, t)
79212
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   733
      | proof i (ZAppp (p, q)) =
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   734
          (ZAppp (proof i p, Same.commit (proof i) q) handle Same.SAME =>
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   735
            ZAppp (p, proof i q))
79157
00962876301c tuned names;
wenzelm
parents: 79156
diff changeset
   736
      | proof _ _ = raise Same.SAME;
79212
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   737
  in ZAbsp ("H", h, Same.commit (proof 0) prf) end;
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   738
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   739
fun forall_intr_proof thy T (a, x) prf =
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   740
  let
79158
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   741
    val {ztyp, zterm} = zterm_cache thy;
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   742
    val Z = ztyp T;
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   743
    val z = zterm x;
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   744
79157
00962876301c tuned names;
wenzelm
parents: 79156
diff changeset
   745
    fun term i b =
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   746
      if aconv_zterm (b, z) then ZBound i
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   747
      else
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   748
        (case b of
79157
00962876301c tuned names;
wenzelm
parents: 79156
diff changeset
   749
          ZAbs (x, T, t) => ZAbs (x, T, term (i + 1) t)
79156
3b272da1d165 minor performance tuning;
wenzelm
parents: 79155
diff changeset
   750
        | ZApp (t, u) =>
79157
00962876301c tuned names;
wenzelm
parents: 79156
diff changeset
   751
            (ZApp (term i t, Same.commit (term i) u) handle Same.SAME =>
00962876301c tuned names;
wenzelm
parents: 79156
diff changeset
   752
              ZApp (t, term i u))
79156
3b272da1d165 minor performance tuning;
wenzelm
parents: 79155
diff changeset
   753
        | _ => raise Same.SAME);
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   754
79157
00962876301c tuned names;
wenzelm
parents: 79156
diff changeset
   755
    fun proof i (ZAbst (x, T, prf)) = ZAbst (x, T, proof (i + 1) prf)
79212
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   756
      | proof i (ZAbsp (x, t, prf)) =
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   757
          (ZAbsp (x, term i t, Same.commit (proof i) prf) handle Same.SAME =>
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   758
            ZAbsp (x, t, proof i prf))
79157
00962876301c tuned names;
wenzelm
parents: 79156
diff changeset
   759
      | proof i (ZAppt (p, t)) =
00962876301c tuned names;
wenzelm
parents: 79156
diff changeset
   760
          (ZAppt (proof i p, Same.commit (term i) t) handle Same.SAME =>
00962876301c tuned names;
wenzelm
parents: 79156
diff changeset
   761
            ZAppt (p, term i t))
79212
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   762
      | proof i (ZAppp (p, q)) =
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   763
          (ZAppp (proof i p, Same.commit (proof i) q) handle Same.SAME =>
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   764
            ZAppp (p, proof i q))
79157
00962876301c tuned names;
wenzelm
parents: 79156
diff changeset
   765
      | proof _ _ = raise Same.SAME;
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   766
79157
00962876301c tuned names;
wenzelm
parents: 79156
diff changeset
   767
  in ZAbst (a, Z, Same.commit (proof 0) prf) end;
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   768
79158
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   769
fun forall_elim_proof thy t p = ZAppt (p, zterm_of thy t);
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   770
79212
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   771
fun of_class_proof (T, c) = ZClassp (ztyp_of T, c);
79128
b6f5d4392388 more zproofs;
wenzelm
parents: 79126
diff changeset
   772
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   773
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   774
(* equality *)
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   775
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   776
local
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   777
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   778
val thy0 =
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   779
  Context.the_global_context ()
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   780
  |> Sign.add_types_global [(Binding.name "fun", 2, NoSyn), (Binding.name "prop", 0, NoSyn)]
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   781
  |> Sign.local_path
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   782
  |> Sign.add_consts
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   783
   [(Binding.name "all", (Term.aT [] --> propT) --> propT, NoSyn),
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   784
    (Binding.name "imp", propT --> propT --> propT, NoSyn),
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   785
    (Binding.name "eq", Term.aT [] --> Term.aT [] --> propT, NoSyn)];
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   786
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   787
val [reflexive_axiom, symmetric_axiom, transitive_axiom, equal_intr_axiom, equal_elim_axiom,
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   788
  abstract_rule_axiom, combination_axiom] =
79263
bf2e724ff57e clarified signature;
wenzelm
parents: 79261
diff changeset
   789
    Theory.equality_axioms |> map (fn (b, t) =>
bf2e724ff57e clarified signature;
wenzelm
parents: 79261
diff changeset
   790
      let val ZConstp c = axiom_proof thy0 (Sign.full_name thy0 b) t in c end);
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   791
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   792
in
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   793
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   794
val is_reflexive_proof =
79212
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   795
  fn ZConstp (ZAxiom "Pure.reflexive", _, _, _) => true | _ => false;
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   796
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   797
fun reflexive_proof thy T t =
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   798
  let
79158
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   799
    val {ztyp, zterm} = zterm_cache thy;
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   800
    val A = ztyp T;
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   801
    val x = zterm t;
79263
bf2e724ff57e clarified signature;
wenzelm
parents: 79261
diff changeset
   802
  in make_const_proof (fn "'a" => A, fn "x" => x) reflexive_axiom end;
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   803
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   804
fun symmetric_proof thy T t u prf =
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   805
  if is_reflexive_proof prf then prf
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   806
  else
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   807
    let
79158
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   808
      val {ztyp, zterm} = zterm_cache thy;
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   809
      val A = ztyp T;
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   810
      val x = zterm t;
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   811
      val y = zterm u;
79263
bf2e724ff57e clarified signature;
wenzelm
parents: 79261
diff changeset
   812
      val ax = make_const_proof (fn "'a" => A, fn "x" => x | "y" => y) symmetric_axiom;
79212
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   813
    in ZAppp (ax, prf) end;
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   814
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   815
fun transitive_proof thy T t u v prf1 prf2 =
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   816
  if is_reflexive_proof prf1 then prf2
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   817
  else if is_reflexive_proof prf2 then prf1
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   818
  else
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   819
    let
79158
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   820
      val {ztyp, zterm} = zterm_cache thy;
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   821
      val A = ztyp T;
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   822
      val x = zterm t;
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   823
      val y = zterm u;
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   824
      val z = zterm v;
79263
bf2e724ff57e clarified signature;
wenzelm
parents: 79261
diff changeset
   825
      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
   826
    in ZAppp (ZAppp (ax, prf1), prf2) end;
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   827
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   828
fun equal_intr_proof thy t u prf1 prf2 =
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   829
  let
79160
wenzelm
parents: 79158
diff changeset
   830
    val {zterm, ...} = zterm_cache thy;
79158
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   831
    val A = zterm t;
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   832
    val B = zterm u;
79263
bf2e724ff57e clarified signature;
wenzelm
parents: 79261
diff changeset
   833
    val ax = make_const_proof (undefined, fn "A" => A | "B" => B) equal_intr_axiom;
79212
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   834
  in ZAppp (ZAppp (ax, prf1), prf2) end;
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   835
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   836
fun equal_elim_proof thy t u prf1 prf2 =
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   837
  let
79160
wenzelm
parents: 79158
diff changeset
   838
    val {zterm, ...} = zterm_cache thy;
79158
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   839
    val A = zterm t;
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   840
    val B = zterm u;
79263
bf2e724ff57e clarified signature;
wenzelm
parents: 79261
diff changeset
   841
    val ax = make_const_proof (undefined, fn "A" => A | "B" => B) equal_elim_axiom;
79212
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   842
  in ZAppp (ZAppp (ax, prf1), prf2) end;
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   843
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   844
fun abstract_rule_proof thy T U x t u prf =
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   845
  let
79158
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   846
    val {ztyp, zterm} = zterm_cache thy;
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   847
    val A = ztyp T;
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   848
    val B = ztyp U;
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   849
    val f = zterm t;
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   850
    val g = zterm u;
79126
bdb33a2d4167 clarified const_proof vs. zproof_name;
wenzelm
parents: 79124
diff changeset
   851
    val ax =
79263
bf2e724ff57e clarified signature;
wenzelm
parents: 79261
diff changeset
   852
      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
   853
        abstract_rule_axiom;
79212
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   854
  in ZAppp (ax, forall_intr_proof thy T x prf) end;
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   855
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   856
fun combination_proof thy T U f g t u prf1 prf2 =
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   857
  let
79158
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   858
    val {ztyp, zterm} = zterm_cache thy;
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   859
    val A = ztyp T;
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   860
    val B = ztyp U;
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   861
    val f' = zterm f;
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   862
    val g' = zterm g;
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   863
    val x = zterm t;
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   864
    val y = zterm u;
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   865
    val ax =
79263
bf2e724ff57e clarified signature;
wenzelm
parents: 79261
diff changeset
   866
      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
   867
        combination_axiom;
79212
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   868
  in ZAppp (ZAppp (ax, prf1), prf2) end;
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   869
79098
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   870
end;
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   871
79133
cfe995369655 more zproofs;
wenzelm
parents: 79132
diff changeset
   872
cfe995369655 more zproofs;
wenzelm
parents: 79132
diff changeset
   873
(* substitution *)
cfe995369655 more zproofs;
wenzelm
parents: 79132
diff changeset
   874
cfe995369655 more zproofs;
wenzelm
parents: 79132
diff changeset
   875
fun generalize_proof (tfrees, frees) idx prf =
cfe995369655 more zproofs;
wenzelm
parents: 79132
diff changeset
   876
  let
cfe995369655 more zproofs;
wenzelm
parents: 79132
diff changeset
   877
    val typ =
cfe995369655 more zproofs;
wenzelm
parents: 79132
diff changeset
   878
      if Names.is_empty tfrees then Same.same else
79163
9ddcaca41ed2 more operations;
wenzelm
parents: 79161
diff changeset
   879
        ZTypes.unsynchronized_cache
9ddcaca41ed2 more operations;
wenzelm
parents: 79161
diff changeset
   880
          (subst_type_same (fn ((a, i), S) =>
9ddcaca41ed2 more operations;
wenzelm
parents: 79161
diff changeset
   881
            if i = ~1 andalso Names.defined tfrees a then ZTVar ((a, idx), S)
9ddcaca41ed2 more operations;
wenzelm
parents: 79161
diff changeset
   882
            else raise Same.SAME));
79136
wenzelm
parents: 79135
diff changeset
   883
    val term =
79147
bfe5c20074e4 proper substitution of types within term;
wenzelm
parents: 79146
diff changeset
   884
      subst_term_same typ (fn ((x, i), T) =>
bfe5c20074e4 proper substitution of types within term;
wenzelm
parents: 79146
diff changeset
   885
        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
   886
        else raise Same.SAME);
79273
d1e5f6d1ddca clarified signature;
wenzelm
parents: 79272
diff changeset
   887
  in map_proof typ term prf end;
79133
cfe995369655 more zproofs;
wenzelm
parents: 79132
diff changeset
   888
79149
810679c5ed3c more zproofs;
wenzelm
parents: 79148
diff changeset
   889
fun instantiate_proof thy (Ts, ts) prf =
810679c5ed3c more zproofs;
wenzelm
parents: 79148
diff changeset
   890
  let
79158
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   891
    val {ztyp, zterm} = zterm_cache thy;
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   892
    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
   893
    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
   894
    val typ = instantiate_type_same instT;
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
   895
    val term = instantiate_term_same typ inst;
79273
d1e5f6d1ddca clarified signature;
wenzelm
parents: 79272
diff changeset
   896
  in map_proof typ term prf end;
79149
810679c5ed3c more zproofs;
wenzelm
parents: 79148
diff changeset
   897
79135
db2dc7634d62 more zproofs;
wenzelm
parents: 79133
diff changeset
   898
fun varifyT_proof names prf =
db2dc7634d62 more zproofs;
wenzelm
parents: 79133
diff changeset
   899
  if null names then prf
db2dc7634d62 more zproofs;
wenzelm
parents: 79133
diff changeset
   900
  else
db2dc7634d62 more zproofs;
wenzelm
parents: 79133
diff changeset
   901
    let
db2dc7634d62 more zproofs;
wenzelm
parents: 79133
diff changeset
   902
      val tab = ZTVars.build (names |> fold (fn ((a, S), b) => ZTVars.add (((a, ~1), S), b)));
79136
wenzelm
parents: 79135
diff changeset
   903
      val typ =
79163
9ddcaca41ed2 more operations;
wenzelm
parents: 79161
diff changeset
   904
        ZTypes.unsynchronized_cache (subst_type_same (fn v =>
79136
wenzelm
parents: 79135
diff changeset
   905
          (case ZTVars.lookup tab v of
wenzelm
parents: 79135
diff changeset
   906
            NONE => raise Same.SAME
79163
9ddcaca41ed2 more operations;
wenzelm
parents: 79161
diff changeset
   907
          | SOME w => ZTVar w)));
79273
d1e5f6d1ddca clarified signature;
wenzelm
parents: 79272
diff changeset
   908
    in map_proof_types typ prf end;
79135
db2dc7634d62 more zproofs;
wenzelm
parents: 79133
diff changeset
   909
79152
4189e10f1524 more zproofs;
wenzelm
parents: 79150
diff changeset
   910
fun legacy_freezeT_proof t prf =
4189e10f1524 more zproofs;
wenzelm
parents: 79150
diff changeset
   911
  (case Type.legacy_freezeT t of
4189e10f1524 more zproofs;
wenzelm
parents: 79150
diff changeset
   912
    NONE => prf
4189e10f1524 more zproofs;
wenzelm
parents: 79150
diff changeset
   913
  | SOME f =>
4189e10f1524 more zproofs;
wenzelm
parents: 79150
diff changeset
   914
      let
4189e10f1524 more zproofs;
wenzelm
parents: 79150
diff changeset
   915
        val tvar = ztyp_of o Same.function f;
79163
9ddcaca41ed2 more operations;
wenzelm
parents: 79161
diff changeset
   916
        val typ = ZTypes.unsynchronized_cache (subst_type_same tvar);
79273
d1e5f6d1ddca clarified signature;
wenzelm
parents: 79272
diff changeset
   917
      in map_proof_types typ prf end);
79152
4189e10f1524 more zproofs;
wenzelm
parents: 79150
diff changeset
   918
79155
53288743c2f0 more zproofs;
wenzelm
parents: 79154
diff changeset
   919
53288743c2f0 more zproofs;
wenzelm
parents: 79154
diff changeset
   920
(* permutations *)
53288743c2f0 more zproofs;
wenzelm
parents: 79154
diff changeset
   921
53288743c2f0 more zproofs;
wenzelm
parents: 79154
diff changeset
   922
fun rotate_proof thy Bs Bi' params asms m prf =
53288743c2f0 more zproofs;
wenzelm
parents: 79154
diff changeset
   923
  let
79158
3c7ab17380a8 performance tuning: cache for ztyp_of within zterm_of;
wenzelm
parents: 79157
diff changeset
   924
    val {ztyp, zterm} = zterm_cache thy;
79155
53288743c2f0 more zproofs;
wenzelm
parents: 79154
diff changeset
   925
    val i = length asms;
53288743c2f0 more zproofs;
wenzelm
parents: 79154
diff changeset
   926
    val j = length Bs;
53288743c2f0 more zproofs;
wenzelm
parents: 79154
diff changeset
   927
  in
79212
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   928
    ZAbsps (map zterm Bs @ [zterm Bi']) (ZAppps (prf, map ZBoundp
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   929
      (j downto 1) @ [ZAbsts (map (apsnd ztyp) params) (ZAbsps (map zterm asms)
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   930
        (ZAppps (ZAppts (ZBoundp i, map ZBound ((length params - 1) downto 0)),
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   931
          map ZBoundp (((i-m-1) downto 0) @ ((i-1) downto (i-m))))))]))
79155
53288743c2f0 more zproofs;
wenzelm
parents: 79154
diff changeset
   932
  end;
53288743c2f0 more zproofs;
wenzelm
parents: 79154
diff changeset
   933
53288743c2f0 more zproofs;
wenzelm
parents: 79154
diff changeset
   934
fun permute_prems_proof thy prems' j k prf =
53288743c2f0 more zproofs;
wenzelm
parents: 79154
diff changeset
   935
  let
79160
wenzelm
parents: 79158
diff changeset
   936
    val {zterm, ...} = zterm_cache thy;
79155
53288743c2f0 more zproofs;
wenzelm
parents: 79154
diff changeset
   937
    val n = length prems';
53288743c2f0 more zproofs;
wenzelm
parents: 79154
diff changeset
   938
  in
79212
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   939
    ZAbsps (map zterm prems')
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
   940
      (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
   941
  end;
53288743c2f0 more zproofs;
wenzelm
parents: 79154
diff changeset
   942
79211
35ead2206eb1 more zproofs;
wenzelm
parents: 79210
diff changeset
   943
79234
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   944
(* lifting *)
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   945
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   946
fun incr_tvar_same inc =
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   947
  if inc = 0 then Same.same
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   948
  else
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   949
    let fun tvar ((a, i), S) = if i >= 0 then ZTVar ((a, i + inc), S) else raise Same.SAME
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   950
    in ZTypes.unsynchronized_cache (subst_type_same tvar) end;
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   951
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   952
fun incr_indexes_proof inc prf =
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   953
  let
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   954
    val typ = incr_tvar_same inc;
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   955
    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
   956
    val term = subst_term_same typ var;
79273
d1e5f6d1ddca clarified signature;
wenzelm
parents: 79272
diff changeset
   957
  in map_proof typ term prf end;
79234
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   958
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   959
fun lift_proof thy gprop inc prems prf =
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   960
  let
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   961
    val {ztyp, zterm} = zterm_cache thy;
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   962
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   963
    val typ = incr_tvar_same inc;
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   964
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   965
    fun term Ts lev =
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   966
      if null Ts andalso inc = 0 then Same.same
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   967
      else
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   968
        let
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   969
          val n = length Ts;
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   970
          fun incr lev (ZVar ((x, i), T)) =
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   971
                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
   972
                else raise Same.SAME
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   973
            | incr _ (ZBound _) = raise Same.SAME
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   974
            | incr _ (ZConst0 _) = raise Same.SAME
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   975
            | incr _ (ZConst1 (c, T)) = ZConst1 (c, typ T)
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   976
            | incr _ (ZConst (c, Ts)) = ZConst (c, Same.map typ Ts)
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   977
            | incr lev (ZAbs (x, T, t)) =
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   978
                (ZAbs (x, typ T, Same.commit (incr (lev + 1)) t)
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   979
                  handle Same.SAME => ZAbs (x, T, incr (lev + 1) t))
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   980
            | incr lev (ZApp (t, u)) =
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   981
                (ZApp (incr lev t, Same.commit (incr lev) u)
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   982
                  handle Same.SAME => ZApp (t, incr lev u))
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   983
            | incr _ (ZClass (T, c)) = ZClass (typ T, c);
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   984
        in incr lev end;
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   985
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   986
    fun proof Ts lev (ZAbst (a, T, p)) =
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   987
          (ZAbst (a, typ T, Same.commit (proof Ts (lev + 1)) p)
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   988
            handle Same.SAME => ZAbst (a, T, proof Ts (lev + 1) p))
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   989
      | proof Ts lev (ZAbsp (a, t, p)) =
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   990
          (ZAbsp (a, term Ts lev t, Same.commit (proof Ts lev) p)
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   991
            handle Same.SAME => ZAbsp (a, t, proof Ts lev p))
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   992
      | proof Ts lev (ZAppt (p, t)) =
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   993
          (ZAppt (proof Ts lev p, Same.commit (term Ts lev) t)
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   994
            handle Same.SAME => ZAppt (p, term Ts lev t))
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   995
      | proof Ts lev (ZAppp (p, q)) =
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   996
          (ZAppp (proof Ts lev p, Same.commit (proof Ts lev) q)
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   997
            handle Same.SAME => ZAppp (p, proof Ts lev q))
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   998
      | proof Ts lev (ZConstp (a, A, instT, inst)) =
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
   999
          let val (instT', insts') = map_insts_same typ (term Ts lev) (instT, inst)
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1000
          in ZConstp (a, A, instT', insts') end
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1001
      | proof _ _ (ZClassp (T, c)) = ZClassp (typ T, c)
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1002
      | proof _ _ _ = raise Same.SAME;
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1003
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1004
    val k = length prems;
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1005
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1006
    fun mk_app b (i, j, p) =
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1007
      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
  1008
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1009
    fun lift Ts bs i j (Const ("Pure.imp", _) $ A $ B) =
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1010
          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
  1011
      | lift Ts bs i j (Const ("Pure.all", _) $ Abs (a, T, t)) =
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1012
          let val T' = ztyp T
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1013
          in ZAbst (a, T', lift (T' :: Ts) (false :: bs) i (j + 1) t) end
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1014
      | lift Ts bs i j _ =
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1015
          ZAppps (Same.commit (proof (rev Ts) 0) prf,
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1016
            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
  1017
  in ZAbsps (map zterm prems) (lift [] [] 0 0 gprop) end;
79234
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1018
4a1a25bdf81d more zproofs;
wenzelm
parents: 79226
diff changeset
  1019
79211
35ead2206eb1 more zproofs;
wenzelm
parents: 79210
diff changeset
  1020
(* higher-order resolution *)
35ead2206eb1 more zproofs;
wenzelm
parents: 79210
diff changeset
  1021
35ead2206eb1 more zproofs;
wenzelm
parents: 79210
diff changeset
  1022
fun mk_asm_prf C i m =
35ead2206eb1 more zproofs;
wenzelm
parents: 79210
diff changeset
  1023
  let
79212
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
  1024
    fun imp _ i 0 = ZBoundp i
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
  1025
      | 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
  1026
      | imp _ i _ = ZBoundp i;
79211
35ead2206eb1 more zproofs;
wenzelm
parents: 79210
diff changeset
  1027
    fun all (ZApp (ZConst1 ("Pure.all", _), ZAbs (a, T, t))) = ZAbst (a, T, all t)
35ead2206eb1 more zproofs;
wenzelm
parents: 79210
diff changeset
  1028
      | all t = imp t (~ i) m
35ead2206eb1 more zproofs;
wenzelm
parents: 79210
diff changeset
  1029
  in all C end;
35ead2206eb1 more zproofs;
wenzelm
parents: 79210
diff changeset
  1030
79270
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
  1031
fun assumption_proof thy envir Bs Bi n visible prf =
79211
35ead2206eb1 more zproofs;
wenzelm
parents: 79210
diff changeset
  1032
  let
35ead2206eb1 more zproofs;
wenzelm
parents: 79210
diff changeset
  1033
    val cache as {zterm, ...} = norm_cache thy;
35ead2206eb1 more zproofs;
wenzelm
parents: 79210
diff changeset
  1034
    val normt = zterm #> Same.commit (norm_term_same cache envir);
35ead2206eb1 more zproofs;
wenzelm
parents: 79210
diff changeset
  1035
  in
79212
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
  1036
    ZAbsps (map normt Bs)
601aa36071ba clarified signature;
wenzelm
parents: 79211
diff changeset
  1037
      (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
  1038
    |> norm_proof_cache cache envir visible
79211
35ead2206eb1 more zproofs;
wenzelm
parents: 79210
diff changeset
  1039
  end;
35ead2206eb1 more zproofs;
wenzelm
parents: 79210
diff changeset
  1040
79261
2e6fcc331f10 more zproofs;
wenzelm
parents: 79259
diff changeset
  1041
fun flatten_params_proof i j n (ZApp (ZApp (ZConst0 "Pure.imp", A), B), k) =
2e6fcc331f10 more zproofs;
wenzelm
parents: 79259
diff changeset
  1042
      ZAbsp ("H", A, flatten_params_proof (i + 1) j n (B, k))
2e6fcc331f10 more zproofs;
wenzelm
parents: 79259
diff changeset
  1043
  | flatten_params_proof i j n (ZApp (ZConst1 ("Pure.all", _), ZAbs (a, T, t)), k) =
2e6fcc331f10 more zproofs;
wenzelm
parents: 79259
diff changeset
  1044
      ZAbst (a, T, flatten_params_proof i (j + 1) n (t, k))
2e6fcc331f10 more zproofs;
wenzelm
parents: 79259
diff changeset
  1045
  | flatten_params_proof i j n (_, k) =
2e6fcc331f10 more zproofs;
wenzelm
parents: 79259
diff changeset
  1046
      ZAppps (ZAppts (ZBoundp (k + i),
2e6fcc331f10 more zproofs;
wenzelm
parents: 79259
diff changeset
  1047
        map ZBound (j - 1 downto 0)), map ZBoundp (remove (op =) (i - n) (i - 1 downto 0)));
2e6fcc331f10 more zproofs;
wenzelm
parents: 79259
diff changeset
  1048
79270
90c5aadcc4b2 more robust norm_proof: turn env into instantiation, based on visible statement;
wenzelm
parents: 79269
diff changeset
  1049
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
  1050
  let
2e6fcc331f10 more zproofs;
wenzelm
parents: 79259
diff changeset
  1051
    val cache as {zterm, ...} = norm_cache thy;
2e6fcc331f10 more zproofs;
wenzelm
parents: 79259
diff changeset
  1052
    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
  1053
    val normp = norm_proof_cache cache env visible;
79261
2e6fcc331f10 more zproofs;
wenzelm
parents: 79259
diff changeset
  1054
2e6fcc331f10 more zproofs;
wenzelm
parents: 79259
diff changeset
  1055
    val lb = length Bs;
2e6fcc331f10 more zproofs;
wenzelm
parents: 79259
diff changeset
  1056
    val la = length As;
2e6fcc331f10 more zproofs;
wenzelm
parents: 79259
diff changeset
  1057
2e6fcc331f10 more zproofs;
wenzelm
parents: 79259
diff changeset
  1058
    fun proof p q =
2e6fcc331f10 more zproofs;
wenzelm
parents: 79259
diff changeset
  1059
      ZAbsps (map normt (Bs @ As))
2e6fcc331f10 more zproofs;
wenzelm
parents: 79259
diff changeset
  1060
        (ZAppp (ZAppps (q, map ZBoundp (lb + la - 1 downto la)),
2e6fcc331f10 more zproofs;
wenzelm
parents: 79259
diff changeset
  1061
          ZAppps (p, (if n > 0 then [mk_asm_prf (normt (the A)) n m] else []) @
2e6fcc331f10 more zproofs;
wenzelm
parents: 79259
diff changeset
  1062
            map (if flatten then flatten_params_proof 0 0 n else ZBoundp o snd)
2e6fcc331f10 more zproofs;
wenzelm
parents: 79259
diff changeset
  1063
              (map normt oldAs ~~ (la - 1 downto 0)))));
2e6fcc331f10 more zproofs;
wenzelm
parents: 79259
diff changeset
  1064
  in
2e6fcc331f10 more zproofs;
wenzelm
parents: 79259
diff changeset
  1065
    if Envir.is_empty env then proof rprf sprf
2e6fcc331f10 more zproofs;
wenzelm
parents: 79259
diff changeset
  1066
    else proof (normp rprf) (if Envir.above env smax then sprf else normp sprf)
2e6fcc331f10 more zproofs;
wenzelm
parents: 79259
diff changeset
  1067
  end;
2e6fcc331f10 more zproofs;
wenzelm
parents: 79259
diff changeset
  1068
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
  1069
end;