pure_prove_recursive_function_exists : term -> thm
- SYNOPSIS
-
Proves existence of general recursive function but leaves unproven assumptions.
- DESCRIPTION
-
The function pure_prove_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
in general one or two assumptions stating what properties must hold so that the
existence of such a function to be deduced. 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. This rule attempts to eliminate any hypotheses of the
first kind, but does not attempt to guess a wellfounded ordering as
prove_general_recursive_function_exists does.
- 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 the mutual consistency hypotheses:
# pure_prove_recursive_function_exists
`?fib. fib 0 = 1 /\ fib 1 = 1 /\
!n. fib(n + 2) = fib(n) + fib(n + 1)`;;
val it : thm =
?(<<). WF (<<) /\ (!n. T ==> n << n + 2) /\ (!n. T ==> n + 1 << n + 2)
|- ?fib. fib 0 = 1 /\ fib 1 = 1 /\ (!n. fib (n + 2) = fib n + fib (n + 1))
but leaves a wellfounded ordering to be given. (By contrast,
prove_general_recursive_function_exists will automatically eliminate it.)
- USES
-
Normally, use prove_general_recursive_function_exists for this operation. Use
the present function only when the attempt by
prove_general_recursive_function_exists to discharge the proof obligations is
not successful and merely wastes time.
- SEE ALSO
-
define, instantiate_casewise_recursion,
prove_general_recursive_function_exists.