Nondeterministic Finite Transducers

[!WARNING] Mata provides an experimental (unstable) support for (non-)deterministic finite transducers (NFTs), defined in include/mata/nft/. The provided interface may change.

Types

All typedefs and enums used by algorithms operating on NFTs.

namespace mata

Main namespace including structs and algorithms for all automata.

In particular, this includes:

  1. Alphabets,

  2. Formula graphs and nodes,

  3. Mintermization,

  4. Closed sets.

namespace nft

Nondeterministic Finite Transducers including structures, transitions and algorithms.

In particular, this includes:

  1. Structures (Automaton, Transitions, Results, Delta),

  2. Algorithms (operations, checks, tests),

  3. Constructions.

Other algorithms are included in mata::nft::Plumbing (simplified API for, e.g., binding) and mata::nft::algorithms (concrete implementations of algorithms, such as for complement).

Typedefs

using Level = unsigned
using State = mata::nfa::State
using StateSet = mata::nfa::StateSet
using Run = mata::nfa::Run
using EpsilonClosureOpt = mata::nfa::EpsilonClosureOpt
using StateRenaming = mata::nfa::StateRenaming
using ParameterMap = mata::nfa::ParameterMap

Map of additional parameter name and value pairs.

Used by certain functions for specifying some additional parameters in the following format:

ParameterMap {
    { "algorithm", "classical" },
    { "minimize", "true" }
}

using Limits = mata::nfa::Limits
using ProductFinalStateCondition = mata::nfa::ProductFinalStateCondition

Enums

enum class JumpMode

A non-deterministic finite transducer.

Values:

enumerator RepeatSymbol

Repeat the symbol on the jump.

enumerator AppendDontCares

Append a sequence of DONT_CAREs to the symbol on the jump.

Variables

const std::string TYPE_NFT
Symbol EPSILON = mata::nfa::EPSILON

An epsilon symbol which is now defined as the maximal value of data type used for symbols.

Symbol DONT_CARE = EPSILON - 1
Level DEFAULT_LEVEL = {0}
Level DEFAULT_NUM_OF_LEVELS = {2}

NFT

NFT class and its methods.

namespace mata

Main namespace including structs and algorithms for all automata.

In particular, this includes:

  1. Alphabets,

  2. Formula graphs and nodes,

  3. Mintermization,

  4. Closed sets.

namespace nft

Nondeterministic Finite Transducers including structures, transitions and algorithms.

In particular, this includes:

  1. Structures (Automaton, Transitions, Results, Delta),

  2. Algorithms (operations, checks, tests),

  3. Constructions.

Other algorithms are included in mata::nft::Plumbing (simplified API for, e.g., binding) and mata::nft::algorithms (concrete implementations of algorithms, such as for complement).

Typedefs

template<typename ...Ts>
using conjunction = std::is_same<bool_pack<true, Ts::value...>, bool_pack<Ts::value..., true>>

Check that for all values in a pack Ts are ‘true’.

template<typename T, typename ...Ts>
using AreAllOfType = typename conjunction<std::is_same<Ts, T>...>::type

Check that all types in a sequence of parameters Ts are of type T.

Functions

Nft union_nondet(const Nft &lhs, const Nft &rhs)

Compute non-deterministic union.

Does not add epsilon transitions, just unites initial and final states.

Returns:

Non-deterministic union of lhs and rhs.

Nft union_det_complete(const Nft &lhs, const Nft &rhs) = delete
Nft product(const Nft &lhs, const Nft &rhs, ProductFinalStateCondition final_condition, Symbol first_epsilon, std::unordered_map<std::pair<State, State>, State> *prod_map) = delete
Nft intersection(const Nft &lhs, const Nft &rhs, std::unordered_map<std::pair<State, State>, State> *prod_map = nullptr, JumpMode jump_mode = JumpMode::RepeatSymbol, State lhs_first_aux_state = Limits::max_state, State rhs_first_aux_state = Limits::max_state)

Compute intersection of two NFTs.

Both automata can contain ε-transitions. Epsilons will be handled as alphabet symbols.

Automata must share alphabets. //TODO: this is not implemented yet. Transducers must have equal values of num_of_levels.

Parameters:
  • lhs[in] First NFT to compute intersection for.

  • rhs[in] Second NFT to compute intersection for.

  • prod_map[out] Mapping of pairs of the original states (lhs_state, rhs_state) to new product states (not used internally, allocated only when !=nullptr, expensive).

  • jump_mode[in] Specifies if the symbol on a jump transition (a transition with a length greater than 1) is interpreted as a sequence repeating the same symbol or as a single instance of the symbol followed by a sequence of DONT_CARE.

  • lhs_first_aux_state[in] The first auxiliary state in lhs. Two auxiliary states does not form a product state.

  • rhs_first_aux_state[in] The first auxiliary state in rhs. Two auxiliary states does not form a product state.

Returns:

NFT as a product of NFTs lhs and rhs.

Nft compose(const Nft &lhs, const Nft &rhs, const utils::OrdVector<Level> &lhs_sync_levels, const utils::OrdVector<Level> &rhs_sync_levels, bool project_out_sync_levels = true, JumpMode jump_mode = JumpMode::RepeatSymbol)

Composes two NFTs (lhs || rhs; read as “rhs after lhs”).

This function computes the composition of two NFTs, lhs and rhs, by aligning their synchronization levels. Transitions between two synchronization levels are ordered as follows: first the transitions of lhs, then the transitions of rhs followed by next synchronization level (if exists). By default, synchronization levels are projected out from the resulting NFT.

Vectors of synchronization levels have to be non-empty and of the the same size.

Parameters:
  • lhs[in] First transducer to compose.

  • rhs[in] Second transducer to compose.

  • lhs_sync_levels[in] Ordered vector of synchronization levels of the lhs.

  • rhs_sync_levels[in] Ordered vector of synchronization levels of the rhs.

  • project_out_sync_levels[in] Whether we want to project out the synchronization levels.

  • jump_mode[in] Specifies if the symbol on a jump transition (a transition with a length greater than 1) is interpreted as a sequence repeating the same symbol or as a single instance of the symbol followed by a sequence of DONT_CARE.

Returns:

A new NFT after the composition.

Nft compose(const Nft &lhs, const Nft &rhs, Level lhs_sync_level = 1, Level rhs_sync_level = 0, bool project_out_sync_levels = true, JumpMode jump_mode = JumpMode::RepeatSymbol)

Composes two NFTs (lhs || rhs; read as “rhs after lhs”).

This function computes the composition of two NFTs, lhs and rhs, by aligning their synchronization levels. Transitions between two synchronization levels are ordered as follows: first the transitions of lhs, then the transitions of rhs followed by next synchronization level (if exists). By default, synchronization levels are projected out from the resulting NFT.

Parameters:
  • lhs[in] First transducer to compose.

  • rhs[in] Second transducer to compose.

  • lhs_sync_level[in] The synchronization level of the lhs.

  • rhs_sync_level[in] The synchronization level of the rhs.

  • project_out_sync_levels[in] Whether we wont to project out the synchronization levels.

  • jump_mode[in] Specifies if the symbol on a jump transition (a transition with a length greater than 1) is interpreted as a sequence repeating the same symbol or as a single instance of the symbol followed by a sequence of DONT_CARE.

Returns:

A new NFT after the composition.

Nft concatenate(const Nft &lhs, const Nft &rhs, bool use_epsilon = false, StateRenaming *lhs_state_renaming = nullptr, StateRenaming *rhs_state_renaming = nullptr)

Concatenate two NFTs.

Supports epsilon symbols when use_epsilon is set to true.

Parameters:
  • lhs[in] First automaton to concatenate.

  • rhs[in] Second automaton to concatenate.

  • use_epsilon[in] Whether to concatenate over epsilon symbol.

  • lhs_state_renaming[out] Map mapping lhs states to result states.

  • rhs_state_renaming[out] Map mapping rhs states to result states.

Returns:

Concatenated automaton.

Nft complement(const Nft &aut, const Alphabet &alphabet, const ParameterMap &params = {{"algorithm", "classical"}, {"minimize", "false"}})

Compute automaton accepting complement of aut.

