\DOC Cases \TYPE {Cases : tactic} \SYNOPSIS

advertisement
\DOC Cases
\TYPE {Cases : tactic}
\SYNOPSIS
Performs case analysis on the variable of the leading universally
quantified variable of the goal.
\KEYWORDS
tactic
\LIBRARY
SingleStep
\DESCRIBE
When applied to a universally quantified goal {?- !u. G}, {Cases}
performs a
case-split, based on the cases theorem for the type of {u} stored in
the global {TypeBase} database.
The cases theorem for a type {ty} will be of the form:
{
|- !v:ty. (?x11...x1n1. v = C1 x11 ... x1n1) \/ .... \/
(?xm1...xmnm. v = Cm xm1 ... xmnm)
}
where there is no requirement for there to be more than one
disjunct, nor for there to be any particular number of existentially
quantified variables in any disjunct. For example, the cases theorem
for natural numbers initially in the {TypeBase} is:
{
|- !n. (n = 0) \/ (?m. n = SUC m)
}
Case-splitting consists of specialising the cases theorem with the
variable from the goal and then generating as many sub-goals as there
are disjuncts in the cases theorem, where in each sub-goal (including
the assumptions) the variable has been replaced by an expression
involving the given `constructor' (the {Ci}'s above) applied to as
many fresh variables as appropriate.
\FAILURE
Fails if the goal is not universally quantified, or if the type of the
universally quantified variable does not have a case theorem in the
{TypeBase}, as will happen, for example, with variable types.
\EXAMPLE
If we have defined the following type:
{
- Hol_datatype `foo = Bar of num | Baz of bool`;
> val it = () : unit
}
and the following function:
{
- val foofn_def = Define `(foofn (Bar n) = n + 10) /\
(foofn (Baz x) = 10)`;
> val foofn_def =
|- (!n. foofn (Bar n) = n + 10) /\
!x. foofn (Baz x) = 10 : thm
}
then it is possible to make progress with the goal
{!x. foofn x >= 10} by applying the tactic {Cases}, thus:
{
?- !x. foofn x >= 10
======================================================
?- foofn (Bar n) >= 10
?- foofn (Baz b) >= 10
}
producing two new goals, one for each constructor of the
type.
\SEEALSO
bossLib.Cases_on, bossLib.Induct, Tactic.STRUCT_CASES_TAC.
\ENDDOC
Cases
Download