(** * IndPrinciples: Induction Principles *)
(** With the Curry-Howard correspondence and its realization in Coq in mind, we can now take a deeper look at induction principles. *)
Set Warnings "-notation-overridden,-parsing".
Require Export ProofObjects.
(* ################################################################# *)
(** * Basics *)
(** Every time we declare a new [Inductive] datatype, Coq automatically generates an _induction principle_ for this type. This induction principle is a theorem like any other: If [t] is defined inductively, the corresponding induction principle is called [t_ind].  Here is the one for natural numbers: *)
Check nat_ind.
(*  ===> nat_ind : forall P : nat -> Prop, P 0  -> (forall n : nat, P n -> P (S n))  -> forall n : nat, P n  *)
(** The [induction] tactic is a straightforward wrapper that, at its core, simply performs [apply t_ind].  To see this more clearly, let's experiment with directly using [apply nat_ind], instead of the [induction] tactic, to carry out some proofs.  Here, for example, is an alternate proof of a theorem that we saw in the [Basics] chapter. *)

(* Specifications: *)
Theorem mult_0_r' : forall n:nat,
n * 0 = 0.