src/HOL/Tools/rewrite_hol_proof.ML
author wenzelm
Mon, 27 Nov 2017 10:36:43 +0100
changeset 67094 4a2563645635
parent 67093 835a2ab92c3d
child 67399 eab6ce8368fa
permissions -rw-r--r--
more symbols;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
13404
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
     1
(*  Title:      HOL/Tools/rewrite_hol_proof.ML
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
     2
    Author:     Stefan Berghofer, TU Muenchen
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
     3
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
     4
Rewrite rules for HOL proofs
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
     5
*)
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
     6
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
     7
signature REWRITE_HOL_PROOF =
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
     8
sig
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
     9
  val rews: (Proofterm.proof * Proofterm.proof) list
37233
b78f31ca4675 Adapted to new format of proof terms containing explicit proofs of class membership.
berghofe
parents: 36042
diff changeset
    10
  val elim_cong: typ list -> term option list -> Proofterm.proof -> (Proofterm.proof * Proofterm.proof) option
13404
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
    11
end;
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
    12
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
    13
structure RewriteHOLProof : REWRITE_HOL_PROOF =
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
    14
struct
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
    15
67093
835a2ab92c3d prefer Input.source (via cartouche);
wenzelm
parents: 67091
diff changeset
    16
val rews =
835a2ab92c3d prefer Input.source (via cartouche);
wenzelm
parents: 67091
diff changeset
    17
  map (apply2 (Proof_Syntax.proof_of_term @{theory} true) o Logic.dest_equals o
835a2ab92c3d prefer Input.source (via cartouche);
wenzelm
parents: 67091
diff changeset
    18
    Logic.varify_global o Proof_Syntax.read_term @{theory} true propT o Syntax.implode_input)
13404
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
    19
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
    20
  (** eliminate meta-equality rules **)
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
    21
