-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathunion.py
75 lines (57 loc) · 1.4 KB
/
union.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
from graphviz import Digraph
from DFA import DFA, union
A1 = {
"initial": 0,
"final": [0],
"alpha": ["a", "b"],
"transitions": [
[1, 2],
[2, 0],
[0, 1]
]
}
A2 = {
"initial": 0,
"final": [2],
"alpha": ["a", "b"],
"transitions": [
[1, 2],
[3, 2],
[1, 2],
[3, 3]
]
}
def delta_from_table(jdfa):
res = {}
alpha = jdfa['alpha']
for i, transition in enumerate(jdfa['transitions']):
for j, tgt in enumerate(transition):
res[(i, alpha[j])] = tgt
return lambda s, a: res[(s, a)]
def dfa_from_jdfa(jdfa):
states = range(len(jdfa['transitions']))
delta = delta_from_table(jdfa)
return DFA(states, jdfa['alpha'], delta, jdfa['initial'], jdfa['final'])
def plot(dfa):
dot = Digraph(comment='')
for s in dfa.states:
attrs = {'shape': 'circle'}
if s == dfa.start:
attrs['fillcolor'] = 'yellow'
if s in dfa.accepts:
attrs['shape'] = 'doublecircle'
dot.node(str(s), **attrs)
for s in dfa.states:
for sym in dfa.alphabet:
r = dfa.delta(s, sym)
dot.edge(str(s), str(r), label=sym)
return dot
def main():
da1 = dfa_from_jdfa(A1)
da2 = dfa_from_jdfa(A2)
da3 = union(da1, da2)
dot = plot(da3)
print dot.source
dot.render(view=True)
if __name__ == '__main__':
main()