Fm
structure
signature FM
structure Fm
:> FM
The structure Fm deals with finite machines, i.e. finite non-deterministic automata without epsilon-transitions.
All functions to build machines or to manipulate them are polymorphic in the type of the alphabet. Implicitly, we assume the alphabet of instructions to consist of those mentioned in the machine's transitions. To display automata, see ppFm.
type ''a machine
val Atom : ''a -> ''a machine
val Plus : ''a machine list -> ''a machine
val Star : ''a machine -> ''a machine
val Times : ''a machine list -> ''a machine
val accept : ''a machine -> ''a list -> bool
val make : {
final : int list,
trans : (int * ''a * int) list,
start : int list
} -> ''a machine
val show : ''a machine
-> {
final : int list,
trans : (int * ''a * int) list,
start : int list
}
val states : ''a machine -> int
val nextstates : ''a machine -> int -> ''a -> int list
val reach : ''a machine -> int list -> ''a list -> int list
val determine : ''a machine -> ''a machine
val determineWithStateAssoc : ''a machine
-> ''a machine
* (int * int list) list
val minimize : ''a machine -> ''a machine
val minimizeWithStateAssoc : ''a machine
-> ''a machine
* (int * int list) list
val minimizeWithHistory : ''a machine
-> ((''a
* int list) machine
* (int * int list) list) list
type ''a machine
Atom a
Plus l
Star m
Times l
accept m l
make {final, trans, start}
show m
states m
nextstates m i a
reach m is l
determine m
determineWithStateAssoc m
minimize m
minimizeWithStateAssoc m
minimizeWithHistory m
ppFm, ppRegExpFm, RegEqnsFm
Deterministic machines are here treated as non-deterministic machines with functional transition relation. To avoid the overhead of interpreting these relations, a separate signature for deterministic machines, implementing the deterministic transition relation as a function, would be useful .
As with regular expressions, associative binary operations (alternative and sequential composition) are treated as operations having a finite list of arguments. (In particular, a zero and a unit machine are the Plus resp. Times of an empty list of machines.)
An isomorphism test for minimal deterministic machines has to be added.
Example:
val M = Fm.make{trans=[(0,"a",1),(1,"b",2),(0,"c",2)],start=[0],final=[2]} Fm.show (Fm.Star M) val it = {final=[0,3],start=[0,1], trans=[(1,"a",2),(2,"b",3),(1,"c",3),(1,"c",1),(2,"b",1)]} Fm.determineWithStateAssoc (Fm.Star M) val it = (-,[(0,[0,1]),(1,[3,1]),(2,[]),(3,[2])]) : string Fm.machine * (int * int list) list