67094
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    22
  [\<open>(equal_elim \<cdot> x1 \<cdot> x2 \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    23
      (combination \<cdot> TYPE('T1) \<cdot> TYPE('T2) \<cdot> Trueprop \<cdot> x3 \<cdot> A \<cdot> B \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    24
        (axm.reflexive \<cdot> TYPE('T3) \<cdot> x4) \<bullet> prf1)) \<equiv>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    25
    (iffD1 \<cdot> A \<cdot> B \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    26
      (meta_eq_to_obj_eq \<cdot> TYPE(bool) \<cdot> A \<cdot> B \<bullet> arity_type_bool \<bullet> prf1))\<close>,
13404
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
    27
67094
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    28
   \<open>(equal_elim \<cdot> x1 \<cdot> x2 \<bullet> (axm.symmetric \<cdot> TYPE('T1) \<cdot> x3 \<cdot> x4 \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    29
      (combination \<cdot> TYPE('T2) \<cdot> TYPE('T3) \<cdot> Trueprop \<cdot> x5 \<cdot> A \<cdot> B \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    30
        (axm.reflexive \<cdot> TYPE('T4) \<cdot> x6) \<bullet> prf1))) \<equiv>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    31
    (iffD2 \<cdot> A \<cdot> B \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    32
      (meta_eq_to_obj_eq \<cdot> TYPE(bool) \<cdot> A \<cdot> B \<bullet> arity_type_bool \<bullet> prf1))\<close>,
13404
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
    33
67094
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    34
   \<open>(meta_eq_to_obj_eq \<cdot> TYPE('U) \<cdot> x1 \<cdot> x2 \<bullet> prfU \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    35
      (combination \<cdot> TYPE('T) \<cdot> TYPE('U) \<cdot> f \<cdot> g \<cdot> x \<cdot> y \<bullet> prf1 \<bullet> prf2)) \<equiv>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    36
    (cong \<cdot> TYPE('T) \<cdot> TYPE('U) \<cdot> f \<cdot> g \<cdot> x \<cdot> y \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    37
      (OfClass type_class \<cdot> TYPE('T)) \<bullet> prfU \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    38
      (meta_eq_to_obj_eq \<cdot> TYPE('T \<Rightarrow> 'U) \<cdot> f \<cdot> g \<bullet> (OfClass type_class \<cdot> TYPE('T \<Rightarrow> 'U)) \<bullet> prf1) \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    39
      (meta_eq_to_obj_eq \<cdot> TYPE('T) \<cdot> x \<cdot> y \<bullet> (OfClass type_class \<cdot> TYPE('T)) \<bullet> prf2))\<close>,
13404
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
    40
67094
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    41
   \<open>(meta_eq_to_obj_eq \<cdot> TYPE('T) \<cdot> x1 \<cdot> x2 \<bullet> prfT \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    42
      (axm.transitive \<cdot> TYPE('T) \<cdot> x \<cdot> y \<cdot> z \<bullet> prf1 \<bullet> prf2)) \<equiv>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    43
    (HOL.trans \<cdot> TYPE('T) \<cdot> x \<cdot> y \<cdot> z \<bullet> prfT \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    44
      (meta_eq_to_obj_eq \<cdot> TYPE('T) \<cdot> x \<cdot> y \<bullet> prfT \<bullet> prf1) \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    45
      (meta_eq_to_obj_eq \<cdot> TYPE('T) \<cdot> y \<cdot> z \<bullet> prfT \<bullet> prf2))\<close>,
13404
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
    46
67094
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    47
   \<open>(meta_eq_to_obj_eq \<cdot> TYPE('T) \<cdot> x \<cdot> x \<bullet> prfT \<bullet> (axm.reflexive \<cdot> TYPE('T) \<cdot> x)) \<equiv>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    48
    (HOL.refl \<cdot> TYPE('T) \<cdot> x \<bullet> prfT)\<close>,
37233
b78f31ca4675 Adapted to new format of proof terms containing explicit proofs of class membership.
berghofe
parents: 36042
diff changeset
    49
67094
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    50
   \<open>(meta_eq_to_obj_eq \<cdot> TYPE('T) \<cdot> x \<cdot> y \<bullet> prfT \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    51
      (axm.symmetric \<cdot> TYPE('T) \<cdot> x \<cdot> y \<bullet> prf)) \<equiv>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    52
    (sym \<cdot> TYPE('T) \<cdot> x \<cdot> y \<bullet> prfT \<bullet> (meta_eq_to_obj_eq \<cdot> TYPE('T) \<cdot> x \<cdot> y \<bullet> prfT \<bullet> prf))\<close>,
13404
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
    53
67094
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    54
   \<open>(meta_eq_to_obj_eq \<cdot> TYPE('T \<Rightarrow> 'U) \<cdot> x1 \<cdot> x2 \<bullet> prfTU \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    55
      (abstract_rule \<cdot> TYPE('T) \<cdot> TYPE('U) \<cdot> f \<cdot> g \<bullet> prf)) \<equiv>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    56
    (ext \<cdot> TYPE('T) \<cdot> TYPE('U) \<cdot> f \<cdot> g \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    57
      (OfClass type_class \<cdot> TYPE('T)) \<bullet> (OfClass type_class \<cdot> TYPE('U)) \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    58
      (\<^bold>\<lambda>(x::'T). meta_eq_to_obj_eq \<cdot> TYPE('U) \<cdot> f x \<cdot> g x \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    59
         (OfClass type_class \<cdot> TYPE('U)) \<bullet> (prf \<cdot> x)))\<close>,
13404
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
    60
67094
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    61
   \<open>(meta_eq_to_obj_eq \<cdot> TYPE('T) \<cdot> x \<cdot> y \<bullet> prfT \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    62
      (eq_reflection \<cdot> TYPE('T) \<cdot> x \<cdot> y \<bullet> prfT \<bullet> prf)) \<equiv> prf\<close>,
13404
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
    63
67094
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    64
   \<open>(meta_eq_to_obj_eq \<cdot> TYPE('T) \<cdot> x1 \<cdot> x2 \<bullet> prfT \<bullet> (equal_elim \<cdot> x3 \<cdot> x4 \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    65
      (combination \<cdot> TYPE('T) \<cdot> TYPE(prop) \<cdot> x7 \<cdot> x8 \<cdot> C \<cdot> D \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    66
        (combination \<cdot> TYPE('T) \<cdot> TYPE('T3) \<cdot> op \<equiv> \<cdot> op \<equiv> \<cdot> A \<cdot> B \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    67
          (axm.reflexive \<cdot> TYPE('T4) \<cdot> op \<equiv>) \<bullet> prf1) \<bullet> prf2) \<bullet> prf3)) \<equiv>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    68
    (iffD1 \<cdot> A = C \<cdot> B = D \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    69
      (cong \<cdot> TYPE('T) \<cdot> TYPE(bool) \<cdot> op = A \<cdot> op = B \<cdot> C \<cdot> D \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    70
        prfT \<bullet> arity_type_bool \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    71
        (cong \<cdot> TYPE('T) \<cdot> TYPE('T\<Rightarrow>bool) \<cdot>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    72
          (op = :: 'T\<Rightarrow>'T\<Rightarrow>bool) \<cdot> (op = :: 'T\<Rightarrow>'T\<Rightarrow>bool) \<cdot> A \<cdot> B \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    73
          prfT \<bullet> (OfClass type_class \<cdot> TYPE('T\<Rightarrow>bool)) \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    74
          (HOL.refl \<cdot> TYPE('T\<Rightarrow>'T\<Rightarrow>bool) \<cdot> (op = :: 'T\<Rightarrow>'T\<Rightarrow>bool) \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    75
             (OfClass type_class \<cdot> TYPE('T\<Rightarrow>'T\<Rightarrow>bool))) \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    76
          (meta_eq_to_obj_eq \<cdot> TYPE('T) \<cdot> A \<cdot> B \<bullet> prfT \<bullet> prf1)) \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    77
        (meta_eq_to_obj_eq \<cdot> TYPE('T) \<cdot> C \<cdot> D \<bullet> prfT \<bullet> prf2)) \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    78
      (meta_eq_to_obj_eq \<cdot> TYPE('T) \<cdot> A \<cdot> C \<bullet> prfT \<bullet> prf3))\<close>,
13404
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
    79
67094
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    80
   \<open>(meta_eq_to_obj_eq \<cdot> TYPE('T) \<cdot> x1 \<cdot> x2 \<bullet> prfT \<bullet> (equal_elim \<cdot> x3 \<cdot> x4 \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    81
      (axm.symmetric \<cdot> TYPE('T2) \<cdot> x5 \<cdot> x6 \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    82
        (combination \<cdot> TYPE('T) \<cdot> TYPE(prop) \<cdot> x7 \<cdot> x8 \<cdot> C \<cdot> D \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    83
          (combination \<cdot> TYPE('T) \<cdot> TYPE('T3) \<cdot> op \<equiv> \<cdot> op \<equiv> \<cdot> A \<cdot> B \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    84
            (axm.reflexive \<cdot> TYPE('T4) \<cdot> op \<equiv>) \<bullet> prf1) \<bullet> prf2)) \<bullet> prf3)) \<equiv>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    85
    (iffD2 \<cdot> A = C \<cdot> B = D \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    86
      (cong \<cdot> TYPE('T) \<cdot> TYPE(bool) \<cdot> op = A \<cdot> op = B \<cdot> C \<cdot> D \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    87
        prfT \<bullet> arity_type_bool \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    88
        (cong \<cdot> TYPE('T) \<cdot> TYPE('T\<Rightarrow>bool) \<cdot>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    89
          (op = :: 'T\<Rightarrow>'T\<Rightarrow>bool) \<cdot> (op = :: 'T\<Rightarrow>'T\<Rightarrow>bool) \<cdot> A \<cdot> B \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    90
          prfT \<bullet> (OfClass type_class \<cdot> TYPE('T\<Rightarrow>bool)) \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    91
          (HOL.refl \<cdot> TYPE('T\<Rightarrow>'T\<Rightarrow>bool) \<cdot> (op = :: 'T\<Rightarrow>'T\<Rightarrow>bool) \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    92
             (OfClass type_class \<cdot> TYPE('T\<Rightarrow>'T\<Rightarrow>bool))) \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    93
          (meta_eq_to_obj_eq \<cdot> TYPE('T) \<cdot> A \<cdot> B \<bullet> prfT \<bullet> prf1)) \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    94
        (meta_eq_to_obj_eq \<cdot> TYPE('T) \<cdot> C \<cdot> D \<bullet> prfT \<bullet> prf2)) \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
    95
      (meta_eq_to_obj_eq \<cdot> TYPE('T) \<cdot> B \<cdot> D \<bullet> prfT \<bullet> prf3))\<close>,
13404
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
    96
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
    97
   (** rewriting on bool: insert proper congruence rules for logical connectives **)
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
    98
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
    99
   (* All *)
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   100
67094
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   101
   \<open>(iffD1 \<cdot> All P \<cdot> All Q \<bullet> (cong \<cdot> TYPE('T1) \<cdot> TYPE('T2) \<cdot> All \<cdot> All \<cdot> P \<cdot> Q \<bullet> prfT1 \<bullet> prfT2 \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   102
      (HOL.refl \<cdot> TYPE('T3) \<cdot> x1 \<bullet> prfT3) \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   103
      (ext \<cdot> TYPE('a) \<cdot> TYPE(bool) \<cdot> x2 \<cdot> x3 \<bullet> prfa \<bullet> prfb \<bullet> prf)) \<bullet> prf') \<equiv>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   104
    (allI \<cdot> TYPE('a) \<cdot> Q \<bullet> prfa \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   105
      (\<^bold>\<lambda>x.
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   106
          iffD1 \<cdot> P x \<cdot> Q x \<bullet> (prf \<cdot> x) \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   107
           (spec \<cdot> TYPE('a) \<cdot> P \<cdot> x \<bullet> prfa \<bullet> prf')))\<close>,
13404
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   108
67094
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   109
   \<open>(iffD2 \<cdot> All P \<cdot> All Q \<bullet> (cong \<cdot> TYPE('T1) \<cdot> TYPE('T2) \<cdot> All \<cdot> All \<cdot> P \<cdot> Q \<bullet> prfT1 \<bullet> prfT2 \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   110
      (HOL.refl \<cdot> TYPE('T3) \<cdot> x1 \<bullet> prfT3) \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   111
      (ext \<cdot> TYPE('a) \<cdot> TYPE(bool) \<cdot> x2 \<cdot> x3 \<bullet> prfa \<bullet> prfb \<bullet> prf)) \<bullet> prf') \<equiv>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   112
    (allI \<cdot> TYPE('a) \<cdot> P \<bullet> prfa \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   113
      (\<^bold>\<lambda>x.
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   114
          iffD2 \<cdot> P x \<cdot> Q x \<bullet> (prf \<cdot> x) \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   115
           (spec \<cdot> TYPE('a) \<cdot> Q \<cdot> x \<bullet> prfa \<bullet> prf')))\<close>,
13404
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   116
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   117
   (* Ex *)
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   118
67094
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   119
   \<open>(iffD1 \<cdot> Ex P \<cdot> Ex Q \<bullet> (cong \<cdot> TYPE('T1) \<cdot> TYPE('T2) \<cdot> Ex \<cdot> Ex \<cdot> P \<cdot> Q \<bullet> prfT1 \<bullet> prfT2 \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   120
      (HOL.refl \<cdot> TYPE('T3) \<cdot> x1 \<bullet> prfT3) \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   121
      (ext \<cdot> TYPE('a) \<cdot> TYPE(bool) \<cdot> x2 \<cdot> x3 \<bullet> prfa \<bullet> prfb \<bullet> prf)) \<bullet> prf') \<equiv>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   122
    (exE \<cdot> TYPE('a) \<cdot> P \<cdot> \<exists>x. Q x \<bullet> prfa \<bullet> prf' \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   123
      (\<^bold>\<lambda>x H : P x.
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   124
          exI \<cdot> TYPE('a) \<cdot> Q \<cdot> x \<bullet> prfa \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   125
           (iffD1 \<cdot> P x \<cdot> Q x \<bullet> (prf \<cdot> x) \<bullet> H)))\<close>,
13404
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   126
67094
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   127
   \<open>(iffD2 \<cdot> Ex P \<cdot> Ex Q \<bullet> (cong \<cdot> TYPE('T1) \<cdot> TYPE('T2) \<cdot> Ex \<cdot> Ex \<cdot> P \<cdot> Q \<bullet> prfT1 \<bullet> prfT2 \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   128
      (HOL.refl \<cdot> TYPE('T3) \<cdot> x1 \<bullet> prfT3) \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   129
      (ext \<cdot> TYPE('a) \<cdot> TYPE(bool) \<cdot> x2 \<cdot> x3 \<bullet> prfa \<bullet> prfb \<bullet> prf)) \<bullet> prf') \<equiv>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   130
    (exE \<cdot> TYPE('a) \<cdot> Q \<cdot> \<exists>x. P x \<bullet> prfa \<bullet> prf' \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   131
      (\<^bold>\<lambda>x H : Q x.
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   132
          exI \<cdot> TYPE('a) \<cdot> P \<cdot> x \<bullet> prfa \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   133
           (iffD2 \<cdot> P x \<cdot> Q x \<bullet> (prf \<cdot> x) \<bullet> H)))\<close>,
13404
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   134
67091
1393c2340eec more symbols;
wenzelm
parents: 59058
diff changeset
   135
   (* \<and> *)
13404
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   136
67094
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   137
   \<open>(iffD1 \<cdot> A \<and> C \<cdot> B \<and> D \<bullet> (cong \<cdot> TYPE('T1) \<cdot> TYPE('T2) \<cdot> x1 \<cdot> x2 \<cdot> C \<cdot> D \<bullet> prfT1 \<bullet> prfT2 \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   138
      (cong \<cdot> TYPE('T3) \<cdot> TYPE('T4) \<cdot> op \<and> \<cdot> op \<and> \<cdot> A \<cdot> B \<bullet> prfT3 \<bullet> prfT4 \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   139
        (HOL.refl \<cdot> TYPE('T5) \<cdot> op \<and> \<bullet> prfT5) \<bullet> prf1) \<bullet> prf2) \<bullet> prf3) \<equiv>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   140
    (conjI \<cdot> B \<cdot> D \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   141
      (iffD1 \<cdot> A \<cdot> B \<bullet> prf1 \<bullet> (conjunct1 \<cdot> A \<cdot> C \<bullet> prf3)) \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   142
      (iffD1 \<cdot> C \<cdot> D \<bullet> prf2 \<bullet> (conjunct2 \<cdot> A \<cdot> C \<bullet> prf3)))\<close>,
13404
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   143
67094
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   144
   \<open>(iffD2 \<cdot> A \<and> C \<cdot> B \<and> D \<bullet> (cong \<cdot> TYPE('T1) \<cdot> TYPE('T2) \<cdot> x1 \<cdot> x2 \<cdot> C \<cdot> D \<bullet> prfT1 \<bullet> prfT2 \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   145
      (cong \<cdot> TYPE('T3) \<cdot> TYPE('T4) \<cdot> op \<and> \<cdot> op \<and> \<cdot> A \<cdot> B \<bullet> prfT3 \<bullet> prfT4 \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   146
        (HOL.refl \<cdot> TYPE('T5) \<cdot> op \<and> \<bullet> prfT5) \<bullet> prf1) \<bullet> prf2) \<bullet> prf3) \<equiv>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   147
    (conjI \<cdot> A \<cdot> C \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   148
      (iffD2 \<cdot> A \<cdot> B \<bullet> prf1 \<bullet> (conjunct1 \<cdot> B \<cdot> D \<bullet> prf3)) \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   149
      (iffD2 \<cdot> C \<cdot> D \<bullet> prf2 \<bullet> (conjunct2 \<cdot> B \<cdot> D \<bullet> prf3)))\<close>,
13404
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   150
67094
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   151
   \<open>(cong \<cdot> TYPE(bool) \<cdot> TYPE(bool) \<cdot> op \<and> A \<cdot> op \<and> A \<cdot> B \<cdot> C \<bullet> prfb \<bullet> prfb \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   152
      (HOL.refl \<cdot> TYPE(bool\<Rightarrow>bool) \<cdot> op \<and> A \<bullet> prfbb)) \<equiv>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   153
    (cong \<cdot> TYPE(bool) \<cdot> TYPE(bool) \<cdot> op \<and> A \<cdot> op \<and> A \<cdot> B \<cdot> C \<bullet> prfb \<bullet> prfb \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   154
      (cong \<cdot> TYPE(bool) \<cdot> TYPE(bool\<Rightarrow>bool) \<cdot>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   155
        (op \<and> :: bool\<Rightarrow>bool\<Rightarrow>bool) \<cdot> (op \<and> :: bool\<Rightarrow>bool\<Rightarrow>bool) \<cdot> A \<cdot> A \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   156
          prfb \<bullet> prfbb \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   157
          (HOL.refl \<cdot> TYPE(bool\<Rightarrow>bool\<Rightarrow>bool) \<cdot> (op \<and> :: bool\<Rightarrow>bool\<Rightarrow>bool) \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   158
             (OfClass type_class \<cdot> TYPE(bool\<Rightarrow>bool\<Rightarrow>bool))) \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   159
          (HOL.refl \<cdot> TYPE(bool) \<cdot> A \<bullet> prfb)))\<close>,
13602
4cecd1e0f4a9 - additional congruence rules for boolean operators
berghofe
parents: 13404
diff changeset
   160
67091
1393c2340eec more symbols;
wenzelm
parents: 59058
diff changeset
   161
   (* \<or> *)
13404
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   162
67094
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   163
   \<open>(iffD1 \<cdot> A \<or> C \<cdot> B \<or> D \<bullet> (cong \<cdot> TYPE('T1) \<cdot> TYPE('T2) \<cdot> x1 \<cdot> x2 \<cdot> C \<cdot> D \<bullet> prfT1 \<bullet> prfT2 \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   164
      (cong \<cdot> TYPE('T3) \<cdot> TYPE('T4) \<cdot> op \<or> \<cdot> op \<or> \<cdot> A \<cdot> B \<bullet> prfT3 \<bullet> prfT4 \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   165
        (HOL.refl \<cdot> TYPE('T5) \<cdot> op \<or> \<bullet> prfT5) \<bullet> prf1) \<bullet> prf2) \<bullet> prf3) \<equiv>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   166
    (disjE \<cdot> A \<cdot> C \<cdot> B \<or> D \<bullet> prf3 \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   167
      (\<^bold>\<lambda>H : A. disjI1 \<cdot> B \<cdot> D \<bullet> (iffD1 \<cdot> A \<cdot> B \<bullet> prf1 \<bullet> H)) \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   168
      (\<^bold>\<lambda>H : C. disjI2 \<cdot> D \<cdot> B \<bullet> (iffD1 \<cdot> C \<cdot> D \<bullet> prf2 \<bullet> H)))\<close>,
13404
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   169
67094
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   170
   \<open>(iffD2 \<cdot> A \<or> C \<cdot> B \<or> D \<bullet> (cong \<cdot> TYPE('T1) \<cdot> TYPE('T2) \<cdot> x1 \<cdot> x2 \<cdot> C \<cdot> D \<bullet> prfT1 \<bullet> prfT2 \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   171
      (cong \<cdot> TYPE('T3) \<cdot> TYPE('T4) \<cdot> op \<or> \<cdot> op \<or> \<cdot> A \<cdot> B \<bullet> prfT3 \<bullet> prfT4 \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   172
        (HOL.refl \<cdot> TYPE('T5) \<cdot> op \<or> \<bullet> prfT5) \<bullet> prf1) \<bullet> prf2) \<bullet> prf3) \<equiv>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   173
    (disjE \<cdot> B \<cdot> D \<cdot> A \<or> C \<bullet> prf3 \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   174
      (\<^bold>\<lambda>H : B. disjI1 \<cdot> A \<cdot> C \<bullet> (iffD2 \<cdot> A \<cdot> B \<bullet> prf1 \<bullet> H)) \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   175
      (\<^bold>\<lambda>H : D. disjI2 \<cdot> C \<cdot> A \<bullet> (iffD2 \<cdot> C \<cdot> D \<bullet> prf2 \<bullet> H)))\<close>,
13404
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   176
67094
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   177
   \<open>(cong \<cdot> TYPE(bool) \<cdot> TYPE(bool) \<cdot> op \<or> A \<cdot> op \<or> A \<cdot> B \<cdot> C \<bullet> prfb \<bullet> prfb \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   178
      (HOL.refl \<cdot> TYPE(bool\<Rightarrow>bool) \<cdot> op \<or> A \<bullet> prfbb)) \<equiv>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   179
    (cong \<cdot> TYPE(bool) \<cdot> TYPE(bool) \<cdot> op \<or> A \<cdot> op \<or> A \<cdot> B \<cdot> C \<bullet> prfb \<bullet> prfb \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   180
      (cong \<cdot> TYPE(bool) \<cdot> TYPE(bool\<Rightarrow>bool) \<cdot>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   181
        (op \<or> :: bool\<Rightarrow>bool\<Rightarrow>bool) \<cdot> (op \<or> :: bool\<Rightarrow>bool\<Rightarrow>bool) \<cdot> A \<cdot> A \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   182
          prfb \<bullet> prfbb \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   183
          (HOL.refl \<cdot> TYPE(bool\<Rightarrow>bool\<Rightarrow>bool) \<cdot> (op \<or> :: bool\<Rightarrow>bool\<Rightarrow>bool) \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   184
             (OfClass type_class \<cdot> TYPE(bool\<Rightarrow>bool\<Rightarrow>bool))) \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   185
          (HOL.refl \<cdot> TYPE(bool) \<cdot> A \<bullet> prfb)))\<close>,
13602
4cecd1e0f4a9 - additional congruence rules for boolean operators
berghofe
parents: 13404
diff changeset
   186
67091
1393c2340eec more symbols;
wenzelm
parents: 59058
diff changeset
   187
   (* \<longrightarrow> *)
13404
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   188
67094
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   189
   \<open>(iffD1 \<cdot> A \<longrightarrow> C \<cdot> B \<longrightarrow> D \<bullet> (cong \<cdot> TYPE('T1) \<cdot> TYPE('T2) \<cdot> x1 \<cdot> x2 \<cdot> C \<cdot> D \<bullet> prfT1 \<bullet> prfT2 \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   190
      (cong \<cdot> TYPE('T3) \<cdot> TYPE('T4) \<cdot> op \<longrightarrow> \<cdot> op \<longrightarrow> \<cdot> A \<cdot> B \<bullet> prfT3 \<bullet> prfT4 \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   191
        (HOL.refl \<cdot> TYPE('T5) \<cdot> op \<longrightarrow> \<bullet> prfT5) \<bullet> prf1) \<bullet> prf2) \<bullet> prf3) \<equiv>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   192
    (impI \<cdot> B \<cdot> D \<bullet> (\<^bold>\<lambda>H: B. iffD1 \<cdot> C \<cdot> D \<bullet> prf2 \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   193
      (mp \<cdot> A \<cdot> C \<bullet> prf3 \<bullet> (iffD2 \<cdot> A \<cdot> B \<bullet> prf1 \<bullet> H))))\<close>,
13404
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   194
67094
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   195
   \<open>(iffD2 \<cdot> A \<longrightarrow> C \<cdot> B \<longrightarrow> D \<bullet> (cong \<cdot> TYPE('T1) \<cdot> TYPE('T2) \<cdot> x1 \<cdot> x2 \<cdot> C \<cdot> D \<bullet> prfT1 \<bullet> prfT2 \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   196
      (cong \<cdot> TYPE('T3) \<cdot> TYPE('T4) \<cdot> op \<longrightarrow> \<cdot> op \<longrightarrow> \<cdot> A \<cdot> B \<bullet> prfT3 \<bullet> prfT4 \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   197
        (HOL.refl \<cdot> TYPE('T5) \<cdot> op \<longrightarrow> \<bullet> prfT5) \<bullet> prf1) \<bullet> prf2) \<bullet> prf3) \<equiv>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   198
    (impI \<cdot> A \<cdot> C \<bullet> (\<^bold>\<lambda>H: A. iffD2 \<cdot> C \<cdot> D \<bullet> prf2 \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   199
      (mp \<cdot> B \<cdot> D \<bullet> prf3 \<bullet> (iffD1 \<cdot> A \<cdot> B \<bullet> prf1 \<bullet> H))))\<close>,
13404
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   200
67094
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   201
   \<open>(cong \<cdot> TYPE(bool) \<cdot> TYPE(bool) \<cdot> op \<longrightarrow> A \<cdot> op \<longrightarrow> A \<cdot> B \<cdot> C \<bullet> prfb \<bullet> prfb \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   202
      (HOL.refl \<cdot> TYPE(bool\<Rightarrow>bool) \<cdot> op \<longrightarrow> A \<bullet> prfbb)) \<equiv>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   203
    (cong \<cdot> TYPE(bool) \<cdot> TYPE(bool) \<cdot> op \<longrightarrow> A \<cdot> op \<longrightarrow> A \<cdot> B \<cdot> C \<bullet> prfb \<bullet> prfb \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   204
      (cong \<cdot> TYPE(bool) \<cdot> TYPE(bool\<Rightarrow>bool) \<cdot>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   205
        (op \<longrightarrow> :: bool\<Rightarrow>bool\<Rightarrow>bool) \<cdot> (op \<longrightarrow> :: bool\<Rightarrow>bool\<Rightarrow>bool) \<cdot> A \<cdot> A \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   206
          prfb \<bullet> prfbb \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   207
          (HOL.refl \<cdot> TYPE(bool\<Rightarrow>bool\<Rightarrow>bool) \<cdot> (op \<longrightarrow> :: bool\<Rightarrow>bool\<Rightarrow>bool) \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   208
             (OfClass type_class \<cdot> TYPE(bool\<Rightarrow>bool\<Rightarrow>bool))) \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   209
          (HOL.refl \<cdot> TYPE(bool) \<cdot> A \<bullet> prfb)))\<close>,
13602
4cecd1e0f4a9 - additional congruence rules for boolean operators
berghofe
parents: 13404
diff changeset
   210
67091
1393c2340eec more symbols;
wenzelm
parents: 59058
diff changeset
   211
   (* \<not> *)
13404
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   212
67094
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   213
   \<open>(iffD1 \<cdot> \<not> P \<cdot> \<not> Q \<bullet> (cong \<cdot> TYPE('T1) \<cdot> TYPE('T2) \<cdot> Not \<cdot> Not \<cdot> P \<cdot> Q \<bullet> prfT1 \<bullet> prfT2 \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   214
      (HOL.refl \<cdot> TYPE('T3) \<cdot> Not \<bullet> prfT3) \<bullet> prf1) \<bullet> prf2) \<equiv>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   215
    (notI \<cdot> Q \<bullet> (\<^bold>\<lambda>H: Q.
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   216
      notE \<cdot> P \<cdot> False \<bullet> prf2 \<bullet> (iffD2 \<cdot> P \<cdot> Q \<bullet> prf1 \<bullet> H)))\<close>,
13404
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   217
67094
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   218
   \<open>(iffD2 \<cdot> \<not> P \<cdot> \<not> Q \<bullet> (cong \<cdot> TYPE('T1) \<cdot> TYPE('T2) \<cdot> Not \<cdot> Not \<cdot> P \<cdot> Q \<bullet> prfT1 \<bullet> prfT2 \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   219
      (HOL.refl \<cdot> TYPE('T3) \<cdot> Not \<bullet> prfT3) \<bullet> prf1) \<bullet> prf2) \<equiv>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   220
    (notI \<cdot> P \<bullet> (\<^bold>\<lambda>H: P.
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   221
      notE \<cdot> Q \<cdot> False \<bullet> prf2 \<bullet> (iffD1 \<cdot> P \<cdot> Q \<bullet> prf1 \<bullet> H)))\<close>,
13404
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   222
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   223
   (* = *)
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   224
67094
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   225
   \<open>(iffD1 \<cdot> B \<cdot> D \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   226
      (iffD1 \<cdot> A = C \<cdot> B = D \<bullet> (cong \<cdot> TYPE(bool) \<cdot> TYPE('T1) \<cdot> x1 \<cdot> x2 \<cdot> C \<cdot> D \<bullet> prfb \<bullet> prfT1 \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   227
        (cong \<cdot> TYPE(bool) \<cdot> TYPE('T2) \<cdot> op = \<cdot> op = \<cdot> A \<cdot> B \<bullet> prfb \<bullet> prfT2 \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   228
          (HOL.refl \<cdot> TYPE('T3) \<cdot> op = \<bullet> prfT3) \<bullet> prf1) \<bullet> prf2) \<bullet> prf3) \<bullet> prf4) \<equiv>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   229
    (iffD1 \<cdot> C \<cdot> D \<bullet> prf2 \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   230
      (iffD1 \<cdot> A \<cdot> C \<bullet> prf3 \<bullet> (iffD2 \<cdot> A \<cdot> B \<bullet> prf1 \<bullet> prf4)))\<close>,
13404
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   231
67094
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   232
   \<open>(iffD2 \<cdot> B \<cdot> D \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   233
      (iffD1 \<cdot> A = C \<cdot> B = D \<bullet> (cong \<cdot> TYPE(bool) \<cdot> TYPE('T1) \<cdot> x1 \<cdot> x2 \<cdot> C \<cdot> D \<bullet> prfb \<bullet> prfT1 \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   234
        (cong \<cdot> TYPE(bool) \<cdot> TYPE('T2) \<cdot> op = \<cdot> op = \<cdot> A \<cdot> B \<bullet> prfb \<bullet> prfT2 \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   235
          (HOL.refl \<cdot> TYPE('T3) \<cdot> op = \<bullet> prfT3) \<bullet> prf1) \<bullet> prf2) \<bullet> prf3) \<bullet> prf4) \<equiv>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   236
    (iffD1 \<cdot> A \<cdot> B \<bullet> prf1 \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   237
      (iffD2 \<cdot> A \<cdot> C \<bullet> prf3 \<bullet> (iffD2 \<cdot> C \<cdot> D \<bullet> prf2 \<bullet> prf4)))\<close>,
13404
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   238
67094
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   239
   \<open>(iffD1 \<cdot> A \<cdot> C \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   240
      (iffD2 \<cdot> A = C \<cdot> B = D \<bullet> (cong \<cdot> TYPE(bool) \<cdot> TYPE('T1) \<cdot> x1 \<cdot> x2 \<cdot> C \<cdot> D \<bullet> prfb \<bullet> prfT1 \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   241
        (cong \<cdot> TYPE(bool) \<cdot> TYPE('T2) \<cdot> op = \<cdot> op = \<cdot> A \<cdot> B \<bullet> prfb \<bullet> prfT2 \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   242
          (HOL.refl \<cdot> TYPE('T3) \<cdot> op = \<bullet> prfT3) \<bullet> prf1) \<bullet> prf2) \<bullet> prf3) \<bullet> prf4)\<equiv>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   243
    (iffD2 \<cdot> C \<cdot> D \<bullet> prf2 \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   244
      (iffD1 \<cdot> B \<cdot> D \<bullet> prf3 \<bullet> (iffD1 \<cdot> A \<cdot> B \<bullet> prf1 \<bullet> prf4)))\<close>,
13404
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   245
67094
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   246
   \<open>(iffD2 \<cdot> A \<cdot> C \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   247
      (iffD2 \<cdot> A = C \<cdot> B = D \<bullet> (cong \<cdot> TYPE(bool) \<cdot> TYPE('T1) \<cdot> x1 \<cdot> x2 \<cdot> C \<cdot> D \<bullet> prfb \<bullet> prfT1 \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   248
        (cong \<cdot> TYPE(bool) \<cdot> TYPE('T2) \<cdot> op = \<cdot> op = \<cdot> A \<cdot> B \<bullet> prfb \<bullet> prfT2 \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   249
          (HOL.refl \<cdot> TYPE('T3) \<cdot> op = \<bullet> prfT3) \<bullet> prf1) \<bullet> prf2) \<bullet> prf3) \<bullet> prf4) \<equiv>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   250
    (iffD2 \<cdot> A \<cdot> B \<bullet> prf1 \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   251
      (iffD2 \<cdot> B \<cdot> D \<bullet> prf3 \<bullet> (iffD1 \<cdot> C \<cdot> D \<bullet> prf2 \<bullet> prf4)))\<close>,
13404
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   252
67094
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   253
   \<open>(cong \<cdot> TYPE(bool) \<cdot> TYPE(bool) \<cdot> op = A \<cdot> op = A \<cdot> B \<cdot> C \<bullet> prfb \<bullet> prfb \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   254
      (HOL.refl \<cdot> TYPE(bool\<Rightarrow>bool) \<cdot> op = A \<bullet> prfbb)) \<equiv>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   255
    (cong \<cdot> TYPE(bool) \<cdot> TYPE(bool) \<cdot> op = A \<cdot> op = A \<cdot> B \<cdot> C \<bullet> prfb \<bullet> prfb \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   256
      (cong \<cdot> TYPE(bool) \<cdot> TYPE(bool\<Rightarrow>bool) \<cdot>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   257
        (op = :: bool\<Rightarrow>bool\<Rightarrow>bool) \<cdot> (op = :: bool\<Rightarrow>bool\<Rightarrow>bool) \<cdot> A \<cdot> A \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   258
          prfb \<bullet> prfbb \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   259
          (HOL.refl \<cdot> TYPE(bool\<Rightarrow>bool\<Rightarrow>bool) \<cdot> (op = :: bool\<Rightarrow>bool\<Rightarrow>bool) \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   260
             (OfClass type_class \<cdot> TYPE(bool\<Rightarrow>bool\<Rightarrow>bool))) \<bullet>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   261
          (HOL.refl \<cdot> TYPE(bool) \<cdot> A \<bullet> prfb)))\<close>,
13404
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   262
13916
f078a758e5d8 elim_cong now eta-expands proofs on the fly if required.
berghofe
parents: 13602
diff changeset
   263
   (** transitivity, reflexivity, and symmetry **)
f078a758e5d8 elim_cong now eta-expands proofs on the fly if required.
berghofe
parents: 13602
diff changeset
   264
67094
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   265
   \<open>(iffD1 \<cdot> A \<cdot> C \<bullet> (HOL.trans \<cdot> TYPE(bool) \<cdot> A \<cdot> B \<cdot> C \<bullet> prfb \<bullet> prf1 \<bullet> prf2) \<bullet> prf3) \<equiv>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   266
    (iffD1 \<cdot> B \<cdot> C \<bullet> prf2 \<bullet> (iffD1 \<cdot> A \<cdot> B \<bullet> prf1 \<bullet> prf3))\<close>,
13404
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   267
67094
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   268
   \<open>(iffD2 \<cdot> A \<cdot> C \<bullet> (HOL.trans \<cdot> TYPE(bool) \<cdot> A \<cdot> B \<cdot> C \<bullet> prfb \<bullet> prf1 \<bullet> prf2) \<bullet> prf3) \<equiv>
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   269
    (iffD2 \<cdot> A \<cdot> B \<bullet> prf1 \<bullet> (iffD2 \<cdot> B \<cdot> C \<bullet> prf2 \<bullet> prf3))\<close>,
13404
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   270
67094
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   271
   \<open>(iffD1 \<cdot> A \<cdot> A \<bullet> (HOL.refl \<cdot> TYPE(bool) \<cdot> A \<bullet> prfb) \<bullet> prf) \<equiv> prf\<close>,
13404
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   272
67094
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   273
   \<open>(iffD2 \<cdot> A \<cdot> A \<bullet> (HOL.refl \<cdot> TYPE(bool) \<cdot> A \<bullet> prfb) \<bullet> prf) \<equiv> prf\<close>,
13404
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   274
67094
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   275
   \<open>(iffD1 \<cdot> A \<cdot> B \<bullet> (sym \<cdot> TYPE(bool) \<cdot> B \<cdot> A \<bullet> prfb \<bullet> prf)) \<equiv> (iffD2 \<cdot> B \<cdot> A \<bullet> prf)\<close>,
13602
4cecd1e0f4a9 - additional congruence rules for boolean operators
berghofe
parents: 13404
diff changeset
   276
67094
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   277
   \<open>(iffD2 \<cdot> A \<cdot> B \<bullet> (sym \<cdot> TYPE(bool) \<cdot> B \<cdot> A \<bullet> prfb \<bullet> prf)) \<equiv> (iffD1 \<cdot> B \<cdot> A \<bullet> prf)\<close>,
13602
4cecd1e0f4a9 - additional congruence rules for boolean operators
berghofe
parents: 13404
diff changeset
   278
13404
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   279
   (** normalization of HOL proofs **)
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   280
67094
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   281
   \<open>(mp \<cdot> A \<cdot> B \<bullet> (impI \<cdot> A \<cdot> B \<bullet> prf)) \<equiv> prf\<close>,
13404
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   282
67094
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   283
   \<open>(impI \<cdot> A \<cdot> B \<bullet> (mp \<cdot> A \<cdot> B \<bullet> prf)) \<equiv> prf\<close>,
13404
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   284
67094
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   285
   \<open>(spec \<cdot> TYPE('a) \<cdot> P \<cdot> x \<bullet> prfa \<bullet> (allI \<cdot> TYPE('a) \<cdot> P \<bullet> prfa \<bullet> prf)) \<equiv> prf \<cdot> x\<close>,
13404
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   286
67094
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   287
   \<open>(allI \<cdot> TYPE('a) \<cdot> P \<bullet> prfa \<bullet> (\<^bold>\<lambda>x::'a. spec \<cdot> TYPE('a) \<cdot> P \<cdot> x \<bullet> prfa \<bullet> prf)) \<equiv> prf\<close>,
13404
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   288
67094
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   289
   \<open>(exE \<cdot> TYPE('a) \<cdot> P \<cdot> Q \<bullet> prfa \<bullet> (exI \<cdot> TYPE('a) \<cdot> P \<cdot> x \<bullet> prfa \<bullet> prf1) \<bullet> prf2) \<equiv> (prf2 \<cdot> x \<bullet> prf1)\<close>,
13602
4cecd1e0f4a9 - additional congruence rules for boolean operators
berghofe
parents: 13404
diff changeset
   290
67094
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   291
   \<open>(exE \<cdot> TYPE('a) \<cdot> P \<cdot> Q \<bullet> prfa \<bullet> prf \<bullet> (exI \<cdot> TYPE('a) \<cdot> P \<bullet> prfa)) \<equiv> prf\<close>,
13602
4cecd1e0f4a9 - additional congruence rules for boolean operators
berghofe
parents: 13404
diff changeset
   292
67094
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   293
   \<open>(disjE \<cdot> P \<cdot> Q \<cdot> R \<bullet> (disjI1 \<cdot> P \<cdot> Q \<bullet> prf1) \<bullet> prf2 \<bullet> prf3) \<equiv> (prf2 \<bullet> prf1)\<close>,
13404
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   294
67094
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   295
   \<open>(disjE \<cdot> P \<cdot> Q \<cdot> R \<bullet> (disjI2 \<cdot> Q \<cdot> P \<bullet> prf1) \<bullet> prf2 \<bullet> prf3) \<equiv> (prf3 \<bullet> prf1)\<close>,
13404
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   296
67094
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   297
   \<open>(conjunct1 \<cdot> P \<cdot> Q \<bullet> (conjI \<cdot> P \<cdot> Q \<bullet> prf1 \<bullet> prf2)) \<equiv> prf1\<close>,
13404
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   298
67094
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   299
   \<open>(conjunct2 \<cdot> P \<cdot> Q \<bullet> (conjI \<cdot> P \<cdot> Q \<bullet> prf1 \<bullet> prf2)) \<equiv> prf2\<close>,
13404
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   300
67094
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   301
   \<open>(iffD1 \<cdot> A \<cdot> B \<bullet> (iffI \<cdot> A \<cdot> B \<bullet> prf1 \<bullet> prf2)) \<equiv> prf1\<close>,
13404
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   302
67094
4a2563645635 more symbols;
wenzelm
parents: 67093
diff changeset
   303
   \<open>(iffD2 \<cdot> A \<cdot> B \<bullet> (iffI \<cdot> A \<cdot> B \<bullet> prf1 \<bullet> prf2)) \<equiv> prf2\<close>];
13404
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   304
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   305
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   306
(** Replace congruence rules by substitution rules **)
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   307
28801
fc45401bdf6f ProofSyntax.proof_of_term: removed obsolete disambiguisation table;
wenzelm
parents: 28712
diff changeset
   308
fun strip_cong ps (PThm (_, (("HOL.cong", _, _), _)) % _ % _ % SOME x % SOME y %%
37233
b78f31ca4675 Adapted to new format of proof terms containing explicit proofs of class membership.
berghofe
parents: 36042
diff changeset
   309
      prfa %% prfT %% prf1 %% prf2) = strip_cong (((x, y), (prf2, prfa)) :: ps) prf1
b78f31ca4675 Adapted to new format of proof terms containing explicit proofs of class membership.
berghofe
parents: 36042
diff changeset
   310
  | strip_cong ps (PThm (_, (("HOL.refl", _, _), _)) % SOME f %% _) = SOME (f, ps)
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15530
diff changeset
   311
  | strip_cong _ _ = NONE;
13404
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   312
37310
96e2b9a6f074 do not open Proofterm, which is very ould style;
wenzelm
parents: 37233
diff changeset
   313
val subst_prf = fst (Proofterm.strip_combt (fst (Proofterm.strip_combP (Thm.proof_of subst))));
96e2b9a6f074 do not open Proofterm, which is very ould style;
wenzelm
parents: 37233
diff changeset
   314
val sym_prf = fst (Proofterm.strip_combt (fst (Proofterm.strip_combP (Thm.proof_of sym))));
13404
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   315
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   316
fun make_subst Ts prf xs (_, []) = prf
37233
b78f31ca4675 Adapted to new format of proof terms containing explicit proofs of class membership.
berghofe
parents: 36042
diff changeset
   317
  | make_subst Ts prf xs (f, ((x, y), (prf', clprf)) :: ps) =
13404
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   318
      let val T = fastype_of1 (Ts, x)
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   319
      in if x aconv y then make_subst Ts prf (xs @ [x]) (f, ps)
37310
96e2b9a6f074 do not open Proofterm, which is very ould style;
wenzelm
parents: 37233
diff changeset
   320
        else Proofterm.change_type (SOME [T]) subst_prf %> x %> y %>
13404
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   321
          Abs ("z", T, list_comb (incr_boundvars 1 f,
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   322
            map (incr_boundvars 1) xs @ Bound 0 ::
37233
b78f31ca4675 Adapted to new format of proof terms containing explicit proofs of class membership.
berghofe
parents: 36042
diff changeset
   323
            map (incr_boundvars 1 o snd o fst) ps)) %% clprf %% prf' %%
13404
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   324
          make_subst Ts prf (xs @ [x]) (f, ps)
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   325
      end;
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   326
37233
b78f31ca4675 Adapted to new format of proof terms containing explicit proofs of class membership.
berghofe
parents: 36042
diff changeset
   327
fun make_sym Ts ((x, y), (prf, clprf)) =
37310
96e2b9a6f074 do not open Proofterm, which is very ould style;
wenzelm
parents: 37233
diff changeset
   328
  ((y, x),
96e2b9a6f074 do not open Proofterm, which is very ould style;
wenzelm
parents: 37233
diff changeset
   329
    (Proofterm.change_type (SOME [fastype_of1 (Ts, x)]) sym_prf %> x %> y %% clprf %% prf, clprf));
13404
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   330
22277
b89dc456dbc6 Fixed bug in mk_AbsP.
berghofe
parents: 21646
diff changeset
   331
fun mk_AbsP P t = AbsP ("H", Option.map HOLogic.mk_Trueprop P, t);
13916
f078a758e5d8 elim_cong now eta-expands proofs on the fly if required.
berghofe
parents: 13602
diff changeset
   332
33722
e588744f14da generalized procs for rewrite_proof: allow skeleton;
wenzelm
parents: 33388
diff changeset
   333
fun elim_cong_aux Ts (PThm (_, (("HOL.iffD1", _, _), _)) % _ % _ %% prf1 %% prf2) =
15570
8d8c70b41bab Move towards standard functions.
skalberg
parents: 15531
diff changeset
   334
      Option.map (make_subst Ts prf2 []) (strip_cong [] prf1)
33722
e588744f14da generalized procs for rewrite_proof: allow skeleton;
wenzelm
parents: 33388
diff changeset
   335
  | elim_cong_aux Ts (PThm (_, (("HOL.iffD1", _, _), _)) % P % _ %% prf) =
15570
8d8c70b41bab Move towards standard functions.
skalberg
parents: 15531
diff changeset
   336
      Option.map (mk_AbsP P o make_subst Ts (PBound 0) [])
37310
96e2b9a6f074 do not open Proofterm, which is very ould style;
wenzelm
parents: 37233
diff changeset
   337
        (strip_cong [] (Proofterm.incr_pboundvars 1 0 prf))
33722
e588744f14da generalized procs for rewrite_proof: allow skeleton;
wenzelm
parents: 33388
diff changeset
   338
  | elim_cong_aux Ts (PThm (_, (("HOL.iffD2", _, _), _)) % _ % _ %% prf1 %% prf2) =
15570
8d8c70b41bab Move towards standard functions.
skalberg
parents: 15531
diff changeset
   339
      Option.map (make_subst Ts prf2 [] o
13404
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   340
        apsnd (map (make_sym Ts))) (strip_cong [] prf1)
33722
e588744f14da generalized procs for rewrite_proof: allow skeleton;
wenzelm
parents: 33388
diff changeset
   341
  | elim_cong_aux Ts (PThm (_, (("HOL.iffD2", _, _), _)) % _ % P %% prf) =
15570
8d8c70b41bab Move towards standard functions.
skalberg
parents: 15531
diff changeset
   342
      Option.map (mk_AbsP P o make_subst Ts (PBound 0) [] o
37310
96e2b9a6f074 do not open Proofterm, which is very ould style;
wenzelm
parents: 37233
diff changeset
   343
        apsnd (map (make_sym Ts))) (strip_cong [] (Proofterm.incr_pboundvars 1 0 prf))
33722
e588744f14da generalized procs for rewrite_proof: allow skeleton;
wenzelm
parents: 33388
diff changeset
   344
  | elim_cong_aux _ _ = NONE;
e588744f14da generalized procs for rewrite_proof: allow skeleton;
wenzelm
parents: 33388
diff changeset
   345
37310
96e2b9a6f074 do not open Proofterm, which is very ould style;
wenzelm
parents: 37233
diff changeset
   346
fun elim_cong Ts hs prf = Option.map (rpair Proofterm.no_skel) (elim_cong_aux Ts prf);
13404
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   347
eeac2bbfe958 Rules for rewriting HOL proofs.
berghofe
parents:
diff changeset
   348
end;