When applied to a term u and a theorem A |- !x. t, then SPEC returns
the theorem A |- t[u/x]. If necessary, variables will be renamed prior
to the specialization to ensure that u is free for x in t, that is,
no variables free in u become bound after substitution.
A |- !x. t
-------------- SPEC "u"
A |- t[u/x]
FAILURE
Fails if the theorem's conclusion is not universally quantified, or if x and
u have different types.
EXAMPLE
The following example shows how SPEC renames bound variables if necessary,
prior to substitution: a straightforward substitution would result in the
clearly invalid theorem |- ~y ==> (!y. y ==> ~y).
#let xv = "x:bool" and yv="y:bool" in
# (GEN xv o DISCH xv o GEN yv o DISCH yv) (ASSUME xv);;
|- !x. x ==> (!y. y ==> x)
#SPEC "~y" it;;
|- ~y ==> (!y'. y' ==> ~y)