derive_strong_induction : thm * thm -> thm

SYNOPSIS
Derive stronger induction theorem from inductive definition.

DESCRIPTION
The function derive_strong_induction is applied to a pair of theorems as returned by new_inductive_definition. The first theorem is the `rule' theorem, the second the `induction' theorem; the `case' theorem returned by new_inductive_definition is not needed. It returns a stronger induction theorem where instances of each inductive predicate occurring in hypotheses is conjoined with the corresponding inductive relation too.

FAILURE CONDITIONS
Fails if the two input theorems are not of the correct form for rule and induction theorems returned by new_inductive_definition.

EXAMPLE
A simple example of a mutually inductive definition is:
  # let eo_RULES,eo_INDUCT, eo_CASES = new_inductive_definition
     `even(0) /\ odd(1) /\
      (!n. even(n) ==> odd(n + 1)) /\
      (!n. odd(n) ==> even(n + 1))`;;
  val eo_RULES : thm =
    |- even 0 /\
       odd 1 /\
       (!n. even n ==> odd (n + 1)) /\
       (!n. odd n ==> even (n + 1))
  val eo_INDUCT : thm =
    |- !odd' even'.
           even' 0 /\
           odd' 1 /\
           (!n. even' n ==> odd' (n + 1)) /\
           (!n. odd' n ==> even' (n + 1))
           ==> (!a0. odd a0 ==> odd' a0) /\ (!a1. even a1 ==> even' a1)
  val eo_CASES : thm =
    |- (!a0. odd a0 <=> a0 = 1 \/ (?n. a0 = n + 1 /\ even n)) /\
       (!a1. even a1 <=> a1 = 0 \/ (?n. a1 = n + 1 /\ odd n))
The stronger induction theorem can be derived as follows. Note that it is similar in form to eo_INDUCT but has stronger hypotheses for two of the conjuncts in the antecedent.
  # derive_strong_induction(eo_RULES,eo_INDUCT);;
  val it : thm =
    |- !odd' even'.
           even' 0 /\
           odd' 1 /\
           (!n. even n /\ even' n ==> odd' (n + 1)) /\
           (!n. odd n /\ odd' n ==> even' (n + 1))
           ==> (!a0. odd a0 ==> odd' a0) /\ (!a1. even a1 ==> even' a1)

COMMENTS
This function needs to discharge monotonicity theorems as part of its internal working, just as new_inductive_definition does when the inductive definition is made. Usually this is automatic and the user doesn't see it, but in difficult cases, the theorem returned may have additional monotonicity hypotheses that are unproven. In such cases, you can either try to prove them manually or extend monotonicity_theorems to make the built-in monotonicity prover more powerful.

SEE ALSO
new_inductive_definition, prove_inductive_relations_exist, prove_monotonicity_hyps.