prove_general_recursive_function_exists : term -> thm

SYNOPSIS
Proves existence of general recursive function.

DESCRIPTION
The function prove_general_recursive_function_exists should be applied to an existentially quantified term `?f. def_1[f] /\ ... /\ def_n[f]`, where each clause def_i is a universally quantified equation with an application of f to arguments on the left-hand side. The idea is that these clauses define the action of f on arguments of various kinds, for example on an empty list and nonempty list:
  ?f. (f [] = a) /\ (!h t. CONS h t = k[f,h,t])
or on even numbers and odd numbers:
  ?f. (!n. f(2 * n) = a[f,n]) /\ (!n. f(2 * n + 1) = b[f,n])
The returned value is a theorem whose conclusion matches the input term, with zero, one or two assumptions, depending on what conditions had been proven automatically. Roughly, one assumption states that the clauses are not mutually contradictory, as in
  ?f. (!n. f(n + 1) = 1) /\ (!n. f(n + 2) = 2)
and the other states that there is some wellfounded order making any recursion admissible.

FAILURE CONDITIONS
Fails only if the definition is malformed. However it is possible that for an inadmissible definition the assumptions of the theorem may not hold.

EXAMPLE
In the definition of the Fibonacci numbers, the function successfully eliminates all the hypotheses and just proves the claimed existence assertion:
  # prove_general_recursive_function_exists
     `?fib. fib 0 = 1 /\ fib 1 = 1 /\
            !n. fib(n + 2) = fib(n) + fib(n + 1)`;;
  val it : thm =
    |- ?fib. fib 0 = 1 /\ fib 1 = 1 /\ (!n. fib (n + 2) = fib n + fib (n + 1))
whereas in the following case, the function cannot automatically discover the appropriate ordering to make the recursion admissible, so an assumption is included:
  # let eth = prove_general_recursive_function_exists
     `?upto. !m n. upto m n =
                    if n < m then []
                    else if m = n then [n]
                    else  CONS m (upto (m + 1) n)`;;
  val eth : thm =
    ?(<<). WF (<<) /\ (!m n. (T /\ ~(n < m)) /\ ~(m = n) ==> m + 1,n << m,n)
    |- ?upto. !m n.
                  upto m n =
                  (if n < m
                   then []
                   else if m = n then [n] else CONS m (upto (m + 1) n))
You can prove the condition by supplying an appropriate ordering, e.g.
  # let wfth = prove(hd(hyp eth),
                       EXISTS_TAC `MEASURE (\(m:num,n:num). n - m)` THEN
                       REWRITE_TAC[WF_MEASURE; MEASURE] THEN ARITH_TAC);;
  val wfth : thm =
    |- ?(<<). WF (<<) /\ (!m n. (T /\ ~(n < m)) /\ ~(m = n) ==> m + 1,n << m,n)
and so get the pure existence theorem with PROVE_HYP wfth eth.

USES
To prove existence of a recursive function defined by clauses without actually defining it. In order to define it, use define. To further forestall attempts to prove conditions automatically, consider pure_prove_recursive_function_exists or even instantiate_casewise_recursion.

SEE ALSO
define, instantiate_casewise_recursion, pure_prove_recursive_function_exists.