NFA¶
Module to manage NFA (Nondeterministic Finite Automata).
Formally a NFA, Nondeterministic Finite Automaton, is a tuple \((Σ, S, S^0 , ρ, F )\), where
Σ is a finite nonempty alphabet;
S is a finite nonempty set of states;
\(S^0\) is the nonempty set of initial states;
F is the set of accepting states;
\(ρ: S × Σ × S\) is a transition relation. Intuitively, \((s, a, s' ) ∈ ρ\) states that A can move from s into s’ when it reads the symbol a. It is allowed that \((s, a, s' ) ∈ ρ\) and \((s, a, s'' ) ∈ ρ\) with \(S' ≠ S''\) .
In this module a NFA is defined as follows
NFA = dict() with the following keys-values:
alphabet => set() ;
states => set() ;
initial_states => set() ;
accepting_states => set() ;
- transitions => dict(), where
key: (state in states, action in alphabet)
value: {set of arriving states in states}.
List
|
Returns a DFA reading the complemented language read by input NFA. |
|
Returns a DFA that reads the same language of the input NFA. |
Checks if the input NFA is interesting, returning True/False. |
|
|
Returns a NFA that reads the intersection of the NFAs in input. |
Checks if the input NFA reads any language other than the empty one, returning True/False. |
|
Checks if the language read by the input NFA is different from Σ∗ (i.e. |
|
|
Returns a NFA that reads the union of the NFAs in input. |
|
Checks if a given word is accepted by a NFA. |
|
Side effect on input! Renames all the states of the NFA adding a suffix. |
Functions
- PySimpleAutomata.NFA.nfa_complementation(nfa: dict) dict [source]¶
Returns a DFA reading the complemented language read by input NFA.
Complement a nondeterministic automaton is possible complementing the determinization of it. The construction is effective, but it involves an exponential blow-up, since determinization involves an unavoidable exponential blow-up (i.e., if NFA has n states, then the DFA has \(2^n\) states).
- Parameters:
nfa (dict) – input NFA.
- Returns:
(dict) representing a completed DFA.
- PySimpleAutomata.NFA.nfa_determinization(nfa: dict) dict [source]¶
Returns a DFA that reads the same language of the input NFA.
Let A be an NFA, then there exists a DFA \(A_d\) such that \(L(A_d) = L(A)\). Intuitively, \(A_d\) collapses all possible runs of A on a given input word into one run over a larger state set. \(A_d\) is defined as:
\(A_d = (Σ, 2^S , s_0 , ρ_d , F_d )\)
where:
\(2^S\) , i.e., the state set of \(A_d\) , consists of all sets of states S in A;
\(s_0 = S^0\) , i.e., the single initial state of \(A_d\) is the set \(S_0\) of initial states of A;
\(F_d = \{Q | Q ∩ F ≠ ∅\}\), i.e., the collection of sets of states that intersect F nontrivially;
\(ρ_d(Q, a) = \{s' | (s,a, s' ) ∈ ρ\ for\ some\ s ∈ Q\}\).
- Parameters:
nfa (dict) – input NFA.
- Returns:
(dict) representing a DFA
- PySimpleAutomata.NFA.nfa_interestingness_check(nfa: dict) bool [source]¶
Checks if the input NFA is interesting, returning True/False.
An automaton is “interesting” if it defines an “interesting” language, i.e., a language that is neither empty nor contains all possible words.
- Parameters:
nfa (dict) – input NFA.
- Returns:
(bool), True if the input nfa is interesting, False otherwise.
- PySimpleAutomata.NFA.nfa_intersection(nfa_1: dict, nfa_2: dict) dict [source]¶
Returns a NFA that reads the intersection of the NFAs in input.
Let \(A_1 = (Σ,S_1,S_1^0,ρ_1,F_1)\) and \(A_2 =(Σ, S_2,S_2^0,ρ_2,F_2)\) be two NFAs. There is a NFA \(A_∧\) that runs simultaneously both \(A_1\) and \(A_2\) on the input word, so \(L(A_∧) = L(A_1)∩L(A_2)\). It is defined as:
\(A_∧ = ( Σ , S , S_0 , ρ , F )\)
where
\(S = S_1 × S_2\)
\(S_0 = S_1^0 × S_2^0\)
\(F = F_1 × F_2\)
\(((s,t), a, (s_X , t_X)) ∈ ρ\) iff \((s, a,s_X ) ∈ ρ_1\) and \((t, a, t_X ) ∈ ρ_2\)
- Parameters:
nfa_1 (dict) – first input NFA;
nfa_2 (dict) – second input NFA;
- Returns:
(dict) representing the intersected NFA.
- PySimpleAutomata.NFA.nfa_nonemptiness_check(nfa: dict) bool [source]¶
Checks if the input NFA reads any language other than the empty one, returning True/False.
The language L(A) recognized by the automaton A is nonempty iff there are states \(s ∈ S_0\) and \(t ∈ F\) such that t is connected to s. Thus, automata nonemptiness is equivalent to graph reachability.
A breadth-first-search algorithm can construct in linear time the set of all states connected to a state in \(S_0\). A is nonempty iff this set intersects F nontrivially.
- Parameters:
nfa (dict) – input NFA.
- Returns:
(bool), True if the input nfa is nonempty, False otherwise.
- PySimpleAutomata.NFA.nfa_nonuniversality_check(nfa: dict) bool [source]¶
Checks if the language read by the input NFA is different from Σ∗ (i.e. contains all possible words), returning True/False.
To test nfa A for nonuniversality, it suffices to test Ā ( complementary automaton of A) for nonemptiness
- Parameters:
nfa (dict) – input NFA.
- Returns:
(bool), True if input nfa is nonuniversal, False otherwise.
- PySimpleAutomata.NFA.nfa_union(nfa_1: dict, nfa_2: dict) dict [source]¶
Returns a NFA that reads the union of the NFAs in input.
Let \(A_1 = (Σ,S_1,S_1^0,ρ_1,F_1)\) and \(A_2 =(Σ, S_2,S_2^0,ρ_2,F_2)\) be two NFAs. here is a NFA \(A_∨\) that nondeterministically chooses \(A_1\) or \(A_2\) and runs it on the input word. It is defined as:
\(A_∨ = (Σ, S, S_0 , ρ, F )\)
where:
\(S = S_1 ∪ S_2\)
\(S_0 = S_1^0 ∪ S_2^0\)
\(F = F_1 ∪ F_2\)
\(ρ = ρ_1 ∪ ρ_2\) , that is \((s, a, s' ) ∈ ρ\) if \([ s ∈ S_1\ and\ (s, a, s' ) ∈ ρ_1 ]\) OR \([ s ∈ S_2\ and\ (s, a, s' ) ∈ ρ_2 ]\)
Pay attention to avoid having the NFAs with state names in common, in case use
PySimpleAutomata.NFA.rename_nfa_states
function.- Parameters:
nfa_1 (dict) – first input NFA;
nfa_2 (dict) – second input NFA.
- Returns:
(dict) representing the united NFA.
- PySimpleAutomata.NFA.nfa_word_acceptance(nfa: dict, word: list) bool [source]¶
Checks if a given word is accepted by a NFA.
The word w is accepted by a NFA if exists at least an accepting run on w.
- Parameters:
nfa (dict) – input NFA;
word (list) – list of symbols ∈ nfa[‘alphabet’];
- Returns:
(bool), True if the word is accepted, False otherwise.
- PySimpleAutomata.NFA.rename_nfa_states(nfa: dict, suffix: str)[source]¶
Side effect on input! Renames all the states of the NFA adding a suffix.
It is an utility function to be used to avoid automata to have states with names in common.
Avoid suffix that can lead to special name like “as”, “and”,…
- Parameters:
nfa (dict) – input NFA.
suffix (str) – string to be added at beginning of each state name.