Documentation

SSA.Experimental.Bits.AutoStructs.Basic

@[reducible, inline]
abbrev State :
Equations
Instances For
    structure NFA (A : Type) [BEq A] [Hashable A] [DecidableEq A] [FinEnum A] :
    Instances For
      instance instReprNFA :
      {A : Type} → {inst : BEq A} → {inst_1 : Hashable A} → {inst_2 : DecidableEq A} → {inst_3 : FinEnum A} → [inst_4 : Repr A] → Repr (NFA A)
      Equations
      • instReprNFA = { reprPrec := reprNFA✝ }
      def NFA.empty {A : Type} [BEq A] [Hashable A] [DecidableEq A] [FinEnum A] :
      NFA A
      Equations
      • NFA.empty = { stateMax := 0, initials := , finals := , trans := }
      Instances For
        def NFA.newState {A : Type} [BEq A] [Hashable A] [DecidableEq A] [FinEnum A] (m : NFA A) :
        Equations
        • m.newState = (m.stateMax, { stateMax := m.stateMax + 1, initials := m.initials, finals := m.finals, trans := m.trans })
        Instances For
          def NFA.addTrans {A : Type} [BEq A] [Hashable A] [DecidableEq A] [FinEnum A] (m : NFA A) (a : A) (s : State) (s' : State) :
          NFA A
          Equations
          • m.addTrans a s s' = { stateMax := m.stateMax, initials := m.initials, finals := m.finals, trans := m.trans.insert (s, a) ((m.trans.getD (s, a) ).insert s') }
          Instances For
            def NFA.addManyTrans {A : Type} [BEq A] [Hashable A] [DecidableEq A] [FinEnum A] (m : NFA A) (a : List A) (s : State) (s' : State) :
            NFA A
            Equations
            • m.addManyTrans a s s' = List.foldl (fun (m : NFA A) (a : A) => m.addTrans a s s') m a
            Instances For
              def NFA.addInitial {A : Type} [BEq A] [Hashable A] [DecidableEq A] [FinEnum A] (m : NFA A) (s : State) :
              NFA A
              Equations
              • m.addInitial s = { stateMax := m.stateMax, initials := m.initials.insert s, finals := m.finals, trans := m.trans }
              Instances For
                def NFA.addFinal {A : Type} [BEq A] [Hashable A] [DecidableEq A] [FinEnum A] (m : NFA A) (s : State) :
                NFA A
                Equations
                • m.addFinal s = { stateMax := m.stateMax, initials := m.initials, finals := m.finals.insert s, trans := m.trans }
                Instances For
                  def NFA.transSet {A : Type} [BEq A] [Hashable A] [DecidableEq A] [FinEnum A] (m : NFA A) (ss : Std.HashSet State) (a : A) :
                  Equations
                  Instances For
                    instance NFA_Inhabited {A : Type} [BEq A] [Hashable A] [DecidableEq A] [FinEnum A] :
                    Equations
                    • NFA_Inhabited = { default := NFA.empty }
                    @[reducible, inline]
                    abbrev inSS {S : Type} (stateSpace : Finset S) :
                    Equations
                    • inSS stateSpace = { sa : S // sa stateSpace }
                    Instances For
                      theorem List.dropLast_nodup {X : Type u_1} (l : List X) :
                      l.Nodupl.dropLast.Nodup
                      theorem List.dropLasnodup {X : Type u_1} (l : List X) :
                      l.Nodupl.dropLast.Nodup
                      @[simp]
                      theorem Array.not_elem_back_pop {X : Type u_1} (a : Array X) (x : X) :
                      a.toList.Nodupa.back? = some xxa.pop
                      theorem Array.back?_mem {X : Type u_1} (a : Array X) (x : X) :
                      a.back? = some xx a
                      theorem Array.not_elem_back_pop_list {X : Type u_1} (a : Array X) (x : X) :
                      a.toList.Nodupa.back? = some xxa.toList.dropLast
                      theorem Array.back_mem {X : Type u_1} (a : Array X) (x : X) :
                      a.back? = some xx a
                      theorem Array.mem_of_mem_pop {α : Type u_1} (a : Array α) (x : α) :
                      x a.popx a
                      theorem Array.mem_push {α : Type u_1} (a : Array α) (x : α) (y : α) :
                      x a.push yx a x = y
                      theorem Std.HashMap.keys_nodup {K : Type u_1} {V : Type u_2} [BEq K] [Hashable K] (m : Std.HashMap K V) :
                      m.keys.Nodup
                      @[simp]
                      theorem Std.HashMap.mem_keys_iff_mem {K : Type u_1} {V : Type u_2} [BEq K] [Hashable K] (m : Std.HashMap K V) (k : K) :
                      k m.keys k m
                      theorem Std.HashMap.mem_keys_insert_new {K : Type u_1} {V : Type u_2} {v : V} [BEq K] [LawfulBEq K] [Hashable K] [LawfulHashable K] (m : Std.HashMap K V) (k : K) :
                      k m.insert k v
                      theorem Std.HashMap.mem_keys_insert_old {K : Type u_1} {V : Type u_2} {v : V} [BEq K] [LawfulBEq K] [Hashable K] [LawfulHashable K] (m : Std.HashMap K V) (k : K) (k' : K) :
                      k mk m.insert k' v
                      theorem Std.HashMap.get?_none_not_mem {K : Type u_1} {V : Type u_2} [BEq K] [LawfulBEq K] [Hashable K] [LawfulHashable K] (m : Std.HashMap K V) (k : K) :
                      m.get? k = nonekm
                      theorem List.perm_subset_iff_right {α : Type u_1} {l1 : List α} {l2 : List α} (hperm : l1.Perm l2) (l : List α) :
                      l l1 l l2
                      theorem addOrCreateState_grow (A : Type) [BEq A] [Hashable A] [DecidableEq A] [FinEnum A] {S : Type} [BEq S] [LawfulBEq S] [Hashable S] [DecidableEq S] (stateSpace : Finset S) (st : worklist.St A stateSpace) (b : Bool) (sa : inSS stateSpace) :
                      match worklist.St.addOrCreateState A stateSpace st b sa with | (fst, st') => ∃ (sas : List (inSS stateSpace)), st'.map.keys.Perm (sas ++ st.map.keys) st'.worklist.toList = st.worklist.toList ++ sas
                      theorem processOneElem_grow (A : Type) [BEq A] [Hashable A] [DecidableEq A] [FinEnum A] {S : Type} [BEq S] [LawfulBEq S] [Hashable S] [DecidableEq S] (stateSpace : Finset S) (st : worklist.St A stateSpace) (final : SBool) (a : A) (sa' : inSS stateSpace) (s : State) :
                      let st' := processOneElem A stateSpace final s st (a, sa'); ∃ (sas : List (inSS stateSpace)), st'.map.keys.Perm (sas ++ st.map.keys) st'.worklist.toList = st.worklist.toList ++ sas
                      def worklist.initState (A : Type) [BEq A] [Hashable A] [DecidableEq A] [FinEnum A] {S : Type} [Hashable S] [DecidableEq S] (stateSpace : Finset S) (init : inSS stateSpace) :
                      worklist.St A stateSpace
                      Equations
                      • One or more equations did not get rendered due to their size.
                      Instances For
                        def worklistRunAux (A : Type) [BEq A] [Hashable A] [DecidableEq A] [FinEnum A] {S : Type} [BEq S] [LawfulBEq S] [Hashable S] [DecidableEq S] (stateSpace : Finset S) (final : SBool) (f : SArray (A × inSS stateSpace)) (init : inSS stateSpace) :
                        NFA A
                        Equations
                        Instances For
                          @[irreducible]
                          def worklistRunAux.go (A : Type) [BEq A] [Hashable A] [DecidableEq A] [FinEnum A] {S : Type} [BEq S] [LawfulBEq S] [Hashable S] [DecidableEq S] (stateSpace : Finset S) (final : SBool) (f : SArray (A × inSS stateSpace)) (init : inSS stateSpace) (st0 : worklist.St A stateSpace) :
                          NFA A
                          Equations
                          • One or more equations did not get rendered due to their size.
                          Instances For
                            def NFA.addSink {A : Type} [BEq A] [Hashable A] [DecidableEq A] [FinEnum A] (m : NFA A) :
                            NFA A
                            Equations
                            • One or more equations did not get rendered due to their size.
                            Instances For
                              def NFA.flipFinals {A : Type} [BEq A] [Hashable A] [DecidableEq A] [FinEnum A] (m : NFA A) :
                              NFA A
                              Equations
                              • One or more equations did not get rendered due to their size.
                              Instances For
                                def product {A : Type} [BEq A] [Hashable A] [DecidableEq A] [FinEnum A] (final? : BoolBoolBool) (m1 : NFA A) (m2 : NFA A) :
                                NFA A
                                Equations
                                Instances For
                                  def product.init {A : Type} [BEq A] [Hashable A] [DecidableEq A] [FinEnum A] (m1 : NFA A) (m2 : NFA A) (st : product.State) :
                                  product.State
                                  Equations
                                  • One or more equations did not get rendered due to their size.
                                  Instances For
                                    @[irreducible]
                                    def product.go {A : Type} [BEq A] [Hashable A] [DecidableEq A] [FinEnum A] (final? : BoolBoolBool) (m1 : NFA A) (m2 : NFA A) (st0 : product.State) :
                                    NFA A
                                    Equations
                                    • One or more equations did not get rendered due to their size.
                                    Instances For
                                      def NFA.inter {A : Type} [BEq A] [Hashable A] [DecidableEq A] [FinEnum A] (m1 : NFA A) (m2 : NFA A) :
                                      NFA A
                                      Equations
                                      Instances For
                                        def NFA.union {A : Type} [BEq A] [Hashable A] [DecidableEq A] [FinEnum A] (m1 : NFA A) (m2 : NFA A) :
                                        NFA A
                                        Equations
                                        • m1.union m2 = product (fun (b1 b2 : Bool) => b1 || b2) m1.addSink m2.addSink
                                        Instances For
                                          def HashSet.inter {A : Type u_1} [BEq A] [Hashable A] (m1 : Std.HashSet A) (m2 : Std.HashSet A) :
                                          Equations
                                          Instances For
                                            def Std.HashSet.isDisjoint {A : Type u_1} [BEq A] [Hashable A] (m1 : Std.HashSet A) (m2 : Std.HashSet A) :
                                            Equations
                                            Instances For
                                              def HashSet.areIncluded {A : Type u_1} [BEq A] [Hashable A] (m1 : Std.HashSet A) (m2 : Std.HashSet A) :
                                              Equations
                                              Instances For
                                                instance hashableHashSet {A : Type} [BEq A] [Hashable A] :
                                                Equations
                                                def NFA.determinize {A : Type} [BEq A] [Hashable A] [DecidableEq A] [FinEnum A] (mi : NFA A) :
                                                NFA A
                                                Equations
                                                • One or more equations did not get rendered due to their size.
                                                Instances For
                                                  @[irreducible]
                                                  def NFA.determinize.go {A : Type} [BEq A] [Hashable A] [DecidableEq A] [FinEnum A] (mi : NFA A) (st : NFA.determinize.St) :
                                                  NFA A
                                                  Equations
                                                  • One or more equations did not get rendered due to their size.
                                                  Instances For
                                                    def NFA.neg {A : Type} [BEq A] [Hashable A] [DecidableEq A] [FinEnum A] (m : NFA A) :
                                                    NFA A
                                                    Equations
                                                    • m.neg = m.determinize.flipFinals
                                                    Instances For
                                                      def NFA.isIncluded {A : Type} [BEq A] [Hashable A] [DecidableEq A] [FinEnum A] (m1 : NFA A) (m2 : NFA A) :

                                                      Returns true when L(m1) ⊆ L(m2)

                                                      Equations
                                                      • One or more equations did not get rendered due to their size.
                                                      Instances For
                                                        @[irreducible]
                                                        def NFA.isIncluded.go {A : Type} [BEq A] [Hashable A] [DecidableEq A] [FinEnum A] (m1 : NFA A) (m2 : NFA A) (st : isIncluded.State) :
                                                        Equations
                                                        • One or more equations did not get rendered due to their size.
                                                        Instances For
                                                          def NFA.isUniversal {A : Type} [BEq A] [Hashable A] [DecidableEq A] [FinEnum A] (m : NFA A) :

                                                          Returns true when L(m) = A*

                                                          Equations
                                                          Instances For
                                                            @[irreducible]
                                                            def NFA.isUniversal.go {A : Type} [BEq A] [Hashable A] [DecidableEq A] [FinEnum A] (m : NFA A) (st : isUniversal.State) :
                                                            Equations
                                                            • One or more equations did not get rendered due to their size.
                                                            Instances For
                                                              def NFA.emptyWord {A : Type} [BEq A] [Hashable A] [DecidableEq A] [FinEnum A] :
                                                              NFA A

                                                              Recognizes the empty word

                                                              Equations
                                                              • NFA.emptyWord = match NFA.empty.newState with | (s, m) => let m := m.addInitial s; let m := m.addFinal s; m
                                                              Instances For
                                                                def NFA.isUniversal' {A : Type} [BEq A] [Hashable A] [DecidableEq A] [FinEnum A] (m : NFA A) :

                                                                Returns true when L(m) ∪ {ε} = A*. This is useful because the bitvector of with width zero has strange properties.

                                                                Equations
                                                                • m.isUniversal' = (m.union NFA.emptyWord).isUniversal
                                                                Instances For
                                                                  def NFA.isEmpty {A : Type} [BEq A] [Hashable A] [DecidableEq A] [FinEnum A] (m : NFA A) :
                                                                  Equations
                                                                  • m.isEmpty = m.finals.isEmpty
                                                                  Instances For
                                                                    def NFA.isNotEmpty {A : Type} [BEq A] [Hashable A] [DecidableEq A] [FinEnum A] (m : NFA A) :
                                                                    Equations
                                                                    • m.isNotEmpty = !m.finals.isEmpty
                                                                    Instances For
                                                                      Equations
                                                                      • instHashableBitVec_sSA = { hash := fun (x : BitVec n) => hash x.toFin }
                                                                      def transport {n2 : } {n1 : } (f : Fin n2Fin n1) (bv : BitVec n1) :
                                                                      Equations
                                                                      Instances For
                                                                        def NFA.lift {n1 : } {n2 : } (m1 : NFA (BitVec n1)) (f : Fin n1Fin n2) :
                                                                        NFA (BitVec n2)
                                                                        Equations
                                                                        • One or more equations did not get rendered due to their size.
                                                                        Instances For
                                                                          def NFA.proj {n1 : } {n2 : } (m1 : NFA (BitVec n1)) (f : Fin n2Fin n1) :
                                                                          NFA (BitVec n2)
                                                                          Equations
                                                                          • One or more equations did not get rendered due to their size.
                                                                          Instances For