Parameters:
  • aut[in] Automaton whose complement to compute.

  • alphabet[in] Alphabet used for complementation.

  • params[in] Optional parameters to control the complementation algorithm:

    • ”algorithm”: “classical” (classical algorithm determinizes the automaton, makes it complete and swaps final and non-final states);

    • ”minimize”: “true”/”false” (whether to compute minimal deterministic automaton for classical algorithm);

Returns:

Complemented automaton.

Nft complement(const Nft &aut, const utils::OrdVector<Symbol> &symbols, const ParameterMap &params = {{"algorithm", "classical"}, {"minimize", "false"}})

Compute automaton accepting complement of aut.

This overloaded version complements over an already created ordered set of symbols instead of an alphabet. This is a more efficient solution in case you already have symbols precomputed or want to complement multiple automata over the same set of symbols: the function does not need to compute the ordered set of symbols from the alphabet again (and for each automaton).

Parameters:
  • aut[in] Automaton whose complement to compute.

  • symbols[in] Symbols to complement over.

  • params[in] Optional parameters to control the complementation algorithm:

    • ”algorithm”: “classical” (classical algorithm determinizes the automaton, makes it complete and swaps final and non-final states);

    • ”minimize”: “true”/”false” (whether to compute minimal deterministic automaton for classical algorithm);

Returns:

Complemented automaton.

Nft minimize(const Nft &aut, const ParameterMap &params = {{"algorithm", "brzozowski"}})

Compute minimal deterministic automaton.

Parameters:
  • aut[in] Automaton whose minimal version to compute.

  • params[in] Optional parameters to control the minimization algorithm:

    • ”algorithm”: “brzozowski”

Returns:

Minimal deterministic automaton.

Nft determinize(const Nft &aut, std::unordered_map<StateSet, State> *subset_map = nullptr)

Determinize automaton.

Parameters:
  • aut[in] Automaton to determinize.

  • subset_map[out] Map that maps sets of states of input automaton to states of determinized automaton.

Returns:

Determinized automaton.

Nft reduce(const Nft &aut, StateRenaming *state_renaming = nullptr, const ParameterMap &params = {{"algorithm", "simulation"}})

Reduce the size of the automaton.

Parameters:
  • aut[in] Automaton to reduce.

  • state_renaming[out] Mapping of original states to reduced states.

  • params[in] Optional parameters to control the reduction algorithm:

    • ”algorithm”: “simulation”.

Returns:

Reduced automaton.

bool is_included(const Nft &smaller, const Nft &bigger, Run *cex, const Alphabet *alphabet = nullptr, JumpMode jump_mode = JumpMode::RepeatSymbol, const ParameterMap &params = {{"algorithm", "antichains"}})

Checks inclusion of languages of two NFTs: smaller and bigger (smaller <= bigger).

Parameters:
  • smaller[in] First automaton to concatenate.

  • bigger[in] Second automaton to concatenate.

  • cex[out] Counterexample for the inclusion.

  • alphabet[in] Alphabet of both NFTs to compute with.

  • jump_mode[in] Specifies if the symbol on a jump transition (a transition with a length greater than 1) is interpreted as a sequence repeating the same symbol or as a single instance of the symbol followed by a sequence of DONT_CARE symbols.

  • params[in] Optional parameters to control the equivalence check algorithm:

    • ”algorithm”: “naive”, “antichains” (Default: “antichains”)

Returns:

True if smaller is included in bigger, false otherwise.

inline bool is_included(const Nft &smaller, const Nft &bigger, const Alphabet *const alphabet = nullptr, JumpMode jump_mode = JumpMode::RepeatSymbol, const ParameterMap &params = {{"algorithm", "antichains"}})

Checks inclusion of languages of two NFTs: smaller and bigger (smaller <= bigger).

Parameters:
  • smaller[in] First automaton to concatenate.

  • bigger[in] Second automaton to concatenate.

  • alphabet[in] Alphabet of both NFTs to compute with.

  • jump_mode[in] Specifies if the symbol on a jump transition (a transition with a length greater than 1) is interpreted as a sequence repeating the same symbol or as a single instance of the symbol followed by a sequence of DONT_CARE symbols.

  • params[in] Optional parameters to control the equivalence check algorithm:

    • ”algorithm”: “naive”, “antichains” (Default: “antichains”)

Returns:

True if smaller is included in bigger, false otherwise.

bool are_equivalent(const Nft &lhs, const Nft &rhs, const Alphabet *alphabet, JumpMode jump_mode = JumpMode::RepeatSymbol, const ParameterMap &params = {{"algorithm", "antichains"}})

Perform equivalence check of two NFTs: lhs and rhs.

