AFW

Module to manage AFW (Alternating Finite automaton on Words).

Formally a AFW (Alternating Finite automaton on Words) is a tuple \((Σ, S, s0, ρ, F )\), where:

  • Σ is a finite nonempty alphabet;
  • S is a finite nonempty set of states;
  • \(s0 ∈ S\) is the initial state (notice that, as in dfas, we have a unique initial state);
  • F ⊆ S is the set of accepting states;
  • \(ρ : S × Σ → B+(S)\) is a transition function. \(B+(X)\) be the set of positive Boolean formulas over a given set X ex. of \(ρ: ρ(s, a) = (s1 ∧ s2) ∨ (s3 ∧ s4)\)

In this module a AFW is defined as follows

AFW = dict() with the following keys-values:

  • alphabet => set()

  • states => set()

  • initial_state => ‘state_0’

  • accepting_states => set()

  • transitions => dict(), where

    key (state ∈ states, action ∈ alphabet)

    value [string representing a PYTHON boolean expression

    over states; where we also allow the formulas True and False]

List

formula_dual(input_formula) Returns the dual of the input formula.
afw_complementation(afw) Returns a AFW reading the complemented language read by input AFW.
afw_completion(afw) Side effect on input! Complete the afw adding not present transitions and marking them as False.
afw_intersection(afw_1, afw_2) Returns a AFW that reads the intersection of the languages read by input AFWs.
afw_nonemptiness_check(afw) Checks if the input AFW reads any language other than the empty one, returning True/False.
afw_nonuniversality_check(afw) Checks if the language read by the input AFW is different from Σ∗, returning True/False.
afw_to_nfa_conversion(afw) Returns a NFA reading the same language of input AFW.
afw_union(afw_1, afw_2) Returns a AFW that reads the union of the languages read by input AFWs.
nfa_to_afw_conversion(nfa) Returns a AFW reading the same language of input NFA.
rename_afw_states(afw, suffix) Side effect on input! Renames all the states of the AFW adding a suffix.
afw_word_acceptance(afw, word) Checks if a word is accepted by input AFW, returning True/False.

Functions

PySimpleAutomata.AFW.afw_complementation(afw: dict) → dict[source]

Returns a AFW reading the complemented language read by input AFW.

Let \(A = (Σ, S, s^0 , ρ, F )\). Define \(Ā = (Σ, S, s^0 , \overline{ρ}, S − F )\), where \(\overline{ρ}(s, a) = \overline{ρ(s, a)}\) for all \(s ∈ S\) and \(a ∈ Σ\). That is, \(\overline{ρ}\) is the dualized transition function. It can be shown that \(L( Ā) = Σ^∗ − L(A)\).

The input afw need to be completed i.e. each non existing transition must be added pointing to False.

Parameters:afw (dict) – input AFW.
Returns:(dict) representing a AFW.
PySimpleAutomata.AFW.afw_completion(afw)[source]

Side effect on input! Complete the afw adding not present transitions and marking them as False.

Parameters:afw (dict) – input AFW.
PySimpleAutomata.AFW.afw_intersection(afw_1: dict, afw_2: dict) → dict[source]

Returns a AFW that reads the intersection of the languages read by input AFWs.

Let \(A_1 = (Σ, S_1 , s^0_1, ρ_1 , F_1 )\) and \(A_2 = (Σ, S_2 , s^0_2, ρ_2 , F_2 )\) be alternating automata accepting the languages \(L( A_1)\) and \(L(A_2)\). Then, \(B_∩ = (Σ, S_1 ∪ S_2 ∪ {root}, root, ρ_∩ , F_1 ∪ F_2 )\) with \(ρ_∩ = ρ_1 ∪ ρ_2 ∪ [(root, a): ρ(s^0_1 , a) ∧ ρ(s^0_2 , a)]\) accepts \(L(A_1) ∩ L(A_2)\).

Parameters:
  • afw_1 (dict) – first input AFW;
  • afw_2 (dict) – second input AFW.
Returns:

(dict) representing a AFW.

PySimpleAutomata.AFW.afw_nonemptiness_check(afw: dict) → bool[source]

Checks if the input AFW reads any language other than the empty one, returning True/False.

The afw is translated into a nfa and then its nonemptiness is checked.

Parameters:afw (dict) – input AFW.
Returns:(bool), True if input afw is nonempty, False otherwise.
PySimpleAutomata.AFW.afw_nonuniversality_check(afw: dict) → bool[source]

Checks if the language read by the input AFW is different from Σ∗, returning True/False.

The afw is translated into a nfa and then its nonuniversality is checked.

