RIS.automata: finite state automata.

Set Implicit Arguments.
This module contains the definitions of deterministic and non-deterministic automata, as well as a proof of Kleene's theorem.
Require Import tools algebra language regexp.
Require Import Bool.

Section automata.

  Section def.
    Context {Q : Set}{decQ: decidable_set Q }.
    Context {X : Set}{decX: decidable_set X }.

    Definition NFA Q X := ((list Q) × list (Q × X × Q))%type.

    Fixpoint pathNFA (A : NFA Q X) p w q :=
      match w with
      | []p = q
      | a::w q', (p,a,q') snd A pathNFA A q' w q
      end.

    Definition langNFA A p : language :=
      fun w q, pathNFA A p w q q fst A.

    Definition DFA Q X := Q bool × (X Q).

    Fixpoint iter_auto (A : DFA Q X) q u :=
      match u with
      | []q
      | a::uiter_auto A (snd (A q) a) u
      end.

    Definition langDFA A q : language := fun ufst (A (iter_auto A q u)) = true.

    Definition Reachables (A : DFA Q X) R := q a, q R snd (A q) a R.

    Lemma Reachables_spec A R : Reachables A R q u, q R iter_auto A q u R.

    Definition determinise (A : NFA Q X) : DFA (list Q) X :=
      fun l((existsb (fun qinb q (fst A)) l),
             (fun x{{flat_map (fun trmatch tr with
                                     | (p,y,q)if inb p l && x=?=y then [q] else []
                                       end) (snd A)}})).

    Definition statesNFA (A : NFA Q X) := {{fst A ++ flat_map (fun tr[fst (fst tr);snd tr]) (snd A)}}.

    Lemma statesNFA_spec A q :
      q statesNFA A q fst A tr, tr snd A (q = fst(fst tr) q = snd tr).

    Lemma statesNFA_path A p w q : pathNFA A p w q w = [] (p statesNFA A q statesNFA A).

    Lemma pathNFA_app A p u v q : pathNFA A p (u++v) q r, pathNFA A p u r pathNFA A r v q.
    Lemma pathNFA_last A p u x q : pathNFA A p (u++[x]) q r, pathNFA A p u r (r,x,q)∈(snd A).

  End def.
  Context {Q : Set}{decQ: decidable_set Q }.
  Context {X : Set}{decX: decidable_set X }.

  Lemma determinise_lang A (q : Q) : langNFA A q langDFA (determinise A) [q].

  Lemma determinise_Reachables (A : NFA Q X) :
    Reachables (determinise A) (flat_map shuffles (subsets (statesNFA A))).

  Definition NFA_of_regexp (e : @regexp X) : NFA regexp X :=
    ((filter (fun eϵ e =?= e_un) (stateSpace e)),
     flat_map (fun f
                 flat_map
                   (fun a
                      map (fun g(f,a,g))
                          (δA a f)
                   )
                   (Var e)
              )
              (stateSpace e)).

  Lemma stateSpace_statesNFA e : statesNFA (NFA_of_regexp e) stateSpace e.


  Lemma NFA_of_regexp_langNFA e f :
    f (stateSpace e) f langNFA (NFA_of_regexp e) f.

  Lemma NFA_of_regexp_spec e : e langNFA (NFA_of_regexp e) e.


  Lemma pathNFA_stateSpace e e' f g u :
    e' stateSpace e pathNFA (NFA_of_regexp e') f u g pathNFA (NFA_of_regexp e) f u g.

  Fixpoint pathRestr (A : NFA Q X) states p w q :=
    match w with
    | []p=q
    | a::w q', (w = [] q' states) (p,a,q') snd A pathRestr A states q' w q
    end.

  Lemma pathRestr_pathNFA A p q w : pathNFA A p w q pathRestr A (statesNFA A) p w q.

  Lemma pathRestr_app A S p q r u v :
    q S pathRestr A S p u q pathRestr A S q v r pathRestr A S p (u++v) r.

  Lemma pathRestr_incl A S1 S2 p q w : S1 S2 pathRestr A S1 p w q pathRestr A S2 p w q.

  Lemma pathRestr_split A S p q r u :
    pathRestr A S p u q
    (pathRestr A (Sr) p u q)
    \/( w1 w2 w3, u = w1 ++ w2 ++ w3
                   pathRestr A (Sr) p w1 r
                   pathRestr A S r w2 r
                   pathRestr A (Sr) r w3 q).

  Lemma regexpPath (A : NFA Q X) p q : e, w, e w pathNFA A p w q.

  CoInductive bissim (A: DFA Q X) : relation Q :=
  | transition p q : fst (A p) = fst (A q) ( a, bissim A (snd (A p) a) (snd (A q) a))
                     bissim A p q.

  Lemma bissim_lang A p q :
    bissim A p q langDFA A p langDFA A q.

  Global Instance bissim_equiv A : Equivalence (bissim A).

End automata.

Section kleeneTheorem.
  Context {X : Set}{decX: decidable_set X }.

  Definition regular (L : @language X) := e, e L.
  Definition rational (L : @language X) :=
     Q : Set, d : decidable_set Q, ( A (q : Q), langNFA A q L).

  Theorem KleeneTheorem (L : @language X) : regular L rational L.
End kleeneTheorem.