\DOC tprove \SYNOPSIS

advertisement
\DOC tprove
\TYPE {tprove : defn * tactic -> thm * thm}
\SYNOPSIS
Prove termination of a {defn}.
\KEYWORDS
recursive definition, termination.
\DESCRIBE
{tprove} takes a {defn} and a {tactic}, and uses the tactic to prove the
termination constraints of the {defn}. A pair of theorems {(eqns,ind)}
is returned: {eqns} is the unconstrained recursion equations of the
{defn}, and {ind} is the corresponding induction theorem for the
equations, also unconstrained.
{tprove} and {tgoal} can be seen as analogues of {prove} and {set_goal}
in the specialized domain of proving termination of recursive functions.
It is up to the user to store the results of {tprove} in the current
theory segment.
\FAILURE
{tprove (defn,tac)} fails if {tac} fails to prove the termination
conditions of {defn}.
{tprove (defn,tac)} fails if {defn} represents a non-recursive or
primitive recursive function.
\EXAMPLE
Suppose that we have defined a version of Quicksort as follows:
{
- val qsort_defn =
Hol_defn "qsort"
`(qsort ___ [] = []) /\
(qsort ord (x::rst) =
APPEND (qsort ord (FILTER ($~ o ord x) rst))
(x :: qsort ord (FILTER (ord x) rst)))`
}
Also suppose that a tactic {tac} proves termination of
{qsort}. (This tactic has probably been built by interactive proof
after starting a goalstack with {tgoal qsort_defn}.) Then
{
- val (qsort_eqns, qsort_ind) = tprove(qsort_defn, tac);
> val qsort_eqns =
|- (qsort v0 [] = []) /\
(qsort ord (x::rst) =
APPEND (qsort ord (FILTER ($~ o ord x) rst))
(x::qsort ord (FILTER (ord x) rst))) : thm
val qsort_ind =
|- !P.
(!v0. P v0 []) /\
(!ord x rst.
P ord (FILTER ($~ o ord x) rst) /\
P ord (FILTER (ord x) rst) ==> P ord (x::rst))
==>
!v v1. P v v1 : thm
}
\COMMENTS
The recursion equations returned by a successful invocation of {tprove}
are automatically added to the global {compset} accessed by {EVAL}.
\SEEALSO
Defn.tgoal, Defn.Hol_defn, bossLib.EVAL.
\ENDDOC
Download