\DOC new_definition \TYPE {new_definition : string * term -> thm} \SYNOPSIS Declare a new constant and install a definitional axiom in the current theory. \DESCRIBE The function {new_definition} provides a facility for definitional extensions to the current theory. It takes a pair argument consisting of the name under which the resulting definition will be saved in the current theory segment, and a term giving the desired definition. The value returned by {new_definition} is a theorem which states the definition requested by the user. Let {v_1},...,{v_n} be tuples of distinct variables, containing the variables {x_1,...,x_m}. Evaluating {new_definition (name, c v_1 ... v_n = t)}, where {c} is not already a constant, declares the sequent {({},\v_1 ... v_n. t)} to be a definition in the current theory, and declares {c} to be a new constant in the current theory with this definition as its specification. This constant specification is returned as a theorem with the form { |- !x_1 ... x_m. c v_1 ... v_n = t } and is saved in the current theory under {name}. Optionally, the definitional term argument may have any of its variables universally quantified. \FAILURE {new_definition} fails if {t} contains free variables that are not in {x_1}, ..., {x_m} (this is equivalent to requiring {\v_1 ... v_n. t} to be a closed term). Failure also occurs if any variable occurs more than once in {v_1, ..., v_n}. Finally, failure occurs if there is a type variable in {v_1}, ..., {v_n} or {t} that does not occur in the type of {c}. \EXAMPLE A NAND relation can be defined as follows. { - new_definition ( "NAND2", Term`NAND2 (in_1,in_2) out = !t:num. out t = ~(in_1 t /\ in_2 t)`); > val it = |- !in_1 in_2 out. NAND2 (in_1,in_2) out = !t. out t = ~(in_1 t /\ in_2 t) : thm } \SEEALSO Definition.new_specification, boolSyntax.new_binder_definition, boolSyntax.new_infixl_definition, boolSyntax.new_infixr_definition, Prim_rec.new_recursive_definition, TotalDefn.Define. \ENDDOC