regexp.concrete.automata.alt


Section Cxt.
  Context {B : sort}{St0 St1 : sort}.

  Context (tr0 : transition.t B St0)(tr1 : transition.t B St1).
  Definition State : sort := St0 St1.

  Definition mkTrans : transition.t B State :=
    function.zipWith concrete.relation.diagonal tr0 tr1.

End Cxt.

Section Build.
 Context {B St0 St1 : sort}(mac0 : NFA B St0)(mac1 : NFA B St1).

 Definition build : NFA B (St0 St1) :=
   {|
     trans := mkTrans (automata.trans mac0) (trans mac1);
     start := start mac0 start mac1;
     final := final mac0 final mac1
   |}.

 Lemma equality : automata.denote build = (abstract.automata.alt.build (automata.denote mac0) (automata.denote mac1)).
 Proof using Type.
   apply abstract.automata.eq_equiv.
   rewrite /build /automata.denote /automata.equiv ?injDU ?union_spec ?injl_spec ?injr_spec //=. intuition.
   apply /eqP; rewrite -ffunP /mkTrans /transition.denotex.
   rewrite function.denoteE /alt.mkTrans function.to_map function.zip_pointwise concrete.relation.diagonal_spec ?ffunE ?function.to_map.
   by rewrite abstract.relation.diagonal_matrix.
 Qed.

 Theorem correctness : (accept build accept mac0 || accept mac1)%lan.
 Proof using Type.
   by rewrite /accept equality abstract.automata.alt.correctness.
 Qed.

End Build.