                  :q2 []}
        :accepting #{:q2}})))
 
-   
-(defn ε= 
+(defn ε?
+  "Returns true if `x` is the epsilon keyword."
+  [x]
+  (= x :ε))
+
+(defn ε=
   "Returns true if `a` and `b` are equal, either is a set which contains the
   other, or either or both are :ε. Behaviour on two sets is undefined."
   [a b]

        remaining)
      ; All NDPFAs will look like q0 -> q1 -> q2 with the same accepting
      ; configuration and transitions save those form q1 to itself.
      {:start-state :q0 
       ; First move will always be to transform the stack to (first-symbol :Z)
       ; where :Z will designate the end of string symbol.
       :program {:q0 [[:q1 :ε :ε (list (:start-symbol cfg) :Z)]]

  (:require
    (clojure [string :as string]
             [set :as mset])))

(def alpha (set (map char (concat (range 65 91) (range 97 123)))))

(def paren-balancer
  "A PDA that accepts any string with balanced paren pairs."
