proposition: Theorem Kleene: forall l: lang' sigma, (exists e: regex, l ≡ regex.lang e) <-> (exists A: dfa.t, l ≡ dfa.lang A (dfa.u A)).
proof: Proof. intro l. setoid_rewrite <-nfa.dfa.eval_lang. setoid_rewrite <-dfa.reroot_id. split. intros [e He]. exists (dfa [] e). rewrite eval_dfa. assumption. intros [A HA]. exists (nfa.eval A). assumption. Qed.
imports: kleene sums matrix_ext lset boolean lang nfa regex bmx rmx normalisation