regexp.abstract.automata.epsilon
Definition State : finType := unit.
Section Transition.
Context {B : finType}(b : B).
Definition tr : transition.t B State := [ffun y ⇒ empty].
Lemma state_deadend : path.deadEnd tr tt.
move ⇒ st x; by rewrite /transition.step ?ffunE in_set0.
Qed.
Lemma emptyPath {xs} : path.t tr tt tt xs → xs = [::].
by case /(path.trivialpathP state_deadend).
Qed.
End Transition.
Definition build {B : finType} : NFA B State :=
{|
trans := tr;
start := [set tt];
final := [set tt]
|}.
Require Import regexp.lang.
Theorem correctness {B : finType}:
accept (@build B) ≡ lang.epsilon.
Proof.
move ⇒ xs; split; rewrite /accept /path.reachable.
- case ⇒ i; rewrite in_set1; case ⇒ [/eqP hi] haccess.
case: haccess ⇒ f; rewrite in_set1; case ⇒ [/eqP hf].
by rewrite hi hf; move/emptyPath.
- rewrite /lang.epsilon ⇒ h; rewrite h; ∃ tt; split.
+ by rewrite ?in_set1.
+ ∃ tt; split.
× by rewrite ?in_set1.
× by apply /path.nilP.
Qed.