Parameters:
  • lhs[in] First automaton to concatenate.

  • rhs[in] Second automaton to concatenate.

  • alphabet[in] Alphabet of both NFTs to compute with.

  • jump_mode[in] Specifies if the symbol on a jump transition (a transition with a length greater than 1) is interpreted as a sequence repeating the same symbol or as a single instance of the symbol followed by a sequence of DONT_CARE symbols.

  • params[[in] Optional parameters to control the equivalence check algorithm:

    • ”algorithm”: “naive”, “antichains” (Default: “antichains”)

Returns:

True if lhs and rhs are equivalent, false otherwise.

bool are_equivalent(const Nft &lhs, const Nft &rhs, JumpMode JumpMode = JumpMode::RepeatSymbol, const ParameterMap &params = {{"algorithm", "antichains"}})

Perform equivalence check of two NFTs: lhs and rhs.

The current implementation of Nft does not accept input alphabet. For this reason, an alphabet has to be created from all transitions each time an operation on alphabet is called. When calling this function, the alphabet has to be computed first.

Hence, this function is less efficient than its alternative taking already defined alphabet as its parameter. That way, alphabet has to be computed only once, as opposed to the current ad-hoc construction of the alphabet. The use of the alternative with defined alphabet should be preferred.

Parameters:
  • lhs[in] First automaton to concatenate.

  • rhs[in] Second automaton to concatenate.

  • jump_mode[in] Specifies if the symbol on a jump transition (a transition with a length greater than 1) is interpreted as a sequence repeating the same symbol or as a single instance of the symbol followed by a sequence of DONT_CARE symbols.

  • params[in] Optional parameters to control the equivalence check algorithm:

    • ”algorithm”: “naive”, “antichains” (Default: “antichains”)

Returns:

True if lhs and rhs are equivalent, false otherwise.

Nft revert(const Nft &aut)
Nft fragile_revert(const Nft &aut)
Nft simple_revert(const Nft &aut)
Nft somewhat_simple_revert(const Nft &aut)
Nft invert_levels(const Nft &aut, JumpMode jump_mode = JumpMode::RepeatSymbol)

Inverts the levels of the given transducer aut.

The function inverts the levels of the transducer, i.e., the level 0 becomes the last level, level 1 becomes the second last level, and so on.

Parameters:
  • aut[in] The transducer for inverting levels.

  • jump_mode[in] Specifies if the symbol on a jump transition (a transition with a length greater than 1) is interpreted as a sequence repeating the same symbol or as a single instance of the symbol followed by a sequence of DONT_CARE symbols.

Returns:

A new transducer with inverted levels.

Nft remove_epsilon(const Nft &aut, Symbol epsilon = EPSILON)

Remove simple epsilon transitions.

Simple epsilon transitions are the transitions of the form q0 -epsilon-> q1 -epsilon-> q2 -epsilon-> … -epsilon-> qn where q0 and qn are level 0 states, the states in-between are states with level 1, 2, …, num_of_levels and for each qi, for 0 < i < n, there is only 1 transition going to qi (the transition qi-1 -epsilon-> qi) and only 1 transition going from qi (the transition qi -epsilon -> qi+1). This means that if there was some state p0 going with epsilon to q1, these to epsilon transitions would not be removed.

Furthermore, this assumes that the NFT aut does not have jump transitions.

The resulting automaton has the same number of states as aut, just the transitions can change. It is recommended to run trim() after this function.

Parameters:
  • aut – NFT without jump transitions

  • epsilon – symbol representing epsilon

Returns:

NFT whose language is same as aut but does not contain simple epsilon transitions

Nft project_out(const Nft &nft, const utils::OrdVector<Level> &levels_to_project, JumpMode jump_mode = JumpMode::RepeatSymbol)

Projects out specified levels levels_to_project in the given transducer nft.

Parameters:
  • nft[in] The transducer for projection.

  • levels_to_project[in] A non-empty ordered vector of levels to be projected out from the transducer. It must contain only values that are greater than or equal to 0 and smaller than num_of_levels.

  • jump_mode[in] Specifies if the symbol on a jump transition (a transition with a length greater than 1) is interpreted as a sequence repeating the same symbol or as a single instance of the symbol followed by a sequence of DONT_CARE symbols.

Returns:

A new projected transducer.

Nft project_out(const Nft &nft, Level level_to_project, JumpMode jump_mode = JumpMode::RepeatSymbol)

Projects out specified level level_to_project in the given transducer nft.

Parameters:
  • nft[in] The transducer for projection.

  • level_to_project[in] A level that is going to be projected out from the transducer. It has to be greater than or equal to 0 and smaller than num_of_levels.

  • jump_mode[in] Specifies if the symbol on a jump transition (a transition with a length greater than 1) is interpreted as a sequence repeating the same symbol or as a single instance of the symbol followed by a sequence of DONT_CARE symbols.

Returns:

A new projected transducer.

Nft project_to(const Nft &nft, const utils::OrdVector<Level> &levels_to_project, JumpMode jump_mode = JumpMode::RepeatSymbol)

Projects to specified levels levels_to_project in the given transducer nft.

Parameters:
  • nft[in] The transducer for projection.

  • levels_to_project[in] A non-empty ordered vector of levels the transducer is going to be projected to. It must contain only values greater than or equal to 0 and smaller than num_of_levels.

  • jump_mode[in] Specifies if the symbol on a jump transition (a transition with a length greater than 1) is interpreted as a sequence repeating the same symbol or as a single instance of the symbol followed by a sequence of DONT_CARE symbols.

Returns:

A new projected transducer.

Nft project_to(const Nft &nft, Level level_to_project, JumpMode jump_mode = JumpMode::RepeatSymbol)

Projects to a specified level level_to_project in the given transducer nft.

Parameters:
  • nft[in] The transducer for projection.

  • level_to_project[in] A level the transducer is going to be projected to. It has to be greater than or equal to 0 and smaller than num_of_levels.

  • jump_mode[in] Specifies if the symbol on a jump transition (a transition with a length greater than 1) is interpreted as a sequence repeating the same symbol or as a single instance of the symbol followed by a sequence of DONT_CARE symbols.

Returns:

A new projected transducer.

Nft insert_levels(const Nft &nft, const BoolVector &new_levels_mask, JumpMode jump_mode = JumpMode::RepeatSymbol)

Inserts new levels, as specified by the mask new_levels_mask, into the given transducer nft.

num_of_levels must be greater than 0. The vector new_levels_mask must be nonempty, its length must be greater than num_of_levels, and it must contain exactly num_of_levels occurrences of false.

Parameters:
  • nft[in] The original transducer.

  • new_levels_mask[in] A mask representing the old and new levels. The vector {1, 0, 1, 1, 0} indicates that one level is inserted before level 0 and two levels are inserted before level 1.

  • jump_mode[in] Specifies whether the symbol on a jump transition (a transition with a length greater than 1) is interpreted as a sequence repeating the same symbol or as a single instance of the symbol followed by a sequence of DONT_CARE symbols.

Nft insert_level(const Nft &nft, Level new_level, JumpMode jump_mode = JumpMode::RepeatSymbol)

Inserts a new level new_level into the given transducer nft.

num_of_levels must be greater than 0.

Parameters:
  • nft[in] The original transducer.

  • new_level[in] Specifies the new level to be inserted into the transducer. If new_level is 0, then it is inserted before the 0-th level. If new_level is less than num_of_levels, then it is inserted before the level new_level-1. If new_level is greater than or equal to num_of_levels, then all levels from num_of_levels through new_level are appended after the last level.

  • jump_mode[in] Specifies whether the symbol on a jump transition (a transition with a length greater than 1) is interpreted as a sequence repeating the same symbol or as a single instance of the symbol followed by a sequence of DONT_CARE symbols.

Run encode_word(const Alphabet *alphabet, const std::vector<std::string> &input)

Encodes a vector of strings (each corresponding to one symbol) into a Word instance.

template<bool...>
struct bool_pack
#include <nft.hh>

Pack of bools for reasoning about a sequence of parameters.

class Levels : public std::vector<Level>
#include <nft.hh>

Public Functions

Levels &set(State state, Level level = DEFAULT_LEVEL)
inline Levels(const std::vector<Level> &levels)
inline Levels(std::vector<Level> &&levels)
inline Levels &operator=(const std::vector<Level> &levels)
inline Levels &operator=(std::vector<Level> &&levels)
inline void append(const Levels &levels_vector)

Append levels_vector to the end of this.

Parameters:

levels_vector[in] Vector of levels to be appended.

inline size_t count(Level level) const

Count the number of occurrences of a level in this.

Parameters:

level[in] Level to be counted.

Private Types

using super = std::vector<Level>
class Nft : public Nfa
#include <nft.hh>

A class representing an NFT.

Public Functions

inline explicit Nft(Delta delta = {}, utils::SparseSet<State> initial_states = {}, utils::SparseSet<State> final_states = {}, Levels levels = {}, const size_t num_of_levels = DEFAULT_NUM_OF_LEVELS, Alphabet *alphabet = nullptr)

Key value store for additional attributes for the NFT. Keys are attribute names as strings and the value types are up to the user. For example, we can set up attributes such as “state_dict” for state dictionary attribute mapping states to their respective names, or “transition_dict” for transition dictionary adding a human-readable meaning to each transition.

inline explicit Nft(const size_t num_of_states, utils::SparseSet<State> initial_states = {}, utils::SparseSet<State> final_states = {}, Levels levels = {}, const size_t num_of_levels = DEFAULT_NUM_OF_LEVELS, Alphabet *alphabet = nullptr)

Construct a new explicit NFT with num_of_states states and optionally set initial and final states.

Parameters:

num_of_states[in] Number of states for which to preallocate Delta.

Nft(const Nft &other) = default

Construct a new explicit NFT from other NFT.

inline Nft(Nft &&other) noexcept
Nft &operator=(const Nft &other) = default
Nft &operator=(Nft &&other) noexcept
inline explicit Nft(const mata::nfa::Nfa &other, const size_t num_of_levels = 1, const Level default_level = DEFAULT_LEVEL)

Construct a new NFT with num_of_levels levels from NFA.

All states levels are set to the default_level. The transition function remains the same as in the NFA.

Note: Constructor functions with more options are available in mata::nft::builder.

Parameters:
  • other – NFA to be converted to NFT.

  • num_of_levels – Number of levels for the NFT. (default: 1)

  • default_level – Default level for the states. (default: 0)

inline explicit Nft(mata::nfa::Nfa &&other, const size_t num_of_levels = 1, const Level default_level = DEFAULT_LEVEL)

Construct a new NFT with num_of_levels levels from NFA.

All states levels are set to the default_level. The transition function remains the same as in the NFA.

Note: Constructor functions with more options are available in mata::nft::builder.

Parameters:
  • other – NFA to be converted to NFT.

  • num_of_levels – Number of levels for the NFT. (default: 1)

  • default_level – Default level for the states. (default: 0)

Nft &operator=(const mata::nfa::Nfa &other) noexcept
Nft &operator=(mata::nfa::Nfa &&other) noexcept
State add_state()

Add a new (fresh) state to the automaton.

Returns:

The newly created state.

State add_state(State state)

Add state state to this if state is not in this yet.

Returns:

The requested state.

State add_state_with_level(Level level)

Add a new (fresh) state to the automaton with level level.

Returns:

The newly created state.

State add_state_with_level(State state, Level level)

Add state state to this with level level if state is not in this yet.

Returns:

The requested state.

size_t num_of_states_with_level(Level level) const

Get the number of states with level level.

Returns:

The number of states with level level.

State insert_word(State source, const Word &word, State target)

Inserts a word into the NFT from a source state source to a target state target.

Creates new states along the path of the word.

If the length of word is less than num_of_levels, then the last symbol of word will form a transition going directly from the last inner state to target.

Parameters:
  • source – The source state where the word begins. source must already exist.

  • word – The nonempty word to be inserted into the NFA.

  • target – The target state where the word ends. target must already exist.

Returns:

The state target where the inserted word ends.

State insert_word(State source, const Word &word)

Inserts a word into the NFT from a source state source to a newly created target state, creating new states along the path of the word.

If the length of word is less than num_of_levels, then the last symbol of word will form a transition going directly from the last inner state to the newly created target.

Parameters:
  • source – The source state where the word begins. source must already exist.

  • word – The nonempty word to be inserted into the NFA.

Returns:

The newly created target where the inserted word ends.

State add_transition(State source, const std::vector<Symbol> &symbols, State target)

Add a single NFT transition.

The transition leads from a source state source to a target state target, creating new inner states for all tapes.

If the length of symbols is less than num_of_levels, then the last symbol of symbols will form a jump transition going directly from the last inner state to target.

Parameters:
  • source – The source state where the NFT transition begins. source must already exist.

  • symbols – The nonempty set of symbols, one for each tape to be inserted into the NFT.

  • target – The target state where the NFT transition ends. target must already exist.

Returns:

The target state target.

State add_transition(State source, const std::vector<Symbol> &symbols)

Add a single NFT transition to the NFT from a source state source to a newly created target state, creating new inner states for all tapes.

If the length of symbols is less than num_of_levels, the last symbol of symbols will form a transition going directly from the last inner state to the newly created target.

Parameters:
  • source – The source state where the transition begins. source must already exist.

  • symbols – The nonempty set of symbols, one for each tape to be inserted into the NFT.

Returns:

The target state target.

State insert_word_by_parts(State source, const std::vector<Word> &word_parts_on_levels, State target)

Inserts a word, which is created by interleaving parts from word_parts_on_levels, into the NFT from a source state source to a target state target, creating new states along the path of word.

The length of the inserted word equals num_of_levels * the maximum word length in the vector word_parts_on_levels. At least one Word in word_parts_on_levels must be nonempty. The vector word_parts_on_levels must have a size equal to num_of_levels. Words shorter than the maximum word length are interpreted as words followed by a sequence of epsilons to match the maximum length.

Parameters:
  • source – The source state where the word begins. source must already exist and be of a level 0.

  • word_parts_on_levels – The vector of word parts, with each part corresponding to a different level.

  • target – The target state where the word ends. target must already exist and be of a level 0.

Returns:

The state target where the inserted word_parts_on_levels ends.

State insert_word_by_parts(State source, const std::vector<Word> &word_parts_on_levels)

Inserts a word, which is created by interleaving parts from word_parts_on_levels, into the NFT from a source state source to a target state target, creating new states along the path of word.

The length of the inserted word equals num_of_levels * the maximum word length in the vector word_parts_on_levels. At least one Word in word_parts_on_levels must be nonempty. The vector word_parts_on_levels must have a size equal to num_of_levels. Words shorter than the maximum word length are interpreted as words followed by a sequence of epsilons to match the maximum length.

Parameters:
  • source – The source state where the word begins. source must already exist be of a level 0.

  • word_parts_on_levels – The vector of word parts, with each part corresponding to a different level.

Returns:

The newly created target where the inserted word_parts_on_levels ends.

Nft &insert_identity(State state, const std::vector<Symbol> &symbols, JumpMode jump_mode = JumpMode::RepeatSymbol)

Inserts identity transitions into the NFT.

Parameters:
  • state – The state where the identity transition will be inserted. state server as both the source and target state.

  • symbols – The vector of symbols used for the identity transition. Identity will be created for each symbol in the vector.

  • jump_mode – Specifies if the symbol on a jump transition (a transition with a length greater than 1) is interpreted as a sequence repeating the same symbol or as a single instance of the symbol followed by a sequence of DONT_CARE symbols.

Returns:

Self with inserted identity.

Nft &insert_identity(State state, const Alphabet *alphabet, JumpMode jump_mode = JumpMode::RepeatSymbol)

Inserts identity transitions into the NFT.

Parameters:
  • state – The state where the identity transition will be inserted. state server as both the source and target state.

  • alpahbet – The alphabet with symbols used for the identity transition. Identity will be created for each symbol in the alphabet.

  • jump_mode – Specifies if the symbol on a jump transition (a transition with a length greater than 1) is interpreted as a sequence repeating the same symbol or as a single instance of the symbol followed by a sequence of DONT_CARE symbols.

Returns:

Self with inserted identity.

Nft &insert_identity(State state, Symbol symbol, JumpMode jump_mode = JumpMode::RepeatSymbol)

Inserts an identity transition into the NFT.

Parameters:
  • state – The state where the identity transition will be inserted. state server as both the source and target state.

  • symbol – The symbol used for the identity transition.

  • jump_mode – Specifies if the symbol on a jump transition (a transition with a length greater than 1) is interpreted as a sequence repeating the same symbol or as a single instance of the symbol followed by a sequence of DONT_CARE symbols.

Returns:

Self with inserted identity.

bool contains_jump_transitions()

Checks if the transducer contains any jump transition.

void clear()

Clear the underlying NFT to a blank NFT.

The whole NFT is cleared, each member is set to its zero value.

bool is_identical(const Nft &aut) const

Check if this is exactly identical to aut.

This is exact equality of automata, including state numbering (so even stronger than isomorphism), essentially only useful for testing purposes.

Returns:

True if automata are exactly identical, false otherwise.

Nft &trim(StateRenaming *state_renaming = nullptr)

Remove inaccessible (unreachable) and not co-accessible (non-terminating) states in-place.

Remove states which are not accessible (unreachable; state is accessible when the state is the endpoint of a path starting from an initial state) or not co-accessible (non-terminating; state is co-accessible when the state is the starting point of a path ending in a final state).

Parameters:

state_renaming[out] Mapping of trimmed states to new states.

Returns:

this after trimming.

void remove_epsilon(Symbol epsilon = EPSILON)

Remove simple epsilon transitions from the automaton.

Nft &concatenate(const Nft &aut)

In-place concatenation.

Nft &unite_nondet_with(const Nft &aut)

In-place union.

Nft get_one_letter_aut(const std::set<Level> &levels_to_keep = {}, Symbol abstract_symbol = 'x') const

Unify transitions to create a directed graph with at most a single transition between two states.

Get NFT where transitions of this are replaced with transitions over one symbol abstract_symbol

The transitions over EPSILON are not replaced, neither are the transitions coming from a state with a level from levels_to_keep.

Parameters:
  • abstract_symbol[in] Abstract symbol to use for transitions in digraph.

  • levels_to_keep[in] Transitions coming from states with any of these levels are not replaced.

  • abstract_symbol[in] The symbol to replace with.

Returns:

An automaton representing a directed graph.

Returns:

Nft

void get_one_letter_aut(Nft &result) const

Unify transitions to create a directed graph with at most a single transition between two states.

Parameters:

result[out] An automaton representing a directed graph.

void unwind_jumps_inplace(const utils::OrdVector<Symbol> &dont_care_symbol_replacements = {DONT_CARE}, JumpMode jump_mode = JumpMode::RepeatSymbol)

Unwinds jump transitions in the transducer.

Parameters:
  • dont_care_symbol_replacements[in] Vector of symbols to replace DONT_CARE symbols with.

  • jump_mode[in] Specifies if the symbol on a jump transition (a transition with a length greater than 1) is interpreted as a sequence repeating the same symbol or as a single instance of the symbol followed by a sequence of DONT_CARE symbols.

Nft unwind_jumps(const utils::OrdVector<Symbol> &dont_care_symbol_replacements = {DONT_CARE}, JumpMode jump_mode = JumpMode::RepeatSymbol) const

Creates a transducer with unwinded jump transitions from the current one.

Parameters:
  • dont_care_symbol_replacements[in] Vector of symbols to replace DONT_CARE symbols with.

  • jump_mode[in] Specifies if the symbol on a jump transition (a transition with a length greater than 1) is interpreted as a sequence repeating the same symbol or as a single instance of the symbol followed by a sequence of DONT_CARE symbols.

void unwind_jumps(Nft &result, const utils::OrdVector<Symbol> &dont_care_symbol_replacements = {DONT_CARE}, JumpMode jump_mode = JumpMode::RepeatSymbol) const

Unwinds jump transitions in the given transducer.

Parameters:
  • result[out] A transducer with only one level.

  • dont_care_symbol_replacements[in] Vector of symbols to replace DONT_CARE symbols with.

  • jump_mode[in] Specifies if the symbol on a jump transition (a transition with a length greater than 1) is interpreted as a sequence repeating the same symbol or as a single instance of the symbol followed by a sequence of DONT_CARE symbols.

std::string print_to_dot(bool decode_ascii_chars = false, bool use_intervals = false, int max_label_length = -1) const

Prints the automaton in DOT format.

Parameters:
  • decode_ascii_chars[in] Whether to use ASCII characters for the output.

  • use_intervals[in] Whether to use intervals (e.g. [1-3] instead of 1,2,3) for labels.

  • max_label_length[in] Maximum label length for the output (-1 means no limit, 0 means no labels). If the label is longer than max_label_length, it will be truncated, with full label displayed on hover.

Returns:

automaton in DOT format

void print_to_dot(std::ostream &output, bool decode_ascii_chars = false, bool use_intervals = false, int max_label_length = -1) const

Prints the automaton to the output stream in DOT format.

Parameters:
  • decode_ascii_chars[in] Whether to use ASCII characters for the output.

  • use_intervals[in] Whether to use intervals (e.g. [1-3] instead of 1,2,3) for labels.

  • max_label_length[in] Maximum label length for the output (-1 means no limit, 0 means no labels). If the label is longer than max_label_length, it will be truncated, with full label displayed on hover.

void print_to_dot(const std::string &filename, bool decode_ascii_chars = false, bool use_intervals = false, int max_label_length = -1) const

Prints the automaton to the file in DOT format.

Parameters:
  • filename – Name of the file to print the automaton to

  • decode_ascii_chars[in] Whether to use ASCII characters for the output.

  • use_intervals[in] Whether to use intervals (e.g. [1-3] instead of 1,2,3) for labels.

  • max_label_length[in] Maximum label length for the output (-1 means no limit, 0 means no labels). If the label is longer than max_label_length, it will be truncated, with full label displayed on hover.

std::string print_to_mata() const

Prints the automaton in mata format.

If you need to parse the automaton again, use IntAlphabet in construct()

Returns:

automaton in mata format TODO handle alphabet of the automaton, currently we print the exact value of the symbols

void print_to_mata(std::ostream &output) const

Prints the automaton to the output stream in mata format.

If you need to parse the automaton again, use IntAlphabet in construct()

TODO handle alphabet of the automaton, currently we print the exact value of the symbols

void print_to_mata(const std::string &filename) const

Prints the automaton to the file in mata format.

If you need to parse the automaton again, use IntAlphabet in construct()

TODO handle alphabet of the automaton, currently we print the exact value of the symbols

Parameters:

filename – Name of the file to print the automaton to

StateSet post(const StateSet &states, const Symbol symbol, EpsilonClosureOpt epsilon_closure_opt = EpsilonClosureOpt::NONE) const

Get the set of states reachable from the given set of states over the given symbol.

TODO: Relict from VATA. What to do with inclusion/ universality/ this post function? Revise all of them.

Parameters:
  • states – Set of states to compute the post set from.

  • symbolSymbol to compute the post set for.

  • epsilon_closure_opt – Epsilon closure option. Perform epsilon closure before and/or after the post operation.

Returns:

Set of states reachable from the given set of states over the given symbol.

inline StateSet post(const State state, const Symbol symbol, EpsilonClosureOpt epsilon_closure_opt) const

Get the set of states reachable from the given state over the given symbol.

Parameters:
  • state – A state to compute the post set from.

  • symbolSymbol to compute the post set for.

  • epsilon_closure_opt – Epsilon closure option. Perform epsilon closure before and/or after the post operation.

Returns:

Set of states reachable from the given state over the given symbol.

inline const StateSet &post(const State state, Symbol symbol) const

Returns a reference to targets (states) reachable from the given state over the given symbol.

This is an optimized shortcut for post(state, symbol, EpsilonClosureOpt::NONE).

Parameters:
  • state – A state to compute the post set from.

  • symbolSymbol to compute the post set for.

Returns:

Set of states reachable from the given state over the given symbol.

bool is_universal(const Alphabet &alphabet, Run *cex = nullptr, const ParameterMap &params = {{"algorithm", "antichains"}}) const

Is the language of the automaton universal?

bool is_universal(const Alphabet &alphabet, const ParameterMap &params) const

Is the language of the automaton universal?

bool is_in_lang(const Run &word, bool use_epsilon = false, bool match_prefix = false) const

Check whether a run over the word (or its prefix) is in the language of an automaton.

Parameters:
  • word – The run to check.

  • use_epsilon – Whether the automaton uses epsilon transitions.

  • match_prefix – Whether to also match the prefix of the word.

Returns:

True if the run (or its prefix) is in the language of the automaton, false otherwise.

inline bool is_in_lang(const Word &word, const bool use_epsilon = false, const bool match_prefix = false)

Check whether a word (or its prefix) is in the language of an automaton.

Parameters:
  • word – The word to check.

  • use_epsilon – Whether the automaton uses epsilon transitions.

  • match_prefix – Whether to also match the prefix of the word.

Returns:

True if the word (or its prefix) is in the language of the automaton, false otherwise.

inline bool is_prefix_in_lang(const Run &word, const bool use_epsilon = false) const

Check whether a prefix of a run is in the language of an automaton.

Parameters:
  • word – The run to check.

  • use_epsilon – Whether the automaton uses epsilon transitions.

Returns:

True if the prefix of the run is in the language of the automaton, false otherwise.

inline bool is_prefix_in_lang(const Word &word, const bool use_epsilon = false) const

Check whether a prefix of a word is in the language of an automaton.

Parameters:
  • word – The word to check.

  • use_epsilon – Whether the automaton uses epsilon transitions.

Returns:

True if the prefix of the word is in the language of the automaton, false otherwise.

bool is_tuple_in_lang(const std::vector<Word> &track_words)

Checks whether track words are in the language of the transducer.

That is, the function checks whether a tuple track_words (word1, word2, word3, …, wordn) is in the regular relation accepted by the transducer with ‘n’ levels (tracks).

std::pair<Run, bool> get_word_for_path(const Run &run) const
std::set<Word> get_words(size_t max_length) const

Get the set of all words in the language of the automaton whose length is <= max_length.

If you have an automaton with finite language (can be checked using is_acyclic), you can get all words by calling get_words(aut.num_of_states())

Nft apply(const nfa::Nfa &nfa, Level level_to_apply_on = 0, bool project_out_applied_level = true, JumpMode jump_mode = JumpMode::RepeatSymbol) const

Apply nfa to this.

Intersects nfa with level level_to_apply_on of this. For 2-level NFT, the default values returns the image of nfa, where you can use to_nfa_copy() or to_nfa_move() to get NFA representation of this language. If you need pre-image of nfa for 2-level NFT, set level_to_apply_on to 1.

Parameters:
  • nfa – NFA to apply.

  • level_to_apply_on – Which level to apply the nfa on.

  • project_out_applied_level – Whether the level_to_apply_on is projected out from final NFT.

  • jump_mode[in] Specifies if the symbol on a jump transition (a transition with a length greater than 1) is interpreted as a sequence repeating the same symbol, or as a single instance of the symbol followed by a sequence of DONT_CARE symbols.

Returns:

Nft apply(const Word &word, Level level_to_apply_on = 0, bool project_out_applied_level = true, JumpMode jump_mode = JumpMode::RepeatSymbol) const

Apply word to this.

Intersects { word } with level level_to_apply_on of this. For 2-level NFT, the default values returns the image of word, where you can use to_nfa_copy() or to_nfa_move() to get NFA representation of this language. If you need pre-image of word for 2-level NFT, set level_to_apply_on to 1.

Parameters:
  • wordWord to apply.

  • level_to_apply_on – Which level to apply the nfa on.

  • project_out_applied_level – Whether the level_to_apply_on is projected out from final NFT.

  • jump_mode[in] Specifies if the symbol on a jump transition (a transition with a length greater than 1) is interpreted as a sequence repeating the same symbol, or as a single instance of the symbol followed by a sequence of DONT_CARE symbols.

Returns:

inline Nfa to_nfa_copy() const

Copy NFT as NFA.

Transitions are not updated to only have one level.

Returns:

A newly created NFA with copied members from NFT.

inline Nfa to_nfa_move()

Move NFT as NFA.

The NFT can no longer be used. Transitions are not updated to only have one level.

Returns:

A newly created NFA with moved members from NFT.

Nfa to_nfa_update_copy(const utils::OrdVector<Symbol> &dont_care_symbol_replacements = {DONT_CARE}, JumpMode jump_mode = JumpMode::RepeatSymbol) const

Copy NFT as NFA updating the transitions to have one level only.

Parameters:
  • dont_care_symbol_replacements[in] Vector of symbols to replace DONT_CARE symbols with.

  • jump_mode[in] Specifies if the symbol on a jump transition (a transition with a length greater than 1) is interpreted as a sequence repeating the same symbol or as a single instance of the symbol followed by a sequence of DONT_CARE symbols.

Returns:

A newly created NFA with copied members from NFT with updated transitions.

Nfa to_nfa_update_move(const utils::OrdVector<Symbol> &dont_care_symbol_replacements = {DONT_CARE}, JumpMode jump_mode = JumpMode::RepeatSymbol)

Move NFT as NFA updating the transitions to have one level only.

The NFT can no longer be used.

Parameters:
  • dont_care_symbol_replacements[in] Vector of symbols to replace DONT_CARE symbols with.

  • jump_mode[in] Specifies if the symbol on a jump transition (a transition with a length greater than 1) is interpreted as a sequence repeating the same symbol or as a single instance of the symbol followed by a sequence of DONT_CARE symbols.

Returns:

A newly created NFA with moved members from NFT with updated transitions.

Public Members

Levels levels = {}

Vector of levels giving each state a level in range from 0 to num_of_levels - 1.

For state q, levels[q] gives the state q a level.

size_t num_of_levels = {DEFAULT_NUM_OF_LEVELS}

Number of levels (tracks) the transducer recognizes.

Each transducer transition will comprise num_of_levels of NFA transitions.

Public Static Functions

static inline Nft with_levels(const size_t num_of_levels, const size_t num_of_states = 0, Levels levels = {}, utils::SparseSet<State> initial_states = {}, utils::SparseSet<State> final_states = {}, Alphabet *alphabet = nullptr)
static inline Nft with_levels(const size_t num_of_levels, Delta delta, Levels levels = {}, utils::SparseSet<State> initial_states = {}, utils::SparseSet<State> final_states = {}, Alphabet *alphabet = nullptr)
namespace std

STL namespace.

Functions

std::ostream &operator<<(std::ostream &os, const mata::nft::Nft &nft)

Delta

The delta function of an NFT, which maps states and input symbols to sets of states.

namespace mata

Main namespace including structs and algorithms for all automata.

In particular, this includes:

  1. Alphabets,

  2. Formula graphs and nodes,

  3. Mintermization,

  4. Closed sets.

namespace nft

Nondeterministic Finite Transducers including structures, transitions and algorithms.

In particular, this includes:

  1. Structures (Automaton, Transitions, Results, Delta),

  2. Algorithms (operations, checks, tests),

  3. Constructions.

Other algorithms are included in mata::nft::Plumbing (simplified API for, e.g., binding) and mata::nft::algorithms (concrete implementations of algorithms, such as for complement).

Typedefs

using Transition = mata::nfa::Transition

A single transition in Delta represented as a triple(source, symbol, target).

using Move = mata::nfa::Move

Move from a StatePost for a single source state, represented as a pair of symbol and target state target.

using SymbolPost = mata::nfa::SymbolPost

Structure represents a post of a single symbol: a set of target states in transitions.

A set of SymbolPost, called StatePost, is describing the automata transitions from a single source state.

using StatePost = mata::nfa::StatePost

A data structure representing possible transitions over different symbols from a source state.

It is an ordered vector containing possible SymbolPost (i.e., pair of symbol and target states). SymbolPosts in the vector are ordered by symbols in SymbolPosts.

using SynchronizedExistentialSymbolPostIterator = mata::nfa::SynchronizedExistentialSymbolPostIterator

Specialization of utils::SynchronizedExistentialIterator for iterating over SymbolPosts.

using Delta = mata::nfa::Delta

Delta is a data structure for representing transition relation.

Transition is represented as a triple Trans(source state, symbol, target state). Move is the part (symbol, target state), specified for a single source state. Its underlying data structure is vector of StatePost classes. Each index to the vector corresponds to one source state, that is, a number for a certain state is an index to the vector of state posts. Transition relation (delta) in Mata stores a set of transitions in a four-level hierarchical structure: Delta, StatePost, SymbolPost, and a set of target states. A vector of ‘StatePost’s indexed by a source states on top, where the StatePost for a state ‘q’ (whose number is ‘q’ and it is the index to the vector of ‘StatePost’s) stores a set of ‘Move’s from the source state ‘q’. Namely, ‘StatePost’ has a vector of ‘SymbolPost’s, where each ‘SymbolPost’ stores a symbol ‘a’ and a vector of target states of ‘a’-moves from state ‘q’. ‘SymbolPost’s are ordered by the symbol, target states are ordered by the state number.

Builder

Function to build predefined types of NFTs, to create them from regular expressions, and to load them from files.

namespace mata

Main namespace including structs and algorithms for all automata.

In particular, this includes:

  1. Alphabets,

  2. Formula graphs and nodes,

  3. Mintermization,

  4. Closed sets.

namespace nft

Nondeterministic Finite Transducers including structures, transitions and algorithms.

In particular, this includes:

  1. Structures (Automaton, Transitions, Results, Delta),

  2. Algorithms (operations, checks, tests),

  3. Constructions.

Other algorithms are included in mata::nft::Plumbing (simplified API for, e.g., binding) and mata::nft::algorithms (concrete implementations of algorithms, such as for complement).

namespace builder

Namespace providing options to build NFAs.

Typedefs

using NameStateMap = std::unordered_map<std::string, State>

Functions

Nft create_single_word_nft(const Word &word)

Create an automaton accepting only a single word.

Nft create_single_word_nft(const WordName &word, Alphabet *alphabet = nullptr)

Create an automaton accepting only a single word.

Parameters:
  • wordWord to accept.

  • alphabetAlphabet to use in NFA for translating word into symbols. If specified, the alphabet has to contain translations for all the word symbols. If left empty, a new alphabet with only the symbols of the word will be created.

Nft create_empty_string_nft(size_t num_of_levels = DEFAULT_NUM_OF_LEVELS)

Create automaton accepting only epsilon string.

Nft create_sigma_star_nft(size_t num_of_levels = DEFAULT_NUM_OF_LEVELS)

Create automaton accepting sigma star over the passed alphabet using DONT_CARE symbol.

Parameters:

num_of_levels[in] Number of levels in the created NFT.

Nft create_sigma_star_nft(const Alphabet *alphabet = new OnTheFlyAlphabet{}, size_t num_of_levels = DEFAULT_NUM_OF_LEVELS)

Create automaton accepting sigma star over the passed alphabet.

Parameters:
  • alphabet[in] Alphabet to construct sigma star automaton with. When alphabet is left empty, the default empty alphabet is used, creating an automaton accepting only the empty string.

  • num_of_levels[in] Number of levels in the created NFT.

Nft construct(const parser::ParsedSection &parsec, Alphabet *alphabet, NameStateMap *state_map = nullptr)

Loads an automaton from Parsed object.

Nft construct(const IntermediateAut &inter_aut, Alphabet *alphabet, NameStateMap *state_map = nullptr)

Loads an automaton from Parsed object.

void construct(Nft *result, const IntermediateAut &inter_aut, Alphabet *alphabet, NameStateMap *state_map = nullptr)

Loads an automaton from Parsed object; version for python binding.

template<class ParsedObject>
Nft construct(const ParsedObject &parsed, Alphabet *alphabet = nullptr, NameStateMap *state_map = nullptr)
Nft parse_from_mata(std::istream &nft_stream)

Parse NFA from the mata format in an input stream.

Parameters:

nft_stream – Input stream containing NFA in mata format.

Throws:

std::runtime_error – Parsing of NFA fails.

Nft parse_from_mata(const std::string &nft_in_mata)

Parse NFA from the mata format in a string.

Parameters:

nft_in_mata – String containing NFA in mata format.

Throws:

std::runtime_error – Parsing of NFA fails.

Nft parse_from_mata(const std::filesystem::path &nft_file)

Parse NFA from the mata format in a file.

Parameters:

nft_file – Path to the file containing NFA in mata format.

Throws:
  • std::runtime_errornft_file does not exist.

  • std::runtime_error – Parsing of NFA fails.

Nft from_nfa_with_levels_zero(const nfa::Nfa &nfa, size_t num_of_levels = DEFAULT_NUM_OF_LEVELS, bool explicit_transitions = true, std::optional<Symbol> next_levels_symbol = {})

Create Nft from nfa with specified num_of_levels.

This function takes transition from nfa as transitions between zero level and the first level of NFT. All transition between the remaining levels are created based on the function parameters: explicit_transitions and next_levels_symbol.

Parameters:
  • nfa – NFA to create NFT from.

  • num_of_levels – Number of levels of NFT.

  • explicit_transitions – If true, the transitions between levels are explicit (i.e., no jump transitions, except for the epsilon transitions over all levels).)

  • next_levels_symbol – If specified, it is used as a symbol on transitions after the first level. If not specified, the symbol of the transition is reused.

