是否有正确的组合摩尔机的方法?

Is there a correct way of composing moore machines?

一个mealy machine is just a stateful function. Hence, two mealy machines can be composed using simple function composition. A moore machine is a 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 来编写有状态函数。

我认为你的结果机器必须有第一个参数的开始输出,而且还需要在第二个机器的开始输出上应用第一个的转换。

所以你的组合函数不是你给出的两个,而是它们的混合:

composeMoore :: (c, b -> c) -> (b, a -> b) -> (c, a -> c)
composeMoore (x, f) (y, g) = ((x; f y), f . g)

其中 ; 是不纯计算排序运算符(想想 JS 中的 ,)。

我认为您的推理可以从使用纯机器模型中获益良多:-)

不,没有组合两个摩尔机器的正确方法。没有 identity element. This is because composition along with its identity element must together form a monoid in order to be meaningful. This is the mathematical definition of a category.

的组合没有意义

类别 C 包括:

  1. 一组称为对象的 class、ob(C)
  2. 一个class,hom(C),对象之间的态射。 hom-class、hom(a, b)是从ab的所有态射的集合(每个态射f表示为f : a -> b ).
  3. 二元运算hom(b, c) * hom(a, b) -> hom(a, c)称为态射的复合,对于每三个对象abc

此外,它们必须满足以下规律:

  1. 关联性: 对于所有 f : a -> bg : b -> ch : c -> d,关系 h . (g . f) = (h . g) . f 必须成立。
  2. 左恒等式: 对于所有对象 x 必须有一个态射 id_x : x -> x 称为 x 的恒等态射使得对于所有f : a -> x 关系 id_x . f = f 成立。
  3. 正确恒等式: 对于所有对象 x 必须有一个态射 id_x : x -> x 称为 x 的恒等态射使得对于所有g : x -> b 关系 g . id_x = g 成立。

没有办法组合两个摩尔机,因为两个摩尔机的组合没有标识元素。因此,moore 机器不构成一个类别。摩尔机被定义为 6 元组 (s, s0, a, b, t, g),包括:

  1. 一组有限的状态 s
  2. 开始状态 s0 是一个元素 s
  3. 称为输入字母表的有限集 a
  4. 称为输出字母表的有限集 b
  5. 一个转换函数t : s * a -> s
  6. 一个输出函数g : s -> b

摩尔机没有标识元素的原因是摩尔机的输出不依赖于它的输入。它仅取决于当前状态。初始状态为s0。因此,初始输出为 g(s0)。身份元素的初始输出将是未定义的,因为它必须与未知的输入类型相匹配。因此,"identity element"就无法满足左and/or右恒等式。