mealy machine只是一个有状态函数。因此,可以使用简单的function composition组合两台mealy机器。 moore machine是restricted mealy machine with an initial output value。有没有办法组成两个摩尔机器?这是我在Haskell中尝试过的:
type Mealy a b = a -> b -- a stateful function, probably using unsafePerformIO
type Moore a b = (b, Mealy a b) -- output must be consistent with current state
composeMoore :: (c, b -> c) -> (b, a -> b) -> (c, a -> c)
composeMoore (x, f) (_, g) = (x, f . g) -- is this correct?
composeMoore (_, f) (y, g) = (f y, f . g) -- or is this correct?
我相信他们都错了。事实上,我认为组合两台摩尔机器是不可能的。但是,我可能错了。是否有正确的组合摩尔机器的方法?
定义:摩尔机器的组成是(.) :: Moore b c -> Moore a b -> Moore a c
类型的操作,其关联定律(即h . (g . f) = (h . g) . f
)成立。
注意:这只是一个理论问题。我实际上并没有使用Haskell来编写有状态函数。
答案 0 :(得分:-1)
不,没有正确的方法来组成两个摩尔机器。没有identity element,组合没有意义。这是因为组合及其标识元素必须一起形成monoid才能有意义。这是category的数学定义。
类别C
包含:
ob(C)
。hom(C)
。 hom-class hom(a, b)
是从a
到b
的所有态射的集合(每个态射f
都表示为f : a -> b
)。hom(b, c) * hom(a, b) -> hom(a, c)
为每三个对象a
,b
和c
调用态射的组合。此外,他们必须满足以下法律:
f : a -> b
,g : b -> c
和h : c -> d
,关系h . (g . f) = (h . g) . f
必须成立。x
,必须有一个态射id_x : x -> x
称为x
的身份态射,以便所有f : a -> x
关系id_x . f = f
成立。x
,必须有一个态射id_x : x -> x
称为x
的身份态射,以便所有g : x -> b
关系g . id_x = g
成立。没有办法合成两个摩尔机器只是因为两个摩尔机器的组成没有标识元素。因此,摩尔机器不构成一个类别。摩尔机器被定义为由以下组成的6元组(s, s0, a, b, t, g)
:
s
。s0
,它是一个元素s
。a
称为输入字母。b
称为输出字母。t : s * a -> s
。g : s -> b
。 moore机器没有标识元素的原因是因为moore机器的输出不依赖于它的输入。它只取决于当前的状态。初始状态为s0
。因此,初始输出为g(s0)
。对于identity元素,初始输出将是未定义的,因为它必须匹配尚未知的输入类型。因此,“身份元素”将无法满足左右身份法则。