是否有正确的组合摩尔机的方法?
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
包括:
- 一组称为对象的 class、
ob(C)
。
- 一个class,
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
成立。
没有办法组合两个摩尔机,因为两个摩尔机的组合没有标识元素。因此,moore 机器不构成一个类别。摩尔机被定义为 6 元组 (s, s0, a, b, t, g)
,包括:
- 一组有限的状态
s
。
- 开始状态
s0
是一个元素 s
。
- 称为输入字母表的有限集
a
。
- 称为输出字母表的有限集
b
。
- 一个转换函数
t : s * a -> s
。
- 一个输出函数
g : s -> b
。
摩尔机没有标识元素的原因是摩尔机的输出不依赖于它的输入。它仅取决于当前状态。初始状态为s0
。因此,初始输出为 g(s0)
。身份元素的初始输出将是未定义的,因为它必须与未知的输入类型相匹配。因此,"identity element"就无法满足左and/or右恒等式。
一个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
包括:
- 一组称为对象的 class、
ob(C)
。 - 一个class,
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
成立。
没有办法组合两个摩尔机,因为两个摩尔机的组合没有标识元素。因此,moore 机器不构成一个类别。摩尔机被定义为 6 元组 (s, s0, a, b, t, g)
,包括:
- 一组有限的状态
s
。 - 开始状态
s0
是一个元素s
。 - 称为输入字母表的有限集
a
。 - 称为输出字母表的有限集
b
。 - 一个转换函数
t : s * a -> s
。 - 一个输出函数
g : s -> b
。
摩尔机没有标识元素的原因是摩尔机的输出不依赖于它的输入。它仅取决于当前状态。初始状态为s0
。因此,初始输出为 g(s0)
。身份元素的初始输出将是未定义的,因为它必须与未知的输入类型相匹配。因此,"identity element"就无法满足左and/or右恒等式。