Set Implicit Arguments.
Unset Strict Implicit.
Section Syntax.
(* AST *)
Variables variable function constructor : Type.
Variable max_arity : nat.
Inductive value : Type :=
| c_capply : constructor -> list value -> value.
Inductive term : Type :=
| var : variable -> term
| capply : constructor -> list term -> term
| fapply : function -> list term -> term.
Inductive pattern : Type :=
| p_var : variable -> pattern
| p_capply : constructor -> list pattern -> pattern.
Inductive rule : Type :=
| rule_intro : function -> list pattern -> term -> rule.
(* Smarter induction principles than the ones automatically generated *)

Lemma pattern_ind2_gen :
forall (P : pattern -> Prop)(Q : list pattern -> Prop),
Q nil ->
(forall p l, P p -> Q l -> Q (p :: l)) ->
(forall x, P (p_var x)) ->
(forall c l, Q l -> P (p_capply c l)) ->
forall p, P p.