derive_nonschematic_inductive_relations : term -> thm

SYNOPSIS
Deduce inductive definitions properties from an explicit assignment.

DESCRIPTION
Given a set of clauses as given to new_inductive_definitions, the call derive_nonschematic_inductive_relations will introduce explicit equational constraints (``definitions'', though only assumptions of the theorem, not actually constant definitions) that allow it to deduce those clauses. It will in general have additional `monotonicity' hypotheses, but these may be removable by prove_monotonicity_hyps. None of the arguments are treated as schematic.

FAILURE CONDITIONS
Fails if the format of the clauses is wrong.

EXAMPLE
Here we try one of the classic examples of a mutually inductive definition, defining odd-ness and even-ness of natural numbers:
  # (prove_monotonicity_hyps o derive_nonschematic_inductive_relations)
      `even(0) /\ odd(1) /\
       (!n. even(n) ==> odd(n + 1)) /\ (!n. odd(n) ==> even(n + 1))`;;
  val it : thm =
    odd =
    (\a0. !odd' even'.
              (!a0. a0 = 1 \/ (?n. a0 = n + 1 /\ even' n) ==> odd' a0) /\
              (!a1. a1 = 0 \/ (?n. a1 = n + 1 /\ odd' n) ==> even' a1)
              ==> odd' a0),
    even =
    (\a1. !odd' even'.
              (!a0. a0 = 1 \/ (?n. a0 = n + 1 /\ even' n) ==> odd' a0) /\
              (!a1. a1 = 0 \/ (?n. a1 = n + 1 /\ odd' n) ==> even' a1)
              ==> even' a1)
    |- (even 0 /\
        odd 1 /\
        (!n. even n ==> odd (n + 1)) /\
        (!n. odd n ==> even (n + 1))) /\
       (!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)) /\
       (!a0. odd a0 <=> a0 = 1 \/ (?n. a0 = n + 1 /\ even n)) /\
       (!a1. even a1 <=> a1 = 0 \/ (?n. a1 = n + 1 /\ odd n))
Note that the final theorem has two assumptions that one can think of as the appropriate explicit definitions of these relations, and the conclusion gives the rule, induction and cases theorems.

COMMENTS
Normally, use prove_inductive_relations_exist or new_inductive_definition. This function is only needed for a very fine level of control.

SEE ALSO
new_inductive_definition, prove_inductive_relations_exist, prove_monotonicity_hyps.