Source code for algorithms1

# -*- encoding: utf-8 -*-
"""

"""
__author__ = "Alexander Weigl <weigla@fh-trier.de>"
__date__ = "2012-06-12"
__license__ = "gpl-3.0"

from dfa import iterwords


[docs]def l12( dfa ): """ :param dfa: :return: """ A2 = dfa ** 2 A2r = A2.reverse for (d, f) in A2.Q: if d in dfa.F and f not in dfa.F: for ((p, q), z) in A2r.search((d, f), True): #with epsilon witness = dfa.reachable(p, q) if witness: return {"w": witness, "z": z[::-1], "+": d, "-": f, "p": p, "q": q} return {}
[docs]def b12( dfa ): """ :param dfa: :return: """ A2 = dfa ** 2 A2r = A2.reverse for (d, f) in A2.Q: if d in dfa.F and f not in dfa.F: for ((p, q), z) in A2r.search((d, f), True): #with epsilon witness = dfa.reachable(p, q) if witness: v = A2.reachable((p, q), (p, q)) if v: return {"w": witness, "z": z[::-1], "+": d, "-": f, "p": p, "q": q, "v": v} return {}
[docs]def l1(dfa ): """ :param dfa: :return: """ return l1_1(dfa), l1_2(dfa)
[docs]def l1_1(dfa ): """ :param ea: :return: """ A2 = dfa ** 2 A2r = A2.reverse # strongly connected components with witnesses in both direction Z, witness_w, witness_v = dfa.sCC() for r, t in A2.Q: if (r in dfa.F) ^ (t in dfa.F): for (p, q), z in A2r.search((r, t), True): if p in Z[q]: #if p == q: continue witness, v = witness_w[p, q], witness_v[p, q] return {"w": witness, "z": z[::-1], "r": r, "t": t, "p": p, "q": q, "v": v} return False
[docs]def l1_2(dfa ): A2 = dfa ** 2 A3 = dfa ** 3 # not implemented A2*A for (q, r, s) in A3.Q: for (q_, r_, s_), u in A3.search((q, r, s), True): if q_ == r_: for (q__, r__, s__), v in A3.search((q, q_, s_), True): if q__ == s__ and r__ == r and s == s__: for (d, f), z in A2.search((q_, s_)): if (d in dfa.F) ^ (f in dfa.F): return { "z": z, "v": v, "u": u, "q": q, "p": q_, "r": r, "s": s, "t": s_, "d": d, "f": f } return {}
[docs]def b1(dfa): A2 = dfa ** 2 A3 = dfa ** 3 Z, a, ar = dfa.sCC() for q1, q5, q4 in A3.Q: for (q1_, q5_, q4_), u in A3.search((q1, q5, q4), True): if q1_ == q5_: for q2 in Z[q1]: for (q2_, q1__, q4__), v in A3.search((q2, q1_, q4_), True): if q2_ == q4 and q5 == q1__ and q4 == q4__: witness = A3.reachable((q1, q5, q4), (q1, q5, q4)) if witness: w_ = A3.reachable((q2, q5_, q4_), (q2, q5_, q4_)) if w_: for (d, f), z in A2.search((q5_, q4_), True): if (d in dfa.F) ^ (f in dfa.F): return { "w": witness, "z": z, "v": v, "u": u, "w'": w_, "y": a[q1, q2], "y'": ar[q1, q2], "q1": q1, "q2": q2, "q3": q5_, "q4": q4, "q5": q5, "q6": q4_, "d": d, "f": f } return {}
[docs]def alpha(s): return set(iterwords(s))
[docs]def l32( dfa ): A2 = dfa ** 2 A2r = A2.reverse for (d, f) in A2.Q: if d in A2.F and f not in A2.F: for ((p, q), z) in A2r.search((d, f), True): #with epsilon v = A2.reachable((p, q), (p, q)) if v: witness = dfa.reachable(p, q, alpha(v)) if witness: return {"w": witness, "v": v, "z": z, "+": d, "-": f, "p": p, "q": q} return {}

This Page