On Sun, 11 Sep 2005, icpdesign wrote:
> Does someone used Joy as a finite automata? How Deterministic Finite
> Automton should be defined in Joy. Also, how do we implement the
> algorithm of converting a nondeterminisitic finite automata (NFA) to a
> determinisitic finite automata (DFA).
>
> I am learning Joy and looking for Joy programs implementing known algorithms, like the one
> to covert an NFA to DFA
The conversion algorithm is just 4 lines of plain English in Aho
and Ullman, Introduction to Automata Theory, Languages and Computation,
p 22. I doubt whether anyone would want a conversion program, since
just writing the NFA acceptor is exactly the same as writing a DFA
acceptor in which the states are sets. So one might as well write
the NFA table as DFA table.
If you do not need more than 32 states in your NFA, (say 0..31),
then you can use Joy sets (with the Boolean operations not, and or).
Your input is a sequence, either a Joy list of characters or a string.
You for each of the input symbols you need a function which returns,
for the given input symbol and an arbitrary state, a set of possible
new states. So one way of representing that is to have, for each
input symbol, a list of sets, where the i-th set (i = 0..31) is the
set of next states. This way at least the sets can be indexed.
Alternatively, have just one big ordered list, of as many sublists as
there are symbols, where each sublist is an ordered list of sets as
above. This probably best.
The accepting algorithm then is (writen in "pre-Joy", but not too "pre"):
Let the accumulator of current states be {0}. (Start)
Stepping through the input sequence (Use Joy "step") do this:
use the current input symbol to index into the big list,
start a new accumulator {},
for each of the states in the old accumulator (again use "step"),
index for that state into the set of next states
and form the union (Joy "or") of that set of state
with the new accumulator.
The end of the input sequence has been reached.
Test whether the current accumulator (the last set of states) shares a
member with the set of accepting states (test whether their "and"
is non-empty). If so, ACCEPT, else REJECT the input sequence.
The above is essentially a table driven acceptor - the acceptor
interprets the table (the same as yacc and lex do). You could
of course also have a Joy program which has the table built in,
so to speak - the way handwritten parsers and scanners work.
I'm not sure what you had in mind.
Hope this helps.
- Manfred