Set Uniform Inductive Parameters.
Inductive test (X : Set) : Prop :=
with test2 (X : Set) : X -> Prop :=
 | C (x : X) : test2 x.

Require Import List.
Import ListNotations.

Set Suggest Proof Using.
Set Primitive Projections.


Section Grammar.
Variable A : Type.

Record grammar : Type := Grammar {
  gm_nonterm :> Type ;
  gm_rules :> list (gm_nonterm * list (A + gm_nonterm)) ;
}.

Set Uniform Inductive Parameters.
Inductive lang (gm : grammar) : gm -> list A -> Prop :=
| lang_rule S ps ws : In (S, ps) gm -> lmatch ps ws -> lang S (concat ws)
with lmatch (gm : grammar) : list (A + gm) -> list (list A) -> Prop :=
| lmatch_nil : lmatch [] []
| lmatch_consL ps ws a : lmatch ps ws -> lmatch (inl a :: ps) ([a] :: ws)
| lmatch_consR ps ws S w :
    lang S w -> lmatch ps ws -> lmatch (inr S :: ps) (w :: ws)
.

End Grammar.
