prove_inductive_relations_exist : term -> thm

SYNOPSIS
Prove existence of inductively defined relations without defining them.

DESCRIPTION
The function prove_inductive_relations_exist should be given a specification for an inductively defined relation R, or more generally a family R1,...,Rn of mutually inductive relations; the required format is explained further in the entry for new_inductive_definition. It returns an existential theorem A |- ?R1 ... Rn. rules /\ induction /\ cases, where rules, induction and cases are the rule, induction and cases theorems, explained further in the entry for new_inductive_definition. In contrast with new_inductive_definition, no actual definitions are made. The assumption list A is normally empty, but will include any monotonicity hypotheses that were not proven automatically.

FAILURE CONDITIONS
Fails if the form of the rules is wrong.

EXAMPLE
The traditional example of even and odd numbers:
  # prove_inductive_relations_exist
     `even(0) /\ odd(1) /\
      (!n. even(n) ==> odd(n + 1)) /\
      (!n. odd(n) ==> even(n + 1))`;;
  val it : thm =
    |- ?even odd.
           (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))
Here is a example where we get a nonempty list of hypotheses because HOL cannot prove monotonicity (and indeed, it doesn't hold).
  # prove_inductive_relations_exist `!x. ~P(x) ==> P(x+1)`;;
  val it : thm =
    !P P'.
        (!a. P a ==> P' a)
        ==> (!a. (?x. a = x + 1 /\ ~P x) ==> (?x. a = x + 1 /\ ~P' x))
    |- ?P. (!x. ~P x ==> P (x + 1)) /\
           (!P'. (!x. ~P' x ==> P' (x + 1)) ==> (!a. P a ==> P' a)) /\
           (!a. P a <=> (?x. a = x + 1 /\ ~P x))

USES
Using existence of inductive relations as an auxiliary device inside a proof.

SEE ALSO
derive_strong_induction, new_inductive_definition, prove_monotonicity_hyps.