\DOC Induct_on \TYPE {Induct_on : term -> tactic} \SYNOPSIS Performs structural induction, using the type of the given term. \KEYWORDS tactic, induction \LIBRARY SingleStep. \DESCRIBE Given a term {M}, {Induct_on} attempts to perform an induction based on the type of {M}. The induction theorem to be used is extracted from the {TypeBase} database, which holds useful facts about the system's defined types. {Induct_on} can be used to specify variables that are buried in the quantifier prefix, i.e., not the leading quantified variable. {Induct_on} can also perform induction on non-variable terms. If {M} is a non-variable term that does not occur bound in the goal, then {Induct_on} equates {M} to a new variable {v} (one not occurring in the goal), moves all hypotheses in which free variables of {M} occur to the conclusion of the goal, adds the antecedent {v = M}, and quantifies all free variables of {M} before universally quantifying {v} and then finally inducting on {v}. {Induct_on} may also be used to apply an induction theorem coming from declaration of a mutually recursive datattype. \FAILURE {Induct_on} fails if an induction theorem corresponding to the type of {M} is not found in the {TypeBase} database. \EXAMPLE If attempting to prove { !x. LENGTH (REVERSE x) = LENGTH x } one can apply {Induct_on `x`} to begin a proof by induction on the list structure of {x}. In this case, {Induct_on} serves as an explicit version of {Induct}. \SEEALSO bossLib.Induct, bossLib.completeInduct_on, bossLib.measureInduct_on, Prim_rec.INDUCT_THEN, bossLib.Cases, bossLib.Hol_datatype, goalstackLib.g, goalstackLib.e. \ENDDOC