Deterministic Finite Accepters 

> InternalStates:={q0,q1,q2}:
Alphabet:={`0`,`1`}:
delta:=table():
delta[(q0,`0`)]:=q0:
delta[(q0,`1`)]:=q1:
delta[(q1,`0`)]:=q0:
delta[(q1,`1`)]:=q2:
delta[(q2,`0`)]:=q2:
delta[(q2,`1`)]:=q1:
InitialState:=q0:
FinalStates:={q1}:
dfa:=mkDFA(InternalStates,Alphabet,op(delta),InitialState,FinalStates);
 

`:=`(dfa, DFA({q0, q1, q2}, {`0`, `1`}, TABLE([(q0, `1`) = q1, (q2, `0`) = q2, (q2, `1`) = q1, (q0, `0`) = q0, (q1, `1`) = q2, (q1, `0`) = q0]), q0, {q1}))
`:=`(dfa, DFA({q0, q1, q2}, {`0`, `1`}, TABLE([(q0, `1`) = q1, (q2, `0`) = q2, (q2, `1`) = q1, (q0, `0`) = q0, (q1, `1`) = q2, (q1, `0`) = q0]), q0, {q1}))
(5.1)
 

> transitionGraph(dfa);
 

Plot_2d
 

Random DFA: 

String Verification 

Find Sentences 

Removing unreachable states 

Partition 

Minimalization 

> while true do
dfa:=reachableDFA(randomDFA(6,[0,1],3,initialState='q0',internalStateStartingSymbol='q')):
dfa2:=minimalDFA(dfa):

if nops(op(1,dfa)) > nops(op(1,dfa2))+2 then
 break;
fi:
od:
 

> dfa;
 

