Library CFG.Dec_Empty

Require Export Derivation Symbols.

Section Dec_Emptys.
  Variable G : grammar.

Productive variables


  Inductive productive (G : grammar) : symbol Prop :=
  | TProd (a : ter) : productive G (Ts a)
  | VProd A u : R A u G ( s, s u productive G s) productive G (Vs A).
  Hint Constructors productive.

  Lemma derf_productive u v :
    derf G u v ( s, s v productive G s) s, s u productive G s.
  Proof.
    intros D H.
    induction D ; intros s' E ; auto ; destruct E as [E | E] ; try destruct E ; subst ; eauto.
  Qed.


  Lemma productive_derf s :
    productive G s x, derf G [s] x terminal x.
  Proof.
    induction 1 as [a | A u IH].
    - [Ts a]. split ; auto.
      intros s [H | H] ; [subst ; a ; auto | destruct H].
    - cut ( y, derf G u y terminal y).
       + intros [y [ ]]. y. split ; eauto.
       + clear . induction u as [| s u IHu].
         × []. split ; auto. intros s [].
         × assert ( : s, s u x : phrase, derf G [s] x terminal x) by auto.
           destruct (IHu ) as [y [ ]].
           assert ( : s s :: u) by auto.
           destruct (IH s ) as [x [ ]].
            (x y). split ; auto.
           intros s' T. apply in_app_iff in T. destruct T as [T | T] ; auto.
  Qed.


  Lemma productive_derWord_equi A :
    ( w, der G A w terminal w) productive G (Vs A).
  Proof.
    split ; intro H.
    - destruct H as [w [ ]].
      apply derf_der_equiv in .
      eapply derf_productive ; eauto.
      intros s W.
      destruct ( s W) as [t ] ; subst ; auto.
    - apply productive_derf in H.
      destruct H as [w H].
       w. now rewrite derf_der_equiv.
  Qed.


Compute productive variables

  Definition step (M : list symbol) s :=
    ( a, s = Ts a)
     A u, s = Vs A
           R A u G
            s', s' u s' M.

  Instance step_dec M s : dec (step M s).
  Proof.
    destruct s as [a | A].
    - left. left. a. auto.
    - decide ( u, R A u G s', s' u s' M) as [D | D].
      + left. right. destruct D as [u [ ]]. A, u. repeat split ; auto.
      + right. intros [[a ] | [A' [u [ [ ]]]]] ; inversion as [] ; subst.
        apply D. u. auto.
  Defined.


  Definition P : list symbol :=
    FCI.C (step := step) (symbs G).

Correctness

  Lemma productive_P s :
    s symbs G productive G s s P.
  Proof.
    intros E H.
    induction H ; apply FCI.closure ; auto.
    - left. a. auto.
    - right. A, u. repeat split ; auto.
      intros s' . apply ; auto.
      apply symbs_inv.
       A, u. split ; auto.
  Qed.


  Lemma P_productive s :
    s P productive G s.
  Proof.
    apply FCI.ind.
    intros M x .
    destruct as [[a ] | [A [u [ [ ]]]]] ; rewrite ; eauto.
  Qed.


  Lemma P_productive_equiv s :
    s symbs G (s P productive G s).
  Proof. intros H. split ; [apply P_productive | now apply productive_P]. Qed.

End Dec_Emptys.

Decidability of emptiness


Instance productive_dec : G s, dec (productive G s).
Proof.
  intros G [a | A].
  - left. constructor.
  - decide (Vs A symbs G) as [D | D].
    + decide ((Vs A) P G) ; [left | right] ; now rewrite P_productive_equiv.
    + right. intros H. inversion H as [| ? u ] ; subst. apply D, symbs_inv. A, u. split ; auto.
Defined.


Instance exists_dec : G A, dec ( u, language G A u).
Proof.
  intros G A.
  decide (productive G (Vs A)) as [P | P] ; rewrite productive_derWord_equi in P ; [left | right] ; auto.
Defined.