Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Haskell中求自由幂等幺半群元素的极小形式_Haskell_Discrete Mathematics_Monoids - Fatal编程技术网

在Haskell中求自由幂等幺半群元素的极小形式

在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,并返回其最小形式,其中最小值的定义如下: 最短长度,以及 在相同长度的单词中,最小的 因此,该方法的签名为:

该方程类似于自由幺半群,但其商为方程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的证明似乎有一些相关的线索。对于一个给定的单词,我们从中取出四块:

  • 不包含整个单词所包含的所有字母的最长前缀
  • 下一封信
  • 不包含整个单词所包含的所有字母的最长后缀
  • 上一封信
  • 当p和q分别是w的适当前缀和后缀,且a和b分别是下一个和上一个字母时,写w.=(p,a,b,q)。例如,bacbcbc.=(ba,c,a,bc),aaabaa.=(aaa,b,b,aa)和abcd.=(abc,d,a,bcd)

    如果w1.=(p1,a1,b1,q1)和w2.=(p2,a2,b2,q2),则它们在第34页的权利要求(iii)中证明w1~w2 iff p1~p2,a1=a2,b1=b2和q1~q2。(我用~表示由等式x~xx导出的同余关系,这样我可以区分精确的单词相等和商相等。)我们可以用它来创建一个算法,用于计算给定单词w的标准形式,如下所示:

  • 计算p,a,b,q,使得w=(p,a,b,q)
  • 递归地计算p的标准形式p'和q的标准形式q'。(基本大小写:空单词的标准形式是空单词。)
  • 找到p'a的最长后缀,它是bq'的前缀;把这个叫做s,剩下的叫做t,这样p'a=ts
  • 返回待决条件'
  • 通过一个相对简单的归纳论证,我相信这个算法是正确的。所谓“正确”,我的意思是w1~w2 iff(w1)=f(w2),其中f是上述函数。不清楚f是否通过您提出的顺序生成等价类的最小代表,但从这个意义上讲,正确性可能足以满足您的需要

    (严格地说,上面的步骤3和4对于正确性不是完全必要的。您可以返回p'abq'并获得相同的保证。但是与上面提出的算法相比,生成的代表将非常长。)


    这个算法不是很有效!您可以将其视为进行两次递归调用,每次调用的单词只包含一个唯一字母,因此所需时间至少与原始单词的字母表大小成指数关系。哎呀。您可能需要考虑一些简单的案例,以实现快速路径。例如,当所有重复的字母彼此相邻时,删除相邻的重复字母将标准化。另一条可能有用的快速路径是:当规范化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的基本情况。现在,我想知道一种快速消除方块的方法是否有帮助,如果有,那是什么方法。