麦利机只是一个有状态函数。因此,两台米利机器可以使用简单的功能组合组成。摩尔机是具有初始输出值的受限米利机。有办法组成两台摩尔机器吗?这就是我在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来编写有状态函数。
发布于 2015-08-23 20:55:42
不,没有正确的方法组成两台摩尔机器。没有同一性元素,作文就没有意义。这是因为为了有意义,组合以及它的标识元素必须一起形成一个单样。这是类别的数学定义。
类别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
必须有一个名为x
的同一性态射id_x : x -> x
,这样对于所有f : a -> x
,关系id_x . f = f
都是正确的。x
的同一性态射( id_x : x -> x
),因此对于所有g : x -> b
,关系g . id_x = g
都是正确的。没有办法组成两台摩尔机器,仅仅是因为两台摩尔机器的合成没有同一性元素。因此,摩尔机器不构成一个类别。摩尔机器被定义为由以下六个元组组成的(s, s0, a, b, t, g)
:
s
。s0
,它是一个元素s
。a
称为输入字母表。b
称为输出字母表。t : s * a -> s
。g : s -> b
。摩尔机器没有标识元素的原因是,摩尔机器的输出不依赖于它的输入。它只取决于当前的状态。初始状态为s0
。因此,初始输出是g(s0)
。标识元素的初始输出将没有定义,因为它必须匹配尚未确定的输入类型。因此,“身份要素”将无法满足左和(或)右身份法律。
发布于 2015-08-23 18:02:58
我认为您的结果机器必须有第一个参数的开始输出,但也需要将第一个参数的转换应用到第二个机器的开始输出。
所以你的构图功能既不是你给出的两种,而是它们的混合:
composeMoore :: (c, b -> c) -> (b, a -> b) -> (c, a -> c)
composeMoore (x, f) (y, g) = ((x; f y), f . g)
其中;
是不纯的计算排序操作符(如JS中的,
)。
我认为你的推理可以从使用纯机器模型中获益良多:)
https://stackoverflow.com/questions/32169331
复制相似问题