在Haskell中求自由幂等幺半群元素的极小形式
该方程类似于自由幺半群,但其商为方程x²=x;例如,aa=a,bcb=b(cb)(cb)=bcb 然而,要在幺半群中找到单词的最小形式,通常需要展开(x=x²)和收缩(x²=x),因此语言中并非每个无平方的单词都是最小的。例如,bacbcab=bacbcab。因此,有限个生成元上的自由幂等幺半群是有限的 我要寻找的是Haskell中的一个算法,它接受幺半群中的一个有限字,在这里表示为a,并返回其最小形式,其中最小值的定义如下:在Haskell中求自由幂等幺半群元素的极小形式,haskell,discrete-mathematics,monoids,Haskell,Discrete Mathematics,Monoids,该方程类似于自由幺半群,但其商为方程x²=x;例如,aa=a,bcb=b(cb)(cb)=bcb 然而,要在幺半群中找到单词的最小形式,通常需要展开(x=x²)和收缩(x²=x),因此语言中并非每个无平方的单词都是最小的。例如,bacbcab=bacbcab。因此,有限个生成元上的自由幂等幺半群是有限的 我要寻找的是Haskell中的一个算法,它接受幺半群中的一个有限字,在这里表示为a,并返回其最小形式,其中最小值的定义如下: 最短长度,以及 在相同长度的单词中,最小的 因此,该方法的签名为:
minimizedEmpotent::Ord a=>Seq a->Seq a
最小有效性w=。。。
从这里开始,半群
和幺半群
实例的定义如下:
newtype幂等元a=幂等元(Seq a)
推导(Eq、Ord、Show)
实例Ord a=>半群(幂等元a),其中
幂等x幂等y
|null x=幂等元y
|null y=幂等元x
|否则=幂等元(极小幂等元(xy))
刺激nx=案例比较n0
LT->错误“时间(幂等):负计数”
等式->幂等元记忆
GT->x
实例Ord a=>幺半群(幂等元a),其中
mempty=幂等元mempty
mappend=()
M.Lothaire在《词语组合学》中对定理2.4.1的证明似乎有一些相关的线索。对于一个给定的单词,我们从中取出四块:
这个算法不是很有效!您可以将其视为进行两次递归调用,每次调用的单词只包含一个唯一字母,因此所需时间至少与原始单词的字母表大小成指数关系。哎呀。您可能需要考虑一些简单的案例,以实现快速路径。例如,当所有重复的字母彼此相邻时,删除相邻的重复字母将标准化。另一条可能有用的快速路径是:当规范化wx时,您知道w和x已经被规范化了,那么如果您在递归过程中碰巧达到了它们,那么w和x本身就可以成为基本情况,也许你可以想出一些方法来廉价地识别w和x的附加子串,这些子串是合适的基本情况。你知道如何用任何语言(甚至伪代码)实现这个算法吗?如果是这样的话,试着自己把它翻译成Haskell,告诉我们你在哪里被卡住了。如果不是的话,也许让这种语言变得不可知,或者甚至在CS stackexchange这样的姐妹网站上提问,会更有意义。我自己也读过那篇文章,但我不知道a和b是如何选择的。谢谢你的解释!到目前为止,我已经算出了基本情况:(1)如果α(x)|=x,那么min(x)=x;(2) 如果∉ x和a∉ y、 然后min(xay)=(min(x))a(min(y));(3) |x |<4或| alpha(x)|<3的基本情况。现在,我想知道一种快速消除方块的方法是否有帮助,如果有,那是什么方法。