(** * Syntax and induction principle

  - [BC_ind2] is a handmade induction principle because the one generated automatically by Coq
    ignores the types [list BC] in the constructor [comp].
*)

Inductive BC : Set :=
| zero : BC
| proj : nat -> nat -> nat -> BC
| succ : bool -> BC
| pred : BC
| cond : BC
| rec : BC -> BC -> BC -> BC
| comp : nat -> nat -> BC -> list BC -> list BC -> BC.(** * Syntax and induction principle

  - [BC_ind2] is a handmade induction principle because the one generated automatically by Coq
    ignores the types [list BC] in the constructor [comp].
*)

Inductive BC : Set :=
| zero : BC
| proj : nat -> nat -> nat -> BC
| succ : bool -> BC
| pred : BC
| cond : BC
| rec : BC -> BC -> BC -> BC
| comp : nat -> nat -> BC -> list BC -> list BC -> BC.(** * Syntax and induction principle

  - [BC_ind2] is a handmade induction principle because the one generated automatically by Coq
    ignores the types [list BC] in the constructor [comp].
*)

Inductive BC : Set :=
| zero : BC
| proj : nat -> nat -> nat -> BC
| succ : bool -> BC
| pred : BC
| cond : BC
| rec : BC -> BC -> BC -> BC
| comp : nat -> nat -> BC -> list BC -> list BC -> BC.(** * Syntax and induction principle

  - [BC_ind2] is a handmade induction principle because the one generated automatically by Coq
    ignores the types [list BC] in the constructor [comp].
*)

Inductive BC : Set :=
| zero : BC
| proj : nat -> nat -> nat -> BC
| succ : bool -> BC
| pred : BC
| cond : BC
| rec : BC -> BC -> BC -> BC
| comp : nat -> nat -> BC -> list BC -> list BC -> BC.(** * Syntax and induction principle

  - [BC_ind2] is a handmade induction principle because the one generated automatically by Coq
    ignores the types [list BC] in the constructor [comp].
*)

Inductive BC : Set :=
| zero : BC
| proj : nat -> nat -> nat -> BC
| succ : bool -> BC
| pred : BC
| cond : BC
| rec : BC -> BC -> BC -> BC
| comp : nat -> nat -> BC -> list BC -> list BC -> BC.(** * Syntax and induction principle

  - [BC_ind2] is a handmade induction principle because the one generated automatically by Coq
    ignores the types [list BC] in the constructor [comp].
*)

Inductive BC : Set :=
| zero : BC
| proj : nat -> nat -> nat -> BC
| succ : bool -> BC
| pred : BC
| cond : BC
| rec : BC -> BC -> BC -> BC
| comp : nat -> nat -> BC -> list BC -> list BC -> BC.(** * Syntax and induction principle

  - [BC_ind2] is a handmade induction principle because the one generated automatically by Coq
    ignores the types [list BC] in the constructor [comp].
*)

Inductive BC : Set :=
| zero : BC
| proj : nat -> nat -> nat -> BC
| succ : bool -> BC
| pred : BC
| cond : BC
| rec : BC -> BC -> BC -> BC
| comp : nat -> nat -> BC -> list BC -> list BC -> BC.(** * Syntax and induction principle

  - [BC_ind2] is a handmade induction principle because the one generated automatically by Coq
    ignores the types [list BC] in the constructor [comp].
*)

Inductive BC : Set :=
| zero : BC
| proj : nat -> nat -> nat -> BC
| succ : bool -> BC
| pred : BC
| cond : BC
| rec : BC -> BC -> BC -> BC
| comp : nat -> nat -> BC -> list BC -> list BC -> BC.

(* Specifications: *)
Lemma BC_ind2' : forall P : BC -> Prop, forall Q : list BC -> Prop, Q nil -> (forall e l, P e -> Q l -> Q (e :: l)) -> P zero -> (forall n s i, P (proj n s i)) -> (forall b, P (succ b)) -> P pred -> P cond -> (forall g h0 h1, P g -> P h0 -> P h1 -> P (rec g h0 h1)) -> (forall n s h rl tl, P h -> Q rl -> Q tl -> P (comp n s h rl tl)) -> forall e, P e.
Lemma BC_ind2 : forall P : BC -> Prop, P zero -> (forall n s i, P (proj n s i)) -> (forall b, P (succ b)) -> P pred -> P cond -> (forall g h0 h1, P g -> P h0 -> P h1 -> P (rec g h0 h1)) -> (forall n s h rl tl, P h -> (forall r, In r rl -> P r) -> (forall s, In s tl -> P s) -> P (comp n s h rl tl)) -> forall e, P e.