DFA({q0, q1, q2, q3, q4, q5}, {0, 1}, TABLE([(q5, 0) = q5, (q4, 0) = q5, (q3, 1) = q2, (q4, 1) = q1, (q0, 1) = q2, (q5, 1) = q2, (q3, 0) = q2, (q0, 0) = q4, (q2, 1) = q3, (q1, 1) = q2, (q1, 0) = q2, (...
DFA({q0, q1, q2, q3, q4, q5}, {0, 1}, TABLE([(q5, 0) = q5, (q4, 0) = q5, (q3, 1) = q2, (q4, 1) = q1, (q0, 1) = q2, (q5, 1) = q2, (q3, 0) = q2, (q0, 0) = q4, (q2, 1) = q3, (q1, 1) = q2, (q1, 0) = q2, (...
DFA({q0, q1, q2, q3, q4, q5}, {0, 1}, TABLE([(q5, 0) = q5, (q4, 0) = q5, (q3, 1) = q2, (q4, 1) = q1, (q0, 1) = q2, (q5, 1) = q2, (q3, 0) = q2, (q0, 0) = q4, (q2, 1) = q3, (q1, 1) = q2, (q1, 0) = q2, (...
(5.6.1)
 

> dfa2;
 

DFA({{q2, q4}, {q5}, {q0, q1, q3}}, {0, 1}, TABLE([({q5}, 0) = {q5}, ({q2, q4}, 0) = {q5}, ({q5}, 1) = {q2, q4}, ({q2, q4}, 1) = {q0, q1, q3}, ({q0, q1, q3}, 1) = {q2, q4}, ({q0, q1, q3}, 0) = {q2, q4...
DFA({{q2, q4}, {q5}, {q0, q1, q3}}, {0, 1}, TABLE([({q5}, 0) = {q5}, ({q2, q4}, 0) = {q5}, ({q5}, 1) = {q2, q4}, ({q2, q4}, 1) = {q0, q1, q3}, ({q0, q1, q3}, 1) = {q2, q4}, ({q0, q1, q3}, 0) = {q2, q4...
DFA({{q2, q4}, {q5}, {q0, q1, q3}}, {0, 1}, TABLE([({q5}, 0) = {q5}, ({q2, q4}, 0) = {q5}, ({q5}, 1) = {q2, q4}, ({q2, q4}, 1) = {q0, q1, q3}, ({q0, q1, q3}, 1) = {q2, q4}, ({q0, q1, q3}, 0) = {q2, q4...
(5.6.2)
 

>
 

Examples: 

> dfa:=mkNFA({q0, q1, q2, q3, q4, q5,q6},{0, 1},table([(q5, 0) = q1, (q4, 0) = q3, (q3, 1) = q5, (q4, 1) = q3, (q0, 1) = q2, (q5, 1) = q3, (q3, 0) = q5, (q0, 0) = q2, (q1, 1) = q4, (q2, 1) = q5, (q1, 0) = q5, (q2, 0) = q0]),q0,{q1, q2, q3}):
transitionGraph(dfa);
 

Plot_2d
 

> transitionGraph(minimalDFA(NFA2DFA(dfa)));
 

Plot_2d
 

> dfa:=DFA({q0, q1, q2, q3, q4, q5},{0, 1},table([(q5, 0) = q3, (q4, 0) = q5, (q3, 1) = q1, (q4, 1) = q4, (q0, 1) = q3, (q5, 1) = q4, (q3, 0) = q2, (q0, 0) = q5, (q1, 1) = q4, (q2, 1) = q4, (q1, 0) = q5, (q2, 0) = q5]),q0,{q0, q1, q4}):
transitionGraph(dfa);
 

Plot_2d
 

> transitionGraph(minimalDFA(dfa));
 

Plot_2d
 

> dfa:=DFA({q0, q1, q2, q3, q5},{0, 1},table([(q5, 0) = q5, (q3, 1) = q2, (q0, 1) = q3, (q5, 1) = q1, (q3, 0) = q5, (q0, 0) = q5, (q1, 1) = q5, (q2, 1) = q2, (q1, 0) = q1, (q2, 0) = q5]),q0,{q1, q5}):
transitionGraph(dfa);
 

Plot_2d
 

> transitionGraph(minimalDFA(dfa));
 

Plot_2d
 

> dfa:=mkDFA({q0, q1, q2, q3, q4, q5,q6},{0, 1},table([(q5, 0) = q3, (q4, 0) = q3, (q3, 1) = q3, (q4, 1) = q0, (q0, 1) = q2, (q5, 1) = q1, (q3, 0) = q5, (q0, 0) = q5, (q1, 1) = q2, (q2, 1) = q2, (q1, 0) = q4, (q2, 0) = q5, (q5,0) = q6, (q6,0) = q6, (q6,1) = q6]),q0,{q0, q1, q2,q6}):
transitionGraph(dfa);
 

Plot_2d
 

> partitionDFA(dfa);
 

{{q1}, {q5}, {q6}, {q2, q0}, {q4}, {q3}} (5.6.1.1)
 

> transitionGraph(minimalDFA(dfa));
 

Plot_2d
 

> dfa:=mkDFA({q0, q1, q2, q3, q4, q5},{0, 1},table([(q5, 0) = q5, (q4, 0) = q5, (q3, 1) = q2, (q4, 1) = q1, (q0, 1) = q2, (q5, 1) = q2, (q3, 0) = q2, (q0, 0) = q4, (q2, 1) = q3, (q1, 1) = q2, (q1, 0) = q2, (q2, 0) = q5]),q0,{q0, q1, q3, q5}):
transitionGraph(dfa);
 

Plot_2d
 

> transitionGraph(minimalDFA(dfa));
 

Plot_2d
 

> dfa:=randomDFA(6,[0,1],2,initialState='q0',internalStateStartingSymbol='q');
 

`:=`(dfa, DFA({q0, q1, q2, q3, q4, q5}, {0, 1}, TABLE([(q5, 0) = q4, (q4, 0) = q1, (q3, 1) = q3, (q4, 1) = q2, (q0, 1) = q5, (q5, 1) = q0, (q3, 0) = q3, (q0, 0) = q2, (q1, 1) = q1, (q2, 1) = q4, (q1, ...
`:=`(dfa, DFA({q0, q1, q2, q3, q4, q5}, {0, 1}, TABLE([(q5, 0) = q4, (q4, 0) = q1, (q3, 1) = q3, (q4, 1) = q2, (q0, 1) = q5, (q5, 1) = q0, (q3, 0) = q3, (q0, 0) = q2, (q1, 1) = q1, (q2, 1) = q4, (q1, ...
`:=`(dfa, DFA({q0, q1, q2, q3, q4, q5}, {0, 1}, TABLE([(q5, 0) = q4, (q4, 0) = q1, (q3, 1) = q3, (q4, 1) = q2, (q0, 1) = q5, (q5, 1) = q0, (q3, 0) = q3, (q0, 0) = q2, (q1, 1) = q1, (q2, 1) = q4, (q1, ...
(5.6.3)
 

> op(1,dfa);
 

{q0, q1, q2, q3, q4, q5} (5.6.4)
 

> dfa1:=randomDFA(6,[0,1],2,initialState='q0',internalStateStartingSymbol='q');
dfa2:=minimalDFA(dfa);
 

`:=`(dfa, DFA({q1, q2, q3, q4, q5, q0}, {0, 1}, TABLE([(q2, 0) = q4, (q1, 0) = q0, (q0, 0) = q4, (q2, 1) = q1, (q3, 1) = q5, (q4, 1) = q2, (q0, 1) = q5, (q5, 0) = q3, (q4, 0) = q1, (q5, 1) = q2, (q3, ...
`:=`(dfa, DFA({q1, q2, q3, q4, q5, q0}, {0, 1}, TABLE([(q2, 0) = q4, (q1, 0) = q0, (q0, 0) = q4, (q2, 1) = q1, (q3, 1) = q5, (q4, 1) = q2, (q0, 1) = q5, (q5, 0) = q3, (q4, 0) = q1, (q5, 1) = q2, (q3, ...
`:=`(dfa, DFA({q1, q2, q3, q4, q5, q0}, {0, 1}, TABLE([(q2, 0) = q4, (q1, 0) = q0, (q0, 0) = q4, (q2, 1) = q1, (q3, 1) = q5, (q4, 1) = q2, (q0, 1) = q5, (q5, 0) = q3, (q4, 0) = q1, (q5, 1) = q2, (q3, ...
(5.6.5)
 

`:=`(dfa1, DFA({q1, q2, q3, q4, q5, q0}, {0, 1}, TABLE([(q2, 0) = q4, (q1, 0) = q5, (q0, 0) = q3, (q2, 1) = q5, (q3, 1) = q5, (q4, 1) = q1, (q0, 1) = q0, (q5, 0) = q5, (q4, 0) = q1, (q5, 1) = q3, (q3,...
`:=`(dfa1, DFA({q1, q2, q3, q4, q5, q0}, {0, 1}, TABLE([(q2, 0) = q4, (q1, 0) = q5, (q0, 0) = q3, (q2, 1) = q5, (q3, 1) = q5, (q4, 1) = q1, (q0, 1) = q0, (q5, 0) = q5, (q4, 0) = q1, (q5, 1) = q3, (q3,...
`:=`(dfa1, DFA({q1, q2, q3, q4, q5, q0}, {0, 1}, TABLE([(q2, 0) = q4, (q1, 0) = q5, (q0, 0) = q3, (q2, 1) = q5, (q3, 1) = q5, (q4, 1) = q1, (q0, 1) = q0, (q5, 0) = q5, (q4, 0) = q1, (q5, 1) = q3, (q3,...
(5.6.5)
 

`:=`(dfa2, DFA({{q0}, {q3}, {q5}, {q1}, {q2}, {q4}}, {0, 1}, TABLE([({q1}, 0) = {q0}, ({q3}, 1) = {q5}, ({q3}, 0) = {q3}, ({q0}, 0) = {q4}, ({q1}, 1) = {q2}, ({q2}, 1) = {q1}, ({q5}, 0) = {q3}, ({q5},...
`:=`(dfa2, DFA({{q0}, {q3}, {q5}, {q1}, {q2}, {q4}}, {0, 1}, TABLE([({q1}, 0) = {q0}, ({q3}, 1) = {q5}, ({q3}, 0) = {q3}, ({q0}, 0) = {q4}, ({q1}, 1) = {q2}, ({q2}, 1) = {q1}, ({q5}, 0) = {q3}, ({q5},...
`:=`(dfa2, DFA({{q0}, {q3}, {q5}, {q1}, {q2}, {q4}}, {0, 1}, TABLE([({q1}, 0) = {q0}, ({q3}, 1) = {q5}, ({q3}, 0) = {q3}, ({q0}, 0) = {q4}, ({q1}, 1) = {q2}, ({q2}, 1) = {q1}, ({q5}, 0) = {q3}, ({q5},...
`:=`(dfa2, DFA({{q0}, {q3}, {q5}, {q1}, {q2}, {q4}}, {0, 1}, TABLE([({q1}, 0) = {q0}, ({q3}, 1) = {q5}, ({q3}, 0) = {q3}, ({q0}, 0) = {q4}, ({q1}, 1) = {q2}, ({q2}, 1) = {q1}, ({q5}, 0) = {q3}, ({q5},...
(5.6.5)
 

Equivalence of the DFAs 

> isEmptyNFA(complementNFA(unionNFA(complementNFA(dfa),dfa2)));
isEmptyNFA(complementNFA(unionNFA(complementNFA(dfa2),dfa)));
 

true (5.6.6)
 

true (5.6.6)
 

> isEmptyNFA(intersectNFA(dfa,complementNFA(dfa2)));
isEmptyNFA(intersectNFA(dfa2,complementNFA(dfa)));
 

true (5.6.7)
 

true (5.6.7)
 

> isEquivalentNFA(dfa,dfa2);
 

true (5.6.8)
 

> dfa := DFA({q0, q1, q2, q3, q4},{0, 1},table([(q3, 1) = q0, (q2, 0) = q0, (q1, 1) = q3, (q4, 0) = q4, (q2, 1) = q1, (q1, 0) = q3, (q0, 0) = q2, (q0, 1) = q1, (q4, 1) = q0, (q3, 0) = q3]),q0,{q0, q1, q2}):
 

> dfa := DFA({q0, q1, q2, q3, q4, q5},{0, 1},table([(q3, 1) = q4, (q2, 0) = q5, (q1, 1) = q3, (q4, 0) = q5, (q5, 1) = q4, (q2, 1) = q4, (q1, 0) = q0, (q5, 0) = q2, (q0, 0) = q4, (q0, 1) = q0, (q4, 1) = q2, (q3, 0) = q5]),q0,{q2, q5}):
 

> dfa := DFA({q0, q1, q2, q3, q4, q5},{0, 1},table([(q3, 1) = q4, (q2, 0) = q1, (q1, 1) = q4, (q4, 0) = q3, (q5, 1) = q0, (q2, 1) = q2, (q1, 0) = q3, (q5, 0) = q4, (q0, 0) = q5, (q0, 1) = q4, (q4, 1) = q2, (q3, 0) = q3]),q0,{q1, q3}):
 

> dfa := DFA({q0, q1, q2, q3, q4},{0, 1},table([(q3, 1) = q4, (q2, 0) = q3, (q1, 1) = q2, (q4, 0) = q1, (q2, 1) = q3, (q1, 0) = q4, (q0, 0) = q3, (q0, 1) = q4, (q4, 1) = q2, (q3, 0) = q0]),q0,{q1, q4}):
 

>
 

> transitionGraph(dfa);
 

Plot_2d
 

> dfa2:=minimalDFA(dfa);
transitionGraph(dfa2);
 

`:=`(dfa2, DFA({{q1, q3}, {q0}, {q2, q4}, {q5}}, {0, 1}, TABLE([({q0}, 1) = {q2, q4}, ({q2, q4}, 0) = {q1, q3}, ({q2, q4}, 1) = {q2, q4}, ({q5}, 0) = {q2, q4}, ({q1, q3}, 0) = {q1, q3}, ({q0}, 0) = {q...
`:=`(dfa2, DFA({{q1, q3}, {q0}, {q2, q4}, {q5}}, {0, 1}, TABLE([({q0}, 1) = {q2, q4}, ({q2, q4}, 0) = {q1, q3}, ({q2, q4}, 1) = {q2, q4}, ({q5}, 0) = {q2, q4}, ({q1, q3}, 0) = {q1, q3}, ({q0}, 0) = {q...
`:=`(dfa2, DFA({{q1, q3}, {q0}, {q2, q4}, {q5}}, {0, 1}, TABLE([({q0}, 1) = {q2, q4}, ({q2, q4}, 0) = {q1, q3}, ({q2, q4}, 1) = {q2, q4}, ({q5}, 0) = {q2, q4}, ({q1, q3}, 0) = {q1, q3}, ({q0}, 0) = {q...
 

Plot_2d
 

 

 

> dfa:=mkDFA([q0, q1, q2, q3, q4, q5], [a1, a2, a3], table([(q4, a1) = q1, (q1, a3) = q0, (q5, a3) = q4, (q0, a1) = q0, (q1, a2) = q0, (q5, a2) = q1, (q5, a1) = q0, (q3, a3) = q5, (q3, a1) = q1, (q1, a1) = q3, (q4, a3) = q0, (q3, a2) = q2, (q2, a3) = q4, (q0, a3) = q5, (q4, a2) = q0, (q2, a1) = q0, (q2, a2) = q1, (q0, a2) = q1]), q0, [q4, q1]):
transitionGraph(dfa);
 

Plot_2d
 

> minimalDFA(dfa);
 

DFA({{q3}, {q4}, {q1}, {q0}, {q2, q5}}, {a3, a1, a2}, TABLE([({q0}, a3) = {q2, q5}, ({q1}, a3) = {q0}, ({q2, q5}, a2) = {q1}, ({q2, q5}, a3) = {q4}, ({q2, q5}, a1) = {q0}, ({q0}, a2) = {q1}, ({q3}, a3...
DFA({{q3}, {q4}, {q1}, {q0}, {q2, q5}}, {a3, a1, a2}, TABLE([({q0}, a3) = {q2, q5}, ({q1}, a3) = {q0}, ({q2, q5}, a2) = {q1}, ({q2, q5}, a3) = {q4}, ({q2, q5}, a1) = {q0}, ({q0}, a2) = {q1}, ({q3}, a3...
DFA({{q3}, {q4}, {q1}, {q0}, {q2, q5}}, {a3, a1, a2}, TABLE([({q0}, a3) = {q2, q5}, ({q1}, a3) = {q0}, ({q2, q5}, a2) = {q1}, ({q2, q5}, a3) = {q4}, ({q2, q5}, a1) = {q0}, ({q0}, a2) = {q1}, ({q3}, a3...
DFA({{q3}, {q4}, {q1}, {q0}, {q2, q5}}, {a3, a1, a2}, TABLE([({q0}, a3) = {q2, q5}, ({q1}, a3) = {q0}, ({q2, q5}, a2) = {q1}, ({q2, q5}, a3) = {q4}, ({q2, q5}, a1) = {q0}, ({q0}, a2) = {q1}, ({q3}, a3...
DFA({{q3}, {q4}, {q1}, {q0}, {q2, q5}}, {a3, a1, a2}, TABLE([({q0}, a3) = {q2, q5}, ({q1}, a3) = {q0}, ({q2, q5}, a2) = {q1}, ({q2, q5}, a3) = {q4}, ({q2, q5}, a1) = {q0}, ({q0}, a2) = {q1}, ({q3}, a3...
(5.6.9)
 

> # L={w \in {a,b}^*:n_a(w) mod 3 > n_b(w) mod 3}
nfa:=mkNFA([q0,q1,q2,q3,q4,q5,q6],[a,b],table([(q0,a)=q1,(q1,a)=q4,(q1,b)={q2},(q2,b)={q3},(q3,b)={q1},(q4,a)={q0},(q4,b)={q5},(q5,b)={q6},(q6,b)={q4}]),q0,[q1,q4,q5]);
transitionGraph(nfa);
 

`:=`(nfa, NFA({q2, q0, q3, q4, q5, q6, q1}, {a, b}, TABLE([(q3, b) = {q1}, (q2, b) = {q3}, (q0, a) = {q1}, (q5, b) = {q6}, (q6, b) = {q4}, (q1, a) = {q4}, (q1, b) = {q2}, (q4, a) = {q0}, (q4, b) = {q5...
`:=`(nfa, NFA({q2, q0, q3, q4, q5, q6, q1}, {a, b}, TABLE([(q3, b) = {q1}, (q2, b) = {q3}, (q0, a) = {q1}, (q5, b) = {q6}, (q6, b) = {q4}, (q1, a) = {q4}, (q1, b) = {q2}, (q4, a) = {q0}, (q4, b) = {q5...
`:=`(nfa, NFA({q2, q0, q3, q4, q5, q6, q1}, {a, b}, TABLE([(q3, b) = {q1}, (q2, b) = {q3}, (q0, a) = {q1}, (q5, b) = {q6}, (q6, b) = {q4}, (q1, a) = {q4}, (q1, b) = {q2}, (q4, a) = {q0}, (q4, b) = {q5...
 

Plot_2d
 

> dfa:=NFA2DFA(nfa):
transitionGraph(dfa);
 

Plot_2d
 

> minimalDFA(dfa):
transitionGraph(%);
 

Plot_2d
 

Convert from table to function: 

Transition Graph 

Animation 

Simplification