Returns:

NFT representing nfa with num_of_levels number of levels.

Nft from_nfa_with_levels_advancing(mata::nfa::Nfa nfa, size_t num_of_levels)

Creates Nft from nfa with specified num_of_levels automatically.

It assumes that nfa is a representation of an nft without jump transitions. It assign to each state the level based on the distance from the initial state. For example, if there are 2 levels, the initial states are level 0, the successor states are level 1, the states after that level 0, etc.

If you only have one level, then it is more efficient to call the constructor that takes Nfa as input.

Throws:

std::runtime_error – if some state should be assigned two different levels or if the final state is not at level 0.

Algorithms

Functions to operate on NFTs, such as inclusion and universality checking, etc.

namespace mata

Main namespace including structs and algorithms for all automata.

In particular, this includes:

  1. Alphabets,

  2. Formula graphs and nodes,

  3. Mintermization,

  4. Closed sets.

namespace nft

Nondeterministic Finite Transducers including structures, transitions and algorithms.

In particular, this includes:

  1. Structures (Automaton, Transitions, Results, Delta),

  2. Algorithms (operations, checks, tests),

  3. Constructions.

Other algorithms are included in mata::nft::Plumbing (simplified API for, e.g., binding) and mata::nft::algorithms (concrete implementations of algorithms, such as for complement).

