My machine specification is a list of the form
[ [fromState, [inputSymbol, toState, outputSymbol], [inputSymbol, toState, outputSymbol], .... [inputSymbol, toState, outputSymbol] ], [fromState, [inputSymbol, toState, outputSymbol], [inputSymbol, toState, outputSymbol], .... [inputSymbol, toState, outputSymbol] ], .... [fromState, [inputSymbol, toState, outputSymbol], [inputSymbol, toState, outputSymbol], .... [inputSymbol, toState, outputSymbol] ] ]
This representation allows me to use assoc to match the current state against one in the table. Once I've found the current state, I can use assoc on the attached list to match the current input symbol, and from there get the next state and the corresponding output symbol.
The program for a imulator using this specification is:
fsmSim(Machine, currentState, [inputSymbol | More]) => [_ | Choices] = assoc(currentState, Machine), // find state [_, toState, outputSymbol] = assoc(inputSymbol, Choices), // find symbol [outputSymbol | fsmSim(Machine, toState, More)]; // produce output and continue fsmSim(Machine, currentState, []) => []; fsmSim(Machine, currentState, _) => ["undefined transition"];
The above code is a rex-executable function.