NAME
FLAT::DFA - Deterministic finite automata
SYNOPSIS
A FLAT::DFA object is a finite automata whose transitions are labeled with single characters. Furthermore, each state has exactly one outgoing transition for each available label/character.
USAGE
In addition to implementing the interface specified in FLAT and FLAT::NFA, FLAT::DFA objects provide the following DFA-specific methods:
- $dfa->unset_starting
-
Because a DFA, by definition, must have only ONE starting state, this allows one to unset the current start state so that a new one may be set.
- $dfa->trim_sinks
-
This method returns a FLAT::DFA (though in theory an NFA) that is lacking a transition for all symbols from all states. This method eliminates all transitions from all states that lead to a sink state; it also eliminates the sink state.
This has no affect on testing if a string is valid using
FLAT::DFA::is_valid_string
, discussed below. - $dfa->as_min_dfa
-
This method minimizes the number of states and transitions in the given DFA. The modifies the current/calling DFA object.
- $dfa->is_valid_string($string)
-
This method tests if the given string is accepted by the DFA.
- $dfa->as_node_list
-
This method returns a node list in the form of a hash. This node list may be viewed as a pure digraph, and is lacking in state names and transition symbols.
- $dfa->as_acyclic_strings
-
The method is deprecated, and it is suggested that one not use it. It returns all valid strings accepted by the DFA by exploring all acyclic paths that go from the start state and end in an accepting state. The issue with this method is that it finds and returns all strings at once. The iterator described below is much more ideal for actual use in an application.
- $dfa->as_dft_strings($depth)
-
The method is deprecated, and it is suggested that one not use it. It returns all valid strings accepted by the DFA using a depth first traversal. A valid string is formed when the traversal detects an accepting state, whether it is a terminal node or a node reached via a back edge. The issue with this method is that it finds and returns all strings at once. The iterator described below is much more ideal for actual use in an application.
The argument,
$depth
specifies how many times the traversal may actually pass through a previously visited node. It is therefore possible to safely explore DFAs that accept infinite languages. - $dfa->new_acyclic_string_generator
-
This allows one to initialize an iterator that returns a valid string on each successive call of the sub-ref that is returned. It returns all valid strings accepted by the DFA by exploring all acyclic paths that go from the start state and end in an accepting state.
Example:
#!/usr/bin/env perl use strict; use FLAT::DFA; use FLAT::NFA; use FLAT::PFA; use FLAT::Regex::WithExtraOps; my $PRE = "abc&(def)*"; my $dfa = FLAT::Regex::WithExtraOps->new($PRE)->as_pfa->as_nfa->as_dfa->as_min_dfa->trim_sinks; my $next = $dfa->new_acyclic_string_generator; print "PRE: $PRE\n"; print "Acyclic:\n"; while (my $string = $next->()) { print " $string\n"; }
- $dfa->new_deepdft_string_generator($depth)
-
This allows one to initialize an iterator that returns a valid string on each successive call of the sub-ref that is returned. It returns all valid strings accepted by the DFA using a depth first traversal. A valid string is formed when the traversal detects an accepting state, whether it is a terminal node or a node reached via a back edge.
The argument,
$depth
specifies how many times the traversal may actually pass through a previously visited node. It is therefore possible to safely explore DFAs that accept infinite languages.#!/usr/bin/env perl use strict; use FLAT::DFA; use FLAT::NFA; use FLAT::PFA; use FLAT::Regex::WithExtraOps; my $PRE = "abc&(def)*"; my $dfa = FLAT::Regex::WithExtraOps->new($PRE)->as_pfa->as_nfa->as_dfa->as_min_dfa->trim_sinks; my $next = $dfa->new_deepdft_string_generator(); print "Deep DFT (default):\n"; for (1..10) { while (my $string = $next->()) { print " $string\n"; last; } } $next = $dfa->new_deepdft_string_generator(5); print "Deep DFT (5):\n"; for (1..10) { while (my $string = $next->()) { print " $string\n"; last; } }
AUTHORS & ACKNOWLEDGEMENTS
FLAT is written by Mike Rosulek <mike at mikero dot com> and Brett Estrade <estradb at gmail dot com>.
The initial version (FLAT::Legacy) by Brett Estrade was work towards an MS thesis at the University of Southern Mississippi.
Please visit the Wiki at http://www.0x743.com/flat
LICENSE
This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.