Parameters:afw (dict) – input AFW.
Returns:(bool), True if input afw is nonuniversal, False otherwise.
PySimpleAutomata.AFW.afw_to_nfa_conversion(afw: dict) → dict[source]

Returns a NFA reading the same language of input AFW.

Let \(A = (Σ, S, s^0 , ρ, F )\) be an afw. Then we define the nfa \(A_N\) such that \(L(A_N) = L(A)\) as follows \(AN = (Σ, S_N , S^0_N , ρ_N , F_N )\) where:

  • \(S_N = 2^S\)
  • \(S^0_N= \{\{s^0 \}\}\)
  • \(F_N=2^F\)
  • \((Q,a,Q') ∈ ρ_N\) iff \(Q'\) satisfies \(⋀_{ s∈Q} ρ(s, a)\)

We take an empty conjunction in the definition of \(ρ_N\) to be equivalent to true; thus, \((∅, a, ∅) ∈ ρ_N\).

Parameters:afw (dict) – input AFW.
Returns:(dict) representing a NFA.
PySimpleAutomata.AFW.afw_union(afw_1: dict, afw_2: dict) → dict[source]

Returns a AFW that reads the union of the languages read by input AFWs.

Let \(A_1 = (Σ, S_1 , s^0_1, ρ_1 , F_1 )\) and \(A_2 = (Σ, S_2 , s^0_2, ρ_2 , F_2 )\) be alternating automata accepting the languages \(L( A_1)\) and \(L(A_2)\). Then, \(B_∪ = (Σ, S_1 ∪ S_2 ∪ {root}, ρ_∪ , root , F_1 ∪ F_2 )\) with \(ρ_∪ = ρ_1 ∪ ρ_2 ∪ [(root, a): ρ(s^0_1 , a) ∨ ρ(s^0_2 , a)]\) accepts \(L(A_1) ∪ L(A_2)\).

Pay attention to avoid having the AFWs with state names in common, in case use PySimpleAutomata.AFW.rename_afw_states function.

Parameters:
  • afw_1 (dict) – first input AFW;
  • afw_2 (dict) – second input AFW;.
Returns:

(dict) representing the united AFW.

PySimpleAutomata.AFW.afw_word_acceptance(afw: dict, word: list) → bool[source]

Checks if a word is accepted by input AFW, returning True/False.

The word w is accepted by a AFW if exists at least an accepting run on w. A run for AFWs is a tree and an alternating automaton can have multiple runs on a given input. A run is accepting if all the leaf nodes are accepting states.

Parameters:
  • afw (dict) – input AFW;
  • word (list) – list of symbols ∈ afw[‘alphabet’].
Returns:

(bool), True if the word is accepted, False otherwise.

PySimpleAutomata.AFW.formula_dual(input_formula: str) → str[source]

Returns the dual of the input formula.

The dual operation on formulas in \(B^+(X)\) is defined as: the dual \(\overline{θ}\) of a formula \(θ\) is obtained from θ by switching \(∧\) and \(∨\), and by switching \(true\) and \(false\).

Parameters:input_formula (str) – original string.
Returns:(str), dual of input formula.
PySimpleAutomata.AFW.nfa_to_afw_conversion(nfa: dict) → dict[source]

Returns a AFW reading the same language of input NFA.

Let \(A = (Σ,S,S^0, ρ,F)\) be an nfa. Then we define the afw AA such that \(L(AA) = L(A)\) as follows \(AA = (Σ, S ∪ {s_0}, s_0 , ρ_A , F )\) where \(s_0\) is a new state and \(ρ_A\) is defined as follows:

  • \(ρ_A(s, a)= ⋁_{(s,a,s')∈ρ}s'\), for all \(a ∈ Σ\) and \(s ∈ S\)
  • \(ρ_A(s^0, a)= ⋁_{s∈S^0,(s,a,s')∈ρ}s'\), for all \(a ∈ Σ\)

We take an empty disjunction in the definition of AA to be equivalent to false. Essentially, the transitions of A are viewed as disjunctions in AA . A special treatment is needed for the initial state, since we allow a set of initial states in nondeterministic automata, but only a single initial state in alternating automata.

Parameters:nfa (dict) – input NFA.
Returns:(dict) representing a AFW.
PySimpleAutomata.AFW.rename_afw_states(afw: dict, suffix: str)[source]

Side effect on input! Renames all the states of the AFW adding a suffix.

It is an utility function used during testing to avoid automata to have states with names in common.

Avoid suffix that can lead to special name like “as”, “and”,…

Parameters:
  • afw (dict) – input AFW.
  • suffix (str) – string to be added at beginning of each state name.