src/HOL/Tools/function_package/induction_scheme.ML
author wenzelm
Wed, 18 Jun 2008 16:55:44 +0200
changeset 27249 f339dc43ce9f
parent 26653 60e0cf6bef89
child 27271 ba2a00d35df1
permissions -rw-r--r--
updated generated file;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
25589
9385f043b910 added Id, some cleanup
krauss
parents: 25567
diff changeset
     1
(*  Title:      HOL/Tools/function_package/induction_scheme.ML
9385f043b910 added Id, some cleanup
krauss
parents: 25567
diff changeset
     2
    ID:         $Id$
9385f043b910 added Id, some cleanup
krauss
parents: 25567
diff changeset
     3
    Author:     Alexander Krauss, TU Muenchen
9385f043b910 added Id, some cleanup
krauss
parents: 25567
diff changeset
     4
9385f043b910 added Id, some cleanup
krauss
parents: 25567
diff changeset
     5
A method to prove induction schemes.
9385f043b910 added Id, some cleanup
krauss
parents: 25567
diff changeset
     6
*)
25567
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
     7
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
     8
signature INDUCTION_SCHEME =
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
     9
sig
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    10
  val mk_ind_tac : Proof.context -> thm list -> tactic  
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    11
  val setup : theory -> theory
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    12
end
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    13
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    14
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    15
structure InductionScheme : INDUCTION_SCHEME =
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    16
struct
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    17
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    18
open FundefLib
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    19
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    20
type rec_call_info = (string * typ) list * term list * term
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    21
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    22
datatype scheme_case =
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    23
  SchemeCase of
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    24
  {
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    25
   qs: (string * typ) list,
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    26
   gs: term list,
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    27
   lhs: term,
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    28
   rs: rec_call_info list
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    29
  }
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    30
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    31
datatype ind_scheme =
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    32
  IndScheme of
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    33
  {
26644
2f12191282e2 proper context for induct_scheme method
krauss
parents: 25589
diff changeset
    34
   (*cvars : (string, typ) list,       
2f12191282e2 proper context for induct_scheme method
krauss
parents: 25589
diff changeset
    35
   cassms : term list,    *)     (* additional context for partial rules *)
25567
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    36
   T: typ,
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    37
   cases: scheme_case list
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    38
  }
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    39
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    40
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    41
fun mk_relT T = HOLogic.mk_setT (HOLogic.mk_prodT (T, T))
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    42
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    43
fun dest_hhf ctxt t = 
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    44
    let 
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    45
      val (ctxt', vars, imp) = dest_all_all_ctx ctxt t
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    46
    in
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    47
      (ctxt', vars, Logic.strip_imp_prems imp, Logic.strip_imp_concl imp)
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    48
    end
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    49
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    50
fun mk_case P ctxt premise =
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    51
    let
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    52
      val (ctxt', qs, prems, concl) = dest_hhf ctxt premise
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    53
      val _ $ (_ $ lhs) = concl 
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    54
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    55
      fun mk_rcinfo pr =
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    56
          let
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    57
            val (ctxt'', Gvs, Gas, _ $ (_ $ rcarg)) = dest_hhf ctxt' pr
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    58
          in
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    59
            (Gvs, Gas, rcarg)
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    60
          end
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    61
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    62
      val (gs, rcprs) = take_prefix (not o exists_aterm (fn Free v => v = P | _ => false)) prems
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    63
    in
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    64
      SchemeCase {qs=qs, gs=gs, lhs=lhs, rs=map mk_rcinfo rcprs}
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    65
    end
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    66
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    67
fun mk_scheme' ctxt cases (Pn, PT) =
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    68
    IndScheme {T=domain_type PT, cases=map (mk_case (Pn,PT) ctxt) cases }
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    69
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    70
fun mk_completeness ctxt (IndScheme {T, cases}) =
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    71
    let
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    72
      val allqnames = fold (fn SchemeCase {qs, ...} => fold (insert (op =) o Free) qs) cases []
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    73
      val [Pbool, x] = map Free (Variable.variant_frees ctxt allqnames [("P", HOLogic.boolT), ("x", T)])
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    74
                       
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    75
      fun mk_case (SchemeCase {qs, gs, lhs, ...}) =
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    76
          HOLogic.mk_Trueprop Pbool
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    77
                     |> curry Logic.mk_implies (HOLogic.mk_Trueprop (HOLogic.mk_eq (x, lhs)))
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    78
                     |> fold_rev (curry Logic.mk_implies) gs
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    79
                     |> fold_rev (mk_forall o Free) qs
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    80
    in
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    81
      HOLogic.mk_Trueprop Pbool
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    82
       |> fold_rev (curry Logic.mk_implies o mk_case) cases
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    83
       |> mk_forall_rename ("x", x)
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    84
       |> mk_forall_rename ("P", Pbool)
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    85
    end
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    86
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    87
fun mk_wf ctxt R (IndScheme {T, ...}) =
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    88
    HOLogic.Trueprop $ (Const (@{const_name "wf"}, mk_relT T --> HOLogic.boolT) $ R)
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    89
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    90
fun mk_ineqs R (IndScheme {T, cases}) =
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    91
    let
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    92
      fun f (SchemeCase {qs, gs, lhs, rs, ...}) = 
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    93
          let
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    94
            fun g (Gvs, Gas, rcarg) =
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    95
                HOLogic.mk_mem (HOLogic.mk_prod (rcarg, lhs), R)
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    96
                  |> HOLogic.mk_Trueprop
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    97
                  |> fold_rev (curry Logic.mk_implies) Gas
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    98
                  |> fold_rev (curry Logic.mk_implies) gs
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
    99
                  |> fold_rev (mk_forall o Free) Gvs
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   100
                  |> fold_rev (mk_forall o Free) qs
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   101
          in
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   102
            map g rs
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   103
          end
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   104
    in
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   105
      map f cases
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   106
    end
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   107
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   108
26644
2f12191282e2 proper context for induct_scheme method
krauss
parents: 25589
diff changeset
   109
fun mk_induct_rule ctxt R P x complete_thm wf_thm ineqss (IndScheme {T, cases=scases}) =
25567
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   110
    let
26644
2f12191282e2 proper context for induct_scheme method
krauss
parents: 25589
diff changeset
   111
      val thy = ProofContext.theory_of ctxt
2f12191282e2 proper context for induct_scheme method
krauss
parents: 25589
diff changeset
   112
      val cert = cterm_of thy 
25567
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   113
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   114
      (* Inductive Hypothesis: !!z. (z,x):R ==> P z *)
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   115
      val ihyp = all T $ Abs ("z", T, 
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   116
               implies $ 
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   117
                  HOLogic.mk_Trueprop (
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   118
                  Const ("op :", HOLogic.mk_prodT (T, T) --> mk_relT T --> HOLogic.boolT) 
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   119
                    $ (HOLogic.pair_const T T $ Bound 0 $ x) 
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   120
                    $ R)
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   121
             $ HOLogic.mk_Trueprop (P $ Bound 0))
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   122
           |> cert
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   123
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   124
      val aihyp = assume ihyp
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   125
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   126
      fun prove_case (SchemeCase {qs, gs, lhs, rs, ...}) ineqs =
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   127
          let
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   128
            val case_hyp = assume (cert (HOLogic.Trueprop $ (HOLogic.mk_eq (x, lhs))))
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   129
                           
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   130
            val cqs = map (cert o Free) qs
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   131
            val ags = map (assume o cert) gs
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   132
                      
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   133
            val replace_x_ss = HOL_basic_ss addsimps [case_hyp]
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   134
            val sih = full_simplify replace_x_ss aihyp
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   135
                      
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   136
            fun mk_Prec (Gvs, Gas, rcarg) ineq =
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   137
                let
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   138
                  val cGas = map (assume o cert) Gas
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   139
                  val cGvs = map (cert o Free) Gvs
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   140
                  val loc_ineq = ineq 
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   141
                                   |> fold forall_elim (cqs @ cGvs)
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   142
                                   |> fold Thm.elim_implies (ags @ cGas)
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   143
                in
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   144
                  sih |> forall_elim (cert rcarg)
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   145
                      |> Thm.elim_implies loc_ineq
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   146
                      |> fold_rev (implies_intr o cprop_of) cGas
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   147
                      |> fold_rev forall_intr cGvs
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   148
                end
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   149
                
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   150
            val P_recs = map2 mk_Prec rs ineqs   (*  [P rec1, P rec2, ... ]  *)
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   151
                         
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   152
            val step = HOLogic.mk_Trueprop (P $ lhs)
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   153
                                           |> fold_rev (curry Logic.mk_implies o prop_of) P_recs
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   154
                                           |> fold_rev (curry Logic.mk_implies) gs
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   155
                                           |> fold_rev (mk_forall o Free) qs
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   156
                                           |> cert
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   157
                       
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   158
            val res = assume step
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   159
                       |> fold forall_elim cqs
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   160
                       |> fold Thm.elim_implies ags
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   161
                       |> fold Thm.elim_implies P_recs
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   162
                       |> Conv.fconv_rule 
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   163
                       (Conv.arg_conv (Conv.arg_conv (K (Thm.symmetric (case_hyp RS eq_reflection))))) 
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   164
                       (* "P x" *)
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   165
                       |> implies_intr (cprop_of case_hyp)
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   166
                       |> fold_rev (implies_intr o cprop_of) ags
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   167
                       |> fold_rev forall_intr cqs
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   168
          in
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   169
            (res, step)
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   170
          end
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   171
          
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   172
      val (cases, steps) = split_list (map2 prove_case scases ineqss)
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   173
                           
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   174
      val istep = complete_thm 
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   175
                |> forall_elim (cert (P $ x))
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   176
                |> forall_elim (cert x)
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   177
                |> fold (Thm.elim_implies) cases
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   178
                |> implies_intr ihyp
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   179
                |> forall_intr (cert x) (* "!!x. (!!y<x. P y) ==> P x" *)
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   180
         
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   181
      val induct_rule =
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   182
          @{thm "wf_induct_rule"}
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   183
            |> (curry op COMP) wf_thm 
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   184
            |> (curry op COMP) istep
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   185
            |> fold_rev implies_intr steps
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   186
            |> forall_intr (cert P)
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   187
    in
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   188
      induct_rule
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   189
    end
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   190
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   191
fun mk_ind_tac ctxt facts = (ALLGOALS (Method.insert_tac facts)) THEN HEADGOAL 
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   192
(SUBGOAL (fn (t, i) =>
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   193
  let
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   194
    val (ctxt', _, cases, concl) = dest_hhf ctxt t
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   195
                                   
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   196
    fun get_types t = 
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   197
        let
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   198
          val (P, vs) = strip_comb (HOLogic.dest_Trueprop t)
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   199
          val Ts = map fastype_of vs
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   200
          val tupT = foldr1 HOLogic.mk_prodT Ts
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   201
        in 
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   202
          ((P, Ts), tupT)
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   203
        end
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   204
        
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   205
    val concls = Logic.dest_conjunction_list (Logic.strip_imp_concl concl)
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   206
    val (PTss, tupTs) = split_list (map get_types concls)
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   207
                        
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   208
    val n = length tupTs
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   209
    val ST = BalancedTree.make (uncurry SumTree.mk_sumT) tupTs
26644
2f12191282e2 proper context for induct_scheme method
krauss
parents: 25589
diff changeset
   210
2f12191282e2 proper context for induct_scheme method
krauss
parents: 25589
diff changeset
   211
    val ([Psn, Rn, xn], ctxt'') = Variable.variant_fixes ["Psum", "R", "x"] ctxt'
2f12191282e2 proper context for induct_scheme method
krauss
parents: 25589
diff changeset
   212
    val Psum = (Psn, ST --> HOLogic.boolT)
2f12191282e2 proper context for induct_scheme method
krauss
parents: 25589
diff changeset
   213
    val R = Free (Rn, mk_relT ST)
2f12191282e2 proper context for induct_scheme method
krauss
parents: 25589
diff changeset
   214
    val x = Free (xn, ST)
25567
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   215
               
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   216
    fun mk_rews (i, (P, Ts)) = 
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   217
        let
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   218
          val vs = map_index (fn (j,T) => Free ("x" ^ string_of_int j, T)) Ts 
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   219
          val t = Free Psum $ SumTree.mk_inj ST n (i + 1) (foldr1 HOLogic.mk_prod vs)
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   220
                       |> fold_rev lambda vs
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   221
        in
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   222
          (P, t)
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   223
        end
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   224
        
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   225
    val rews = map_index mk_rews PTss
26644
2f12191282e2 proper context for induct_scheme method
krauss
parents: 25589
diff changeset
   226
    val thy = ProofContext.theory_of ctxt''
25567
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   227
    val cases' = map (Pattern.rewrite_term thy rews []) cases
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   228
                 
26644
2f12191282e2 proper context for induct_scheme method
krauss
parents: 25589
diff changeset
   229
    val scheme = mk_scheme' ctxt'' cases' Psum
25567
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   230
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   231
    val cert = cterm_of thy
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   232
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   233
    val ineqss = mk_ineqs R scheme
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   234
                   |> map (map (assume o cert))
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   235
    val complete = mk_completeness ctxt scheme |> cert |> assume
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   236
    val wf_thm = mk_wf ctxt R scheme |> cert |> assume
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   237
26644
2f12191282e2 proper context for induct_scheme method
krauss
parents: 25589
diff changeset
   238
    val indthm = mk_induct_rule ctxt'' R (Free Psum) x complete wf_thm ineqss scheme
25567
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   239
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   240
    fun mk_P (P, Ts) = 
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   241
        let
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   242
          val avars = map_index (fn (i,T) => Var (("a", i), T)) Ts
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   243
          val atup = foldr1 HOLogic.mk_prod avars
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   244
        in
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   245
          tupled_lambda atup (list_comb (P, avars))
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   246
        end
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   247
          
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   248
    val case_exp = cert (SumTree.mk_sumcases HOLogic.boolT (map mk_P PTss))
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   249
    val acases = map (assume o cert) cases
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   250
    val indthm' = indthm |> forall_elim case_exp
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   251
                         |> full_simplify SumTree.sumcase_split_ss
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   252
                         |> fold Thm.elim_implies acases
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   253
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   254
    fun project (i,t) = 
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   255
        let
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   256
          val (P, vs) = strip_comb (HOLogic.dest_Trueprop t)
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   257
          val inst = cert (SumTree.mk_inj ST n (i + 1) (foldr1 HOLogic.mk_prod vs))
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   258
        in
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   259
          indthm' |> Drule.instantiate' [] [SOME inst]
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   260
                  |> simplify SumTree.sumcase_split_ss
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   261
        end                  
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   262
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   263
    val res = Conjunction.intr_balanced (map_index project concls)
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   264
                |> fold_rev (implies_intr o cprop_of) acases
26653
60e0cf6bef89 Thm.forall_elim_var(s);
wenzelm
parents: 26644
diff changeset
   265
                |> Thm.forall_elim_vars 0
25567
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   266
        in
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   267
          (fn st =>
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   268
        Drule.compose_single (res, i, st)
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   269
          |> fold_rev (implies_intr o cprop_of) (complete :: wf_thm :: flat ineqss)
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   270
          |> forall_intr (cert R)
26653
60e0cf6bef89 Thm.forall_elim_var(s);
wenzelm
parents: 26644
diff changeset
   271
          |> Thm.forall_elim_vars 0
25567
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   272
          |> Seq.single
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   273
          )
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   274
  end))
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   275
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   276
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   277
val setup = Method.add_methods
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   278
  [("induct_scheme", Method.ctxt_args (Method.RAW_METHOD o mk_ind_tac),
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   279
    "proves an induction principle")]
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   280
5720345ea689 experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff changeset
   281
end