new_binder_definition
boolSyntax.new_binder_definition : string * term -> thm
Defines a new constant, giving it the syntactic status of a binder.
The function new_binder_definition
provides a facility
for making definitional extensions to the current theory by introducing
a constant definition. It takes a pair of arguments, consisting of the
name under which the resulting theorem will be saved in the current
theory segment and a term giving the desired definition. The value
returned by new_binder_definition
is a theorem which states
the definition requested by the user.
Let v1
, …, vn
be syntactically distinct
tuples constructed from the variables x1,...,xm
. A binder
is defined by evaluating
new_binder_definition (name, `b v1 ... vn = t`)
where b
does not occur in t
, all the free
variables that occur in t
are a subset of
x1,...,xn
, and the type of b
has the form
(ty1->ty2)->ty3
. This declares b
to be a
new constant with the syntactic status of a binder in the current
theory, and with the definitional theorem
|- !x1...xn. b v1 ... vn = t
as its specification. This constant specification for b
is saved in the current theory under the name name
and is
returned as a theorem.
The equation supplied to new_binder_definition
may
optionally have any of its free variables universally quantified at the
outermost level. The constant b
has binder status only
after the definition has been made.
new_binder_definition
fails if t
contains
free variables that are not in any one of the variable structures
v1
, …, vn
or if any variable occurs more than
once in v1, ..., v2
. Failure also occurs if the type of
b
is not of the form appropriate for a binder, namely a
type of the form (ty1->ty2)->ty3
. Finally, failure
occurs if there is a type variable in v1
, …,
vn
or t
that does not occur in the type of
b
.
The unique-existence quantifier ?!
is defined as
follows.
- new_binder_definition
(`EXISTS_UNIQUE_DEF`,
Term`$?! = \P:(*->bool). ($? P) /\ (!x y. ((P x) /\ (P y)) ==> (x=y))`);
> val it = |- $?! = (\P. $? P /\ (!x y. P x /\ P y ==> (x = y))) : thm
It is a common practice among HOL users to write a $
before the constant being defined as a binder to indicate that it will
have a special syntactic status after the definition is made:
new_binder_definition(name, Term `$b = ... `);
This use of $
is not necessary; but after the definition
has been made $
must, of course, be used if the syntactic
status of b
needs to be suppressed.
Definition.new_definition
,
boolSyntax.new_infixl_definition
,
boolSyntax.new_infixr_definition
,
Prim_rec.new_recursive_definition
,
TotalDefn.Define