RIS.aeq_facts: lemmas about ฮฑ-equivalence and the equivalence transducer.

Set Implicit Arguments.

Require Export transducer subword.
Section s.
  Context {atom X: Set}{๐€ : Atom atom} {๐— : Alphabet ๐€ X}.

  Global Instance subword_filter (A : Set) (f : A โ†’ bool) :
    Proper (subword ==> subword) (filter f).

  Lemma subword_incl (A : Set) (u v : list A) : u โŠ‘ v โ†’ u โŠ† v.

  Global Instance subword_map (A B: Set) (f: Aโ†’B) :
    Proper (subword ==> subword) (map f).
  Global Instance subword_app (A: Set) :
    Proper (subword ==> subword ==> subword) (@app A).

  Lemma absent_subword s a b s' : s โŠ‘ s' โ†’ absent s' a b โ†’ absent s a b.

  Lemma subword_dec_app (A:Set) (u v w :list A) : u โŠ‘ v++w โ†’ โˆƒ u1 u2, u = u1++u2 โˆง u1 โŠ‘ v โˆง u2 โŠ‘ w.

  Lemma stack_binding_subword u v s1 s2 :
    (s1 โŠฃ u | v โค… s2) โ†’
    โˆƒ s3 s4, s2 = s3++s4 โˆง s4 โŠ‘ s1
             โˆง (โˆ€ a, nb a (prj1 s4) = nb a (prj1 s1) - d_binding (๐—™ a u)
                     โˆง nb a (prj1 s3) = c_binding (๐—™ a u)
                     โˆง nb a (prj2 s4) = nb a (prj2 s1) - d_binding (๐—™ a v)
                     โˆง nb a (prj2 s3) = c_binding (๐—™ a v)
                     โˆง d_binding (๐—™ a u) - nb a (prj1 s1) = d_binding (๐—™ a v) - nb a (prj2 s1)).

  Lemma exists_var_binding u a n :
    ๐—™ a u = (0,true,n) โ†’ โˆƒ u1 u2 x, u = u1++var x::u2 โˆง a #ฮฑ u1 โˆง a โˆˆ โŒŠxโŒ‹.

  Lemma decompose_app (A:Set) (u1 u2 v : list A) :
    โŽขu1++u2โŽฅ = โŽขvโŽฅ โ†’ โˆƒ v1 v2, โŽขu1โŽฅ = โŽขv1โŽฅ โˆง v = v1++v2.
  Lemma scope_binding u a n :
    ๐—™ a u = (0,false,S n) โ†’ โˆƒ u1 u2, u = u1++open a::u2 โˆง a #ฮฑ u1 โˆง a โ— u2.



  Lemma path_init_pair u v a b s :
    a โ‰  b โ†’ ([(a,b)] โŠฃ u | v โค… s) โ†’
    (a โ— u โˆง b โ— v โˆง โˆƒ s', s = s'++[(a,b)])
    โˆจ (โˆƒ u1 u2 v1 v2,
          u = u1++close a::u2
          โˆง v = v1++close b::v2
          โˆง a โ‹„ u1
          โˆง b โ‹„ v1
          โˆง โŽขu1โŽฅ = โŽขv1โŽฅ
          โˆง โˆƒ n, ๐—™ b u1 = (0,false,n)).

  Lemma path_init_refl_pair u v s c :
    ([(c,c)] โŠฃ u | v โค… s) โ†’
    [] โŠฃ u | v โค… s โˆจ (โˆƒ s', s = s'++[(c,c)] โˆง [] โŠฃ u | v โค… s').

  Lemma find_matching_close a u n :
    n < d_binding (๐—™ a u) โ†’ โˆƒ u1 u2, u = u1++close a::u2 โˆง d_binding (๐—™ a u1) = n โˆง a โ–ท u1.

  Lemma subword_not_In (A:Set)(x:A) l m n : l โŠ‘(m++x::n) โ†’ ยฌ x โˆˆ l โ†’ l โŠ‘ m++n.

  Lemma aeq_first_letter_open u v a b :
    aโ‰ b โ†’ open a::u โ‰ก open b::v โ†’
    โˆƒ u1 u2, u = u1++close a::u2
             โˆง a โ‹„ u1
             โˆง ((b #ฮฑ u1 โˆง [(a,b)]โˆ™u1++close b::u2 โ‰ก v)
                โˆจ โˆƒ w1 w2 w3 w4, u1 = w1 ++ open b::w2
                                 โˆง u2 = w3 ++ close b::w4
                                 โˆง b #ฮฑ w1
                                 โˆง b โ‹„ (w2++w3)
                                 โˆง โˆ€ c, c # u โ†’
                                        [(a,b)]โˆ™w1++open c::[(a,b);(b,c)]โˆ™w2
                                               ++close b::[(b,c)]โˆ™w3++close c::w4 โ‰ก v).

  Lemma aeq_first_letter u v l m :
    l::u โ‰ก m::v โ†’ (l=m โˆง u โ‰ก v) โˆจ (โˆƒ a b, aโ‰ b โˆง l=open a โˆง m=open b).
End s.