有没有正确的组合摩尔机器的方法?

时间:2015-08-23 17:17:04

标签: language-agnostic functional-programming composition state-machine

mealy machine只是一个有状态函数。因此,可以使用简单的function composition组合两台mealy机器。 moore machinerestricted 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来编写有状态函数。

1 个答案:

答案 0 :(得分:-1)

不,没有正确的方法来组成两个摩尔机器。没有identity element,组合没有意义。这是因为组合及其标识元素必须一起形成monoid才能有意义。这是category的数学定义。

类别C包含:

  1. 一个名为对象的集合ob(C)
  2. 对象之间的态射的类hom(C)。 hom-class hom(a, b)是从ab的所有态射的集合(每个态射f都表示为f : a -> b)。
  3. 二元操作hom(b, c) * hom(a, b) -> hom(a, c)为每三个对象abc调用态射的组合。
  4. 此外,他们必须满足以下法律:

    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成立。
    4. 没有办法合成两个摩尔机器只是因为两个摩尔机器的组成没有标识元素。因此,摩尔机器不构成一个类别。摩尔机器被定义为由以下组成的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
      7. moore机器没有标识元素的原因是因为moore机器的输出不依赖于它的输入。它只取决于当前的状态。初始状态为s0。因此,初始输出为g(s0)。对于identity元素,初始输出将是未定义的,因为它必须匹配尚未知的输入类型。因此,“身份元素”将无法满足左右身份法则。