src/Pure/zterm.ML
author wenzelm
Tue, 05 Dec 2023 11:37:24 +0100
changeset 79128 b6f5d4392388
parent 79126 bdb33a2d4167
child 79132 6d3322477cfd
permissions -rw-r--r--
more zproofs;
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
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
    55
(* 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
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
    91
end;
79098
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
    92
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
    93
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
    94
(* term items *)
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
    95
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
    96
structure ZTVars:
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
    97
sig
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
    98
  include TERM_ITEMS
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
    99
  val add_tvarsT: ztyp -> set -> set
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   100
  val add_tvars: zterm -> set -> set
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   101
end =
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   102
struct
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   103
  open TVars;
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   104
  val add_tvarsT = ZTerm.fold_tvars add_set;
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   105
  val add_tvars = ZTerm.fold_types add_tvarsT;
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   106
end;
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   107
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   108
structure ZVars:
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   109
sig
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   110
  include TERM_ITEMS
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   111
  val add_vars: zterm -> set -> set
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   112
end =
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   113
struct
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   114
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   115
structure Term_Items = Term_Items
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   116
(
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   117
  type key = indexname * ztyp;
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   118
  val ord = pointer_eq_ord (prod_ord Term_Ord.fast_indexname_ord ZTerm.ztyp_ord);
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   119
);
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   120
open Term_Items;
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   121
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   122
val add_vars = ZTerm.fold_aterms (fn ZVar v => add_set v | _ => I);
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   123
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   124
end;
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   125
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   126
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   127
(* proofs *)
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   128
79126
bdb33a2d4167 clarified const_proof vs. zproof_name;
wenzelm
parents: 79124
diff changeset
   129
datatype zproof_name =
bdb33a2d4167 clarified const_proof vs. zproof_name;
wenzelm
parents: 79124
diff changeset
   130
    ZAxiom of string
bdb33a2d4167 clarified const_proof vs. zproof_name;
wenzelm
parents: 79124
diff changeset
   131
  | ZOracle of string
bdb33a2d4167 clarified const_proof vs. zproof_name;
wenzelm
parents: 79124
diff changeset
   132
  | ZBox of serial;
bdb33a2d4167 clarified const_proof vs. zproof_name;
wenzelm
parents: 79124
diff changeset
   133
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   134
datatype zproof =
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   135
    ZDummy                         (*dummy proof*)
79126
bdb33a2d4167 clarified const_proof vs. zproof_name;
wenzelm
parents: 79124
diff changeset
   136
  | ZConstP of zproof_name * zterm * ztyp ZTVars.table * zterm ZVars.table
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   137
  | ZBoundP of int
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   138
  | ZHyp of zterm
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   139
  | ZAbst of string * ztyp * zproof
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   140
  | ZAbsP of string * zterm * zproof
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   141
  | ZAppt of zproof * zterm
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   142
  | ZAppP of zproof * zproof
79126
bdb33a2d4167 clarified const_proof vs. zproof_name;
wenzelm
parents: 79124
diff changeset
   143
  | ZClassP of ztyp * class;       (*OFCLASS proof from sorts algebra*)
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   144
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   145
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   146
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   147
(*** local ***)
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   148
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   149
signature ZTERM =
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   150
sig
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   151
  datatype ztyp = datatype ztyp
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   152
  datatype zterm = datatype zterm
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   153
  datatype zproof = datatype zproof
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   154
  val fold_tvars: (indexname * sort -> 'a -> 'a) -> ztyp -> 'a -> 'a
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   155
  val fold_aterms: (zterm -> 'a -> 'a) -> zterm -> 'a -> 'a
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   156
  val fold_types: (ztyp -> 'a -> 'a) -> zterm -> 'a -> 'a
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   157
  val ztyp_ord: ztyp * ztyp -> order
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   158
  val aconv_zterm: zterm * zterm -> bool
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   159
  val ztyp_of: typ -> ztyp
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   160
  val typ_of: ztyp -> typ
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   161
  val zterm_of: Consts.T -> term -> zterm
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   162
  val term_of: Consts.T -> zterm -> term
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   163
  val global_zterm_of: theory -> term -> zterm
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   164
  val global_term_of: theory -> zterm -> term
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   165
  val dummy_proof: 'a -> zproof
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   166
  val todo_proof: 'a -> zproof
79126
bdb33a2d4167 clarified const_proof vs. zproof_name;
wenzelm
parents: 79124
diff changeset
   167
  val axiom_proof:  theory -> string -> term -> zproof
bdb33a2d4167 clarified const_proof vs. zproof_name;
wenzelm
parents: 79124
diff changeset
   168
  val oracle_proof:  theory -> string -> term -> zproof
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   169
  val assume_proof: theory -> term -> zproof
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   170
  val trivial_proof: theory -> term -> zproof
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   171
  val implies_intr_proof: theory -> term -> zproof -> zproof
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   172
  val forall_intr_proof: theory -> typ -> string * term -> zproof -> zproof
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   173
  val forall_elim_proof: theory -> term -> zproof -> zproof
79128
b6f5d4392388 more zproofs;
wenzelm
parents: 79126
diff changeset
   174
  val of_class_proof: typ * class -> zproof
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   175
  val reflexive_proof: theory -> typ -> term -> zproof
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   176
  val symmetric_proof: theory -> typ -> term -> term -> zproof -> zproof
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   177
  val transitive_proof: theory -> typ -> term -> term -> term -> zproof -> zproof -> zproof
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   178
  val equal_intr_proof: theory -> term -> term -> zproof -> zproof -> zproof
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   179
  val equal_elim_proof: theory -> term -> term -> zproof -> zproof -> zproof
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   180
  val abstract_rule_proof: theory -> typ -> typ -> string * term -> term -> term -> zproof -> zproof
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   181
  val combination_proof: theory -> typ -> typ -> term -> term -> term -> term ->
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   182
    zproof -> zproof -> zproof
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   183
end;
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   184
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   185
structure ZTerm: ZTERM =
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   186
struct
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   187
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   188
datatype ztyp = datatype ztyp;
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   189
datatype zterm = datatype zterm;
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   190
datatype zproof = datatype zproof;
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   191
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   192
open ZTerm;
79098
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   193
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   194
fun aconv_zterm (tm1, tm2) =
79098
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   195
  pointer_eq (tm1, tm2) orelse
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   196
    (case (tm1, tm2) of
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   197
      (ZApp (t1, u1), ZApp (t2, u2)) => aconv_zterm (t1, t2) andalso aconv_zterm (u1, u2)
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   198
    | (ZAbs (_, T1, t1), ZAbs (_, T2, t2)) => aconv_zterm (t1, t2) andalso T1 = T2
79098
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   199
    | (a1, a2) => a1 = a2);
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   200
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   201
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   202
(* instantiation *)
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   203
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   204
fun init_instT t = ZTVars.build (ZTVars.add_tvars t) |> ZTVars.map (fn v => fn _ => ZTVar v);
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   205
fun init_inst t = ZVars.build (ZVars.add_vars t) |> ZVars.map (fn v => fn _ => ZVar v);
79126
bdb33a2d4167 clarified const_proof vs. zproof_name;
wenzelm
parents: 79124
diff changeset
   206
bdb33a2d4167 clarified const_proof vs. zproof_name;
wenzelm
parents: 79124
diff changeset
   207
fun map_const_proof (f, g) prf =
bdb33a2d4167 clarified const_proof vs. zproof_name;
wenzelm
parents: 79124
diff changeset
   208
  (case prf of
bdb33a2d4167 clarified const_proof vs. zproof_name;
wenzelm
parents: 79124
diff changeset
   209
    ZConstP (a, A, instT, inst) =>
bdb33a2d4167 clarified const_proof vs. zproof_name;
wenzelm
parents: 79124
diff changeset
   210
      let
bdb33a2d4167 clarified const_proof vs. zproof_name;
wenzelm
parents: 79124
diff changeset
   211
        val instT' = ZTVars.map (fn ((x, _), _) => fn y => the_default y (try f x)) instT;
bdb33a2d4167 clarified const_proof vs. zproof_name;
wenzelm
parents: 79124
diff changeset
   212
        val inst' = ZVars.map (fn ((x, _), _) => fn y => the_default y (try g x)) inst;
bdb33a2d4167 clarified const_proof vs. zproof_name;
wenzelm
parents: 79124
diff changeset
   213
      in ZConstP (a, A, instT', inst') end
bdb33a2d4167 clarified const_proof vs. zproof_name;
wenzelm
parents: 79124
diff changeset
   214
  | _ => prf);
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   215
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   216
79098
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   217
(* convert ztyp / zterm vs. regular typ / term *)
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   218
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   219
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
   220
  | ztyp_of (TVar v) = ZTVar v
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   221
  | 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
   222
  | 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
   223
  | 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
   224
  | 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
   225
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   226
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
   227
  | typ_of (ZTVar v) = TVar v
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   228
  | 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
   229
  | typ_of ZProp = propT
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   230
  | typ_of (ZItself T) = Term.itselfT (typ_of T)
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   231
  | typ_of (ZType0 c) = Type (c, [])
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   232
  | typ_of (ZType1 (c, T)) = Type (c, [typ_of T])
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   233
  | 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
   234
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   235
fun zterm_of consts =
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   236
  let
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   237
    val typargs = Consts.typargs consts;
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   238
    fun zterm (Free (x, T)) = ZVar ((x, ~1), ztyp_of T)
79098
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   239
      | zterm (Var (xi, T)) = ZVar (xi, ztyp_of T)
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   240
      | zterm (Bound i) = ZBound i
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   241
      | zterm (Const (c, T)) =
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   242
          (case typargs (c, T) of
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   243
            [] => ZConst0 c
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   244
          | [T] => ZConst1 (c, ztyp_of T)
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   245
          | Ts => ZConst (c, map ztyp_of Ts))
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   246
      | zterm (Abs (a, T, b)) = ZAbs (a, ztyp_of T, zterm b)
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   247
      | zterm ((t as Const (c, _)) $ (u as Const ("Pure.type", _))) =
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   248
          if String.isSuffix Logic.class_suffix c then
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   249
            ZClass (ztyp_of (Logic.dest_type u), Logic.class_of_const c)
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   250
          else ZApp (zterm t, zterm u)
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   251
      | zterm (t $ u) = ZApp (zterm t, zterm u);
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   252
  in zterm end;
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   253
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   254
fun term_of consts =
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   255
  let
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   256
    val instance = Consts.instance consts;
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   257
    fun const (c, Ts) = Const (c, instance (c, Ts));
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   258
    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
   259
      | term (ZVar (xi, T)) = Var (xi, typ_of T)
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   260
      | term (ZBound i) = Bound i
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   261
      | term (ZConst0 c) = const (c, [])
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   262
      | term (ZConst1 (c, T)) = const (c, [typ_of T])
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   263
      | term (ZConst (c, Ts)) = const (c, map typ_of Ts)
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   264
      | 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
   265
      | term (ZApp (t, u)) = term t $ term u
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   266
      | 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
   267
  in term end;
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   268
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   269
val global_zterm_of = zterm_of o Sign.consts_of;
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   270
val global_term_of = term_of o Sign.consts_of;
79113
5109e4b2a292 pro-forma support for optional zproof: no proper content yet;
wenzelm
parents: 79098
diff changeset
   271
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   272
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   273
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   274
(** proof construction **)
79113
5109e4b2a292 pro-forma support for optional zproof: no proper content yet;
wenzelm
parents: 79098
diff changeset
   275
5109e4b2a292 pro-forma support for optional zproof: no proper content yet;
wenzelm
parents: 79098
diff changeset
   276
fun dummy_proof _ = ZDummy;
5109e4b2a292 pro-forma support for optional zproof: no proper content yet;
wenzelm
parents: 79098
diff changeset
   277
val todo_proof = dummy_proof;
5109e4b2a292 pro-forma support for optional zproof: no proper content yet;
wenzelm
parents: 79098
diff changeset
   278
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   279
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   280
(* basic logic *)
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   281
79126
bdb33a2d4167 clarified const_proof vs. zproof_name;
wenzelm
parents: 79124
diff changeset
   282
fun const_proof thy a A =
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   283
  let
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   284
    val t = global_zterm_of thy A;
79126
bdb33a2d4167 clarified const_proof vs. zproof_name;
wenzelm
parents: 79124
diff changeset
   285
    val instT = init_instT t;
bdb33a2d4167 clarified const_proof vs. zproof_name;
wenzelm
parents: 79124
diff changeset
   286
    val inst = init_inst t;
bdb33a2d4167 clarified const_proof vs. zproof_name;
wenzelm
parents: 79124
diff changeset
   287
  in ZConstP (a, t, instT, inst) end;
bdb33a2d4167 clarified const_proof vs. zproof_name;
wenzelm
parents: 79124
diff changeset
   288
bdb33a2d4167 clarified const_proof vs. zproof_name;
wenzelm
parents: 79124
diff changeset
   289
fun axiom_proof thy name = const_proof thy (ZAxiom name);
bdb33a2d4167 clarified const_proof vs. zproof_name;
wenzelm
parents: 79124
diff changeset
   290
fun oracle_proof thy name = const_proof thy (ZOracle name);
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   291
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   292
fun assume_proof thy A =
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   293
  ZHyp (global_zterm_of thy A);
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   294
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   295
fun trivial_proof thy A =
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   296
  ZAbsP ("H", global_zterm_of thy A, ZBoundP 0);
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   297
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   298
fun implies_intr_proof thy A prf =
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   299
  let
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   300
    val h = global_zterm_of thy A;
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   301
    fun abs_hyp i (p as ZHyp t) = if aconv_zterm (h, t) then ZBoundP i else p
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   302
      | abs_hyp i (ZAbst (x, T, p)) = ZAbst (x, T, abs_hyp i p)
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   303
      | abs_hyp i (ZAbsP (x, t, p)) = ZAbsP (x, t, abs_hyp (i + 1) p)
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   304
      | abs_hyp i (ZAppt (p, t)) = ZAppt (abs_hyp i p, t)
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   305
      | abs_hyp i (ZAppP (p, q)) = ZAppP (abs_hyp i p, abs_hyp i q)
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   306
      | abs_hyp _ p = p;
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   307
  in ZAbsP ("H", h, abs_hyp 0 prf) end;
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   308
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   309
fun forall_intr_proof thy T (a, x) prf =
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   310
  let
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   311
    val Z = ztyp_of T;
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   312
    val z = global_zterm_of thy x;
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   313
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   314
    fun abs_term i b =
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   315
      if aconv_zterm (b, z) then ZBound i
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   316
      else
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   317
        (case b of
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   318
          ZAbs (x, T, t) => ZAbs (x, T, abs_term (i + 1) t)
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   319
        | ZApp (t, u) => ZApp (abs_term i t, abs_term i u)
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   320
        | _ => b);
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   321
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   322
    fun abs_proof i (ZAbst (x, T, prf)) = ZAbst (x, T, abs_proof (i + 1) prf)
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   323
      | abs_proof i (ZAbsP (x, t, prf)) = ZAbsP (x, abs_term i t, abs_proof i prf)
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   324
      | abs_proof i (ZAppt (p, t)) = ZAppt (abs_proof i p, abs_term i t)
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   325
      | abs_proof i (ZAppP (p, q)) = ZAppP (abs_proof i p, abs_proof i q)
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   326
      | abs_proof _ p = p;
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   327
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   328
  in ZAbst (a, Z, abs_proof 0 prf) end;
79119
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   329
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   330
fun forall_elim_proof thy t p = ZAppt (p, global_zterm_of thy t);
cf29db6c95e1 more zterm operations;
wenzelm
parents: 79114
diff changeset
   331
79128
b6f5d4392388 more zproofs;
wenzelm
parents: 79126
diff changeset
   332
fun of_class_proof (T, c) = ZClassP (ztyp_of T, c);
b6f5d4392388 more zproofs;
wenzelm
parents: 79126
diff changeset
   333
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   334
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   335
(* equality *)
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   336
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   337
local
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   338
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   339
val thy0 =
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   340
  Context.the_global_context ()
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   341
  |> Sign.add_types_global [(Binding.name "fun", 2, NoSyn), (Binding.name "prop", 0, NoSyn)]
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   342
  |> Sign.local_path
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   343
  |> Sign.add_consts
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   344
   [(Binding.name "all", (Term.aT [] --> propT) --> propT, NoSyn),
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   345
    (Binding.name "imp", propT --> propT --> propT, NoSyn),
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   346
    (Binding.name "eq", Term.aT [] --> Term.aT [] --> propT, NoSyn)];
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   347
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   348
val [reflexive_axiom, symmetric_axiom, transitive_axiom, equal_intr_axiom, equal_elim_axiom,
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   349
  abstract_rule_axiom, combination_axiom] =
79126
bdb33a2d4167 clarified const_proof vs. zproof_name;
wenzelm
parents: 79124
diff changeset
   350
    Theory.equality_axioms |> map (fn (b, t) => axiom_proof thy0 (Sign.full_name thy0 b) t);
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   351
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   352
in
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   353
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   354
val is_reflexive_proof =
79126
bdb33a2d4167 clarified const_proof vs. zproof_name;
wenzelm
parents: 79124
diff changeset
   355
  fn ZConstP (ZAxiom "Pure.reflexive", _, _, _) => true | _ => false;
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   356
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   357
fun reflexive_proof thy T t =
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   358
  let
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   359
    val A = ztyp_of T;
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   360
    val x = global_zterm_of thy t;
79126
bdb33a2d4167 clarified const_proof vs. zproof_name;
wenzelm
parents: 79124
diff changeset
   361
  in map_const_proof (fn "'a" => A, fn "x" => x) reflexive_axiom end;
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   362
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   363
fun symmetric_proof thy T t u prf =
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   364
  if is_reflexive_proof prf then prf
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   365
  else
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   366
    let
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   367
      val A = ztyp_of T;
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   368
      val x = global_zterm_of thy t;
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   369
      val y = global_zterm_of thy u;
79126
bdb33a2d4167 clarified const_proof vs. zproof_name;
wenzelm
parents: 79124
diff changeset
   370
      val ax = map_const_proof (fn "'a" => A, fn "x" => x | "y" => y) symmetric_axiom;
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   371
    in ZAppP (ax, prf) end;
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   372
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   373
fun transitive_proof thy T t u v prf1 prf2 =
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   374
  if is_reflexive_proof prf1 then prf2
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   375
  else if is_reflexive_proof prf2 then prf1
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   376
  else
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   377
    let
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   378
      val A = ztyp_of T;
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   379
      val x = global_zterm_of thy t;
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   380
      val y = global_zterm_of thy u;
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   381
      val z = global_zterm_of thy v;
79126
bdb33a2d4167 clarified const_proof vs. zproof_name;
wenzelm
parents: 79124
diff changeset
   382
      val ax = map_const_proof (fn "'a" => A, fn "x" => x | "y" => y | "z" => z) transitive_axiom;
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   383
    in ZAppP (ZAppP (ax, prf1), prf2) end;
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   384
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   385
fun equal_intr_proof thy t u prf1 prf2 =
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   386
  let
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   387
    val A = global_zterm_of thy t;
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   388
    val B = global_zterm_of thy u;
79126
bdb33a2d4167 clarified const_proof vs. zproof_name;
wenzelm
parents: 79124
diff changeset
   389
    val ax = map_const_proof (undefined, fn "A" => A | "B" => B) equal_intr_axiom;
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   390
  in ZAppP (ZAppP (ax, prf1), prf2) end;
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   391
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   392
fun equal_elim_proof thy t u prf1 prf2 =
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   393
  let
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   394
    val A = global_zterm_of thy t;
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   395
    val B = global_zterm_of thy u;
79126
bdb33a2d4167 clarified const_proof vs. zproof_name;
wenzelm
parents: 79124
diff changeset
   396
    val ax = map_const_proof (undefined, fn "A" => A | "B" => B) equal_elim_axiom;
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   397
  in ZAppP (ZAppP (ax, prf1), prf2) end;
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   398
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   399
fun abstract_rule_proof thy T U x t u prf =
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   400
  let
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   401
    val A = ztyp_of T;
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   402
    val B = ztyp_of U;
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   403
    val f = global_zterm_of thy t;
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   404
    val g = global_zterm_of thy u;
79126
bdb33a2d4167 clarified const_proof vs. zproof_name;
wenzelm
parents: 79124
diff changeset
   405
    val ax =
bdb33a2d4167 clarified const_proof vs. zproof_name;
wenzelm
parents: 79124
diff changeset
   406
      map_const_proof (fn "'a" => A | "'b" => B, fn "f" => f | "g" => g)
bdb33a2d4167 clarified const_proof vs. zproof_name;
wenzelm
parents: 79124
diff changeset
   407
        abstract_rule_axiom;
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   408
  in ZAppP (ax, forall_intr_proof thy T x prf) end;
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   409
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   410
fun combination_proof thy T U f g t u prf1 prf2 =
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   411
  let
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   412
    val A = ztyp_of T;
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   413
    val B = ztyp_of U;
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   414
    val f' = global_zterm_of thy f;
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   415
    val g' = global_zterm_of thy g;
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   416
    val x = global_zterm_of thy t;
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   417
    val y = global_zterm_of thy u;
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   418
    val ax =
79126
bdb33a2d4167 clarified const_proof vs. zproof_name;
wenzelm
parents: 79124
diff changeset
   419
      map_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
   420
        combination_axiom;
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   421
  in ZAppP (ZAppP (ax, prf1), prf2) end;
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   422
79098
d8940e5bbb25 tight representation of types / terms / proof terms (presently unused);
wenzelm
parents:
diff changeset
   423
end;
79124
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   424
89d4a8f52738 more zproofs;
wenzelm
parents: 79119
diff changeset
   425
end;