namespace algorithms

Concrete NFT implementations of algorithms, such as complement, inclusion, or universality checking.

This is a separation of the implementation from the interface defined in mata::nft. Note, that in mata::nft interface, there are particular dispatch functions calling these function according to parameters provided by a user. E.g. we can call the following function: is_universal(aut, alph, {{‘algorithm, ‘antichains’}})` to check for universality based on antichain-based algorithm.

In particular, this includes algorithms for:

  1. Complementation,

  2. Inclusion,

  3. Universality checking,

  4. Intersection/concatenation with epsilon transitions, or,

  5. Computing relation.

Functions

Nft minimize_brzozowski(const Nft &aut)

Brzozowski minimization of automata (revert -> determinize -> revert -> determinize).

Parameters:

aut[in] Automaton to be minimized.

Returns:

Minimized automaton.

Nft complement_classical(const Nft &aut, const mata::utils::OrdVector<Symbol> &symbols, bool minimize_during_determinization = false)

Complement implemented by determization, adding sink state and making automaton complete.

Then it adds final states which were non final in the original automaton.

Parameters:
  • aut[in] Automaton to be complemented.

  • symbols[in] Symbols needed to make the automaton complete.

  • minimize_during_determinization[in] Whether the determinized automaton is computed by (brzozowski) minimization.

Returns:

Complemented automaton.

bool is_included_naive(const Nft &smaller, const Nft &bigger, const Alphabet *alphabet = nullptr, Run *cex = nullptr, JumpMode jump_mode = JumpMode::RepeatSymbol)

Inclusion implemented by complementation of bigger automaton, intersecting it with smaller and then it checks emptiness of intersection.

Parameters:
  • smaller[in] Automaton which language should be included in the bigger one.

  • bigger[in] Automaton which language should include the smaller one.

  • alphabet[in] Alphabet of both automata (it is computed automatically, but it is more efficient to set it if you have it).

  • cex[out] A potential counterexample word which breaks inclusion

Returns:

True if smaller language is included, i.e., if the final intersection of smaller complement of bigger is empty.

bool is_included_antichains(const Nft &smaller, const Nft &bigger, const Alphabet *alphabet = nullptr, Run *cex = nullptr, JumpMode jump_mode = JumpMode::RepeatSymbol)

Inclusion implemented by antichain algorithms.

Parameters:
  • smaller[in] Automaton which language should be included in the bigger one

  • bigger[in] Automaton which language should include the smaller one

  • alphabet[in] Alphabet of both automata (not needed for antichain algorithm)

  • cex[out] A potential counterexample word which breaks inclusion

Returns:

True if smaller language is included, i.e., if the final intersection of smaller complement of bigger is empty.

bool is_universal_naive(const Nft &aut, const Alphabet &alphabet, Run *cex)

Universality check implemented by checking emptiness of complemented automaton.

Parameters:
  • aut[in] Automaton which universality is checked

  • alphabet[in] Alphabet of the automaton

  • cex[out] Counterexample word which eventually breaks the universality

Returns:

True if the complemented automaton has non empty language, i.e., the original one is not universal

bool is_universal_antichains(const Nft &aut, const Alphabet &alphabet, Run *cex)

Universality checking based on subset construction with antichain.

Parameters:
  • aut[in] Automaton which universality is checked

  • alphabet[in] Alphabet of the automaton

  • cex[out] Counterexample word which eventually breaks the universality

Returns:

True if the automaton is universal, otherwise false.

Simlib::Util::BinaryRelation compute_relation(const Nft &aut, const ParameterMap &params = {{"relation", "simulation"}, {"direction", "forward"}})
Nft product(const Nft &lhs, const Nft &rhs, const std::function<bool(State, State)> &&final_condition, std::unordered_map<std::pair<State, State>, State> *prod_map = nullptr, JumpMode jump_mode = JumpMode::RepeatSymbol, const State lhs_first_aux_state = Limits::max_state, const State rhs_first_aux_state = Limits::max_state)

Compute product of two NFTs, final condition is to be specified.

Parameters:
  • lhs[in] First NFT to compute intersection for.

  • rhs[in] Second NFT to compute intersection for.

  • final_condition[in] The predicate that tells whether a pair of states is final (conjunction for intersection).

  • prod_map[out] Can be used to get the mapping of the pairs of the original states to product states. Mostly useless, it is only filled in and returned if !=nullptr, but the algorithm internally uses another data structures, because this one is too slow.

  • jump_mode[in] Specifies if the symbol on a jump transition (a transition with a length greater than 1) is interpreted as a sequence repeating the same symbol or as a single instance of the symbol followed by a sequence of DONT_CARE.

  • lhs_first_aux_state[in] The first auxiliary state in lhs. Two auxiliary states can not form a product state.

  • rhs_first_aux_state[in] The first auxiliary state in rhs. Two auxiliary states con not form a product state.

Returns:

NFT as a product of NFTs lhs and rhs with ε handled as regular symbols.

Nft concatenate_eps(const Nft &lhs, const Nft &rhs, const Symbol &epsilon, bool use_epsilon = false, StateRenaming *lhs_state_renaming = nullptr, StateRenaming *rhs_state_renaming = nullptr)

Concatenate two NFTs.

Supports epsilon symbols when use_epsilon is set to true.

Parameters:
  • lhs[in] First automaton to concatenate.

  • rhs[in] Second automaton to concatenate.

  • epsilon[in] Epsilon to be used for concatenation (provided use_epsilon is true)

  • use_epsilon[in] Whether to concatenate over epsilon symbol.

  • lhs_state_renaming[out] Map mapping lhs states to result states.

  • rhs_state_renaming[out] Map mapping rhs states to result states.

Returns:

Concatenated automaton.

Strings

NFT algorithms and classes used for solving string constraints.

namespace mata

Main namespace including structs and algorithms for all automata.

In particular, this includes:

  1. Alphabets,

  2. Formula graphs and nodes,

  3. Mintermization,

  4. Closed sets.

namespace nft

Nondeterministic Finite Transducers including structures, transitions and algorithms.

In particular, this includes:

  1. Structures (Automaton, Transitions, Results, Delta),

  2. Algorithms (operations, checks, tests),

  3. Constructions.

Other algorithms are included in mata::nft::Plumbing (simplified API for, e.g., binding) and mata::nft::algorithms (concrete implementations of algorithms, such as for complement).

namespace strings

Enums

enum class ReplaceMode

How many occurrences of the regex to replace, in order from left to right?

Values:

enumerator Single

Replace only the first occurrence of the regex.

enumerator All

Replace all occurrences of the regex.

Functions

Nft create_identity(mata::Alphabet *alphabet, size_t num_of_levels = 2)

Create identity transducer over the alphabet with num_of_levels levels.

Nft create_identity_with_single_symbol_replace(mata::Alphabet *alphabet, Symbol from_symbol, Symbol replacement, ReplaceMode replace_mode = ReplaceMode::All)

Create identity input/output transducer with 2 levels over the alphabet with level_cnt levels with single symbol from_symbol replaced with @to_symbol.

Nft create_identity_with_single_symbol_replace(mata::Alphabet *alphabet, Symbol from_symbol, const Word &replacement, ReplaceMode replace_mode = ReplaceMode::All)

Create identity input/output transducer with 2 levels over the alphabet with level_cnt levels with single symbol from_symbol replaced with word replacement.

Nft replace_reluctant_regex(const std::string &regex, const Word &replacement, Alphabet *alphabet, ReplaceMode replace_mode = ReplaceMode::All, Symbol begin_marker = BEGIN_MARKER)

Create NFT modelling a reluctant leftmost replace of regex regex to replacement.

The most general replace operation, handling any regex as the part to be replaced.

Parameters:
  • regex – A string containing regex to be replaced.

  • replacement – Literal to be replaced with.

  • alphabetAlphabet over which to create the NFT.

  • replace_mode – Whether to replace all or just the single (the leftmost) occurrence of regex.

  • begin_markerSymbol to be used internally as a begin marker of replaced regex.

Returns:

The reluctant leftmost replace NFT.

Nft replace_reluctant_regex(nfa::Nfa regex, const Word &replacement, Alphabet *alphabet, ReplaceMode replace_mode = ReplaceMode::All, Symbol begin_marker = BEGIN_MARKER)

Create NFT modelling a reluctant leftmost replace of regex regex to replacement.

The most general replace operation, handling any regex as the part to be replaced.

Parameters:
  • regex – NFA representing regex to be replaced.

  • replacement – Literal to replace with.

  • alphabetAlphabet over which to create the NFT.

  • replace_mode – Whether to replace all or just the single (the leftmost) occurrence of regex.

  • begin_markerSymbol to be used internally as a begin marker of replaced regex.

Returns:

The reluctant leftmost replace NFT.

Nft replace_reluctant_literal(const Word &literal, const Word &replacement, Alphabet *alphabet, ReplaceMode replace_mode = ReplaceMode::All, Symbol end_marker = END_MARKER)

Create NFT modelling a reluctant leftmost replace of literal literal to replacement.

Parameters:
  • literal – Literal to replace.

  • replacement – Literal to replace with.

  • alphabetAlphabet over which to create the NFT.

  • replace_mode – Whether to replace all or just the single (the leftmost) occurrence of literal.

  • end_markerSymbol to be used internally as an end marker marking the end of the replaced literal.

Returns:

The reluctant leftmost replace NFT.

Nft replace_reluctant_single_symbol(Symbol from_symbol, Symbol replacement, mata::Alphabet *alphabet, ReplaceMode replace_mode = ReplaceMode::All)

Create NFT modelling a reluctant leftmost replace of symbol from_symbol to replacement.

Parameters:
  • from_symbolSymbol to replace.

  • replacementSymbol to replace with.

  • alphabetAlphabet over which to create the NFT.

  • replace_mode – Whether to replace all or just the single (the leftmost) occurrence of from_symbol.

Returns:

The reluctant leftmost replace NFT.

Nft replace_reluctant_single_symbol(Symbol from_symbol, const Word &replacement, mata::Alphabet *alphabet, ReplaceMode replace_mode = ReplaceMode::All)

Create NFT modelling a reluctant leftmost replace of symbol from_symbol to replacement.

Parameters:
  • from_symbolSymbol to replace.

  • replacement – Literal to replace with.

  • alphabetAlphabet over which to create the NFT.

  • replace_mode – Whether to replace all or just the single (the leftmost) occurrence of from_symbol.

Returns:

The reluctant leftmost replace NFT.

Variables

Symbol BEGIN_MARKER = {EPSILON - 100}

Marker marking the beginning of the regex to be replaced.

Symbol END_MARKER = {EPSILON - 99}

Marker marking the end of the regex to be replaced.

class ReluctantReplace
#include <strings.hh>

Implementation of all reluctant replace versions.

Public Static Functions

static Nft replace_regex(nfa::Nfa regex, const Word &replacement, Alphabet *alphabet, ReplaceMode replace_mode = ReplaceMode::All, Symbol begin_marker = BEGIN_MARKER)

Create NFT modelling a reluctant leftmost replace of regex regex to replacement.

The most general replace operation, handling any regex as the part to be replaced.

Parameters:
  • regex – NFA representing regex to be replaced.

  • replacement – Literal to replace with.

  • alphabetAlphabet over which to create the NFT.

  • replace_mode – Whether to replace all or just the single (the leftmost) occurrence of regex.

  • begin_markerSymbol to be used internally as a begin marker of replaced regex.

Returns:

The reluctant leftmost replace NFT.

static Nft replace_literal(const Word &literal, const Word &replacement, Alphabet *alphabet, ReplaceMode replace_mode = ReplaceMode::All, Symbol end_marker = END_MARKER)

Create NFT modelling a reluctant leftmost replace of literal literal to replacement.

Parameters:
  • literal – Literal to replace.

  • replacement – Literal to replace with.

  • alphabetAlphabet over which to create the NFT.

  • replace_mode – Whether to replace all or just the single (the leftmost) occurrence of literal.

  • end_markerSymbol to be used internally as an end marker marking the end of the replaced literal.

Returns:

The reluctant leftmost replace NFT.

static Nft replace_symbol(Symbol from_symbol, Symbol replacement, mata::Alphabet *alphabet, ReplaceMode replace_mode = ReplaceMode::All)

Create NFT modelling a reluctant leftmost replace of symbol from_symbol to replacement.

Parameters:
  • from_symbolSymbol to replace.

  • replacementSymbol to replace with.

  • alphabetAlphabet over which to create the NFT.

  • replace_mode – Whether to replace all or just the single (the leftmost) occurrence of from_symbol.

Returns:

The reluctant leftmost replace NFT.

static Nft replace_symbol(Symbol from_symbol, const Word &replacement, mata::Alphabet *alphabet, ReplaceMode replace_mode = ReplaceMode::All)

Create NFT modelling a reluctant leftmost replace of symbol from_symbol to replacement.

Parameters:
  • from_symbolSymbol to replace.

  • replacement – Literal to replace with.

  • alphabetAlphabet over which to create the NFT.

  • replace_mode – Whether to replace all or just the single (the leftmost) occurrence of from_symbol.

Returns:

The reluctant leftmost replace NFT.

Protected Functions

nfa::Nfa end_marker_dfa(nfa::Nfa regex)
Nft marker_nft(const nfa::Nfa &marker_dfa, Symbol marker)
nfa::Nfa generic_marker_dfa(const std::string &regex, Alphabet *alphabet)
nfa::Nfa generic_marker_dfa(nfa::Nfa regex, Alphabet *alphabet)
nfa::Nfa begin_marker_nfa(const std::string &regex, Alphabet *alphabet)
nfa::Nfa begin_marker_nfa(nfa::Nfa regex, Alphabet *alphabet)
Nft begin_marker_nft(const nfa::Nfa &marker_nfa, Symbol begin_marker)
Nft end_marker_dft(const nfa::Nfa &end_marker_dfa, Symbol end_marker)
nfa::Nfa reluctant_nfa_with_marker(nfa::Nfa nfa, Symbol marker, Alphabet *alphabet)
Nft reluctant_leftmost_nft(const std::string &regex, Alphabet *alphabet, Symbol begin_marker, const Word &replacement, ReplaceMode replace_mode)
Nft reluctant_leftmost_nft(nfa::Nfa nfa, Alphabet *alphabet, Symbol begin_marker, const Word &replacement, ReplaceMode replace_mode)
Nft replace_literal_nft(const Word &literal, const Word &replacement, const Alphabet *alphabet, Symbol end_marker, ReplaceMode replace_mode = ReplaceMode::All)