- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
free idempotent monoid类似于自由幺半群,但由方程 x² = x 商;例如,aa = a,bcbcb = b(cb)(cb) = bcb,
但是,要在幺半群中找到单词的最小形式,扩展 (x = x²) 以及收缩 (x² = x) 通常是必需的,因此并非语言中的每个 squarefree 词都是最小的。例如,bacbcabc = bacabc。因此,有限数量的生成器上的自由幂等幺半群是有限的。
我正在寻找的是 Haskell 中的一种算法,该算法采用幺半群中的有限词,此处表示为 Seq
, 并返回其最小形式,其中最小定义为:
所以这个方法的签名是:
minimizeIdempotent :: Ord a => Seq a -> Seq a
minimizeIdempotent w = ...
从那里开始,Semigroup
和 Monoid
实例的定义将是:
newtype Idempotent a = Idempotent (Seq a)
deriving (Eq, Ord, Show)
instance Ord a => Semigroup (Idempotent a) where
Idempotent x <> Idempotent y
| null x = Idempotent y
| null y = Idempotent x
| otherwise = Idempotent (minimizeIdempotent (x <> y))
stimes n x = case compare n 0 of
LT -> error "stimes (Idempotent): negative count"
EQ -> Idempotent mempty
GT -> x
instance Ord a => Monoid (Idempotent a) where
mempty = Idempotent mempty
mappend = (<>)
最佳答案
M. Lothaire 的“Combinatorics on Words”中定理 2.4.1 的证明似乎有一些相关的线索。对于给定的单词,我们提取它的四个部分:
写 w .= (p, a, b, q) 当 p 和 q 分别是适当的前缀和后缀时, w 和 a 和 b 分别是下一个和上一个字母。例如,bacbcabc .= (ba, c, a, bc)、aaabaa .= (aaa, b, b, aa) 和 abcd .= (abc、d、a、bcd)。
如果 w1 .= (p1, a1, b1, q1) 和 w2 .= (p2, a2, b2, q2),他们在声明 (iii) 中证明) 在第 34 页上,w1 ~ w2 iff p1 ~ p2,a1 = a2,b1 = b2,并且q1 ~ q2。 (我使用 ~ 表示由方程 x ~ xx 导出的同余关系,这样我就可以区分精确的词相等和商相等。)我们可以用它来创建一个算法来计算给定单词 w 的规范形式,如下所示:
通过相对简单的归纳论证,我相信该算法是正确的。 “正确”是指 w1 ~ w2 iff f(w1) = f(w2),其中 f 是上述函数.尚不清楚 f 按您建议的顺序生成等价类的最小代表,但也许这种意义上的正确性足以满足您的需求。
(严格来说,上面的第 3 步和第 4 步对于正确性来说并不是完全必要的。您可以只返回 p'abq' 并获得相同的保证。但是生成的代表会很长与上面提出的算法的比较。)
这个算法效率不高!您可以将此视为进行两次递归调用,每次调用的单词都少了一个唯一字母,因此这需要的时间至少是原始单词字母表大小的指数级。哎呀。您可能想考虑一些简单的快速路径案例。例如,当所有重复的字母彼此紧邻时,删除相邻的重复字母规范化。另一个可能有用的快速路径:规范化 wx 时,您知道 w 和 x 已经规范化,然后 w 和 x 如果您在递归期间碰巧遇到它们,它们本身可以是基本情况,并且您可能可以想出一些方法来廉价地识别 w 的其他子串和 x 是合适的基本情况。
关于haskell - 在 Haskell 中寻找自由幂等幺半群的元素的最小形式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60173984/
这是我正在调试的函数: boolean adin_memory(char* buffer, int size_chunck, int end_flag){ global_buffer = my
我正在尝试为具有自由 float 底座的机器人计算末端执行器空间速度雅可比行列式。由于自由 float 基数,雅可比应该包含一个基数组件和一个操纵器注释(参见 https://spart.readth
procedure FreeListObjects( l : TStrings); var i : integer; BEGIN FOR i := 0 TO l.Count -1 DO BEG
我正在探索 Haskell 中的选项,这些选项可以让我将业务逻辑与底层系统的技术实现分开。例如,在 Web 服务器的上下文中,将 Web 服务器处理其接收的信息的方式与其读取和写入数据库的方式分开。要
我的目标是使用来自 ActiveMQ 的 WebSphere Liberty Appserver(完整的 Java EE 标准)使用消息。不幸的是,我不知道如何配置 WebSphere Liberty
我以这种方式分配了一个非方阵,但我不确定我是否正确使用了释放 float **matrix_alloc(int m /* rows */, int n /* columns */) { int
我在阅读 refuting the notion 之后的第 13.5 节内置运算符不参与重载决议,并注意到没有关于 operator->* 的部分。它只是一个通用的二元运算符。 它的兄弟operato
我正在尝试使用 Libelf 库来获取有关某些 elf 文件的一些信息。但我不断收到这些“对 [...] 的 undefined reference ”。我从 synaptic 安装了 libelf(
我有创建动态结构数组的波纹管代码。 #include #include #include typedef struct { int flag; char* ip; } ip_mo
我是 StackOverflow 的新人。我现在正在学习C指针。 这是我的代码: #include #include int alloc(int* p){ p = (int*) mallo
我是 StackOverflow 的新人。我现在正在学习C指针。 这是我的代码: #include #include int alloc(int* p){ p = (int*) mallo
我正在用 C 编写一个程序,我需要读入一个文件并打印出每个至少 4 个字符长的字符串。我在分配要使用的内存时遇到问题。字符串可以任意长。我试图将缓冲区分配给文件的大小,然后在最后释放它,但我显然错过了
我尝试用 C 语言编写 ls 命令,但 -R 选项有问题。 输出: /Applications/Atom.app/Contents/Resources/app/apm/node_modules/es5
我正在编写一个 shell,但在执行内存检查时遇到问题,因为 valgrind 无法正常运行。 我遇到了这样的错误(我自己杀死了它): ==19703== Memcheck, a memory err
我有这样一段代码: void *write_parallel(void *num_for_chunk) { struct rusage *sum = (struct rusage*) mall
当使用包含 200-300 个整数(以空格分隔)的输入 .txt 文件运行此代码时,我在使用 fprintf 语句的 for 循环之前收到错误。 我不确定 qsort 是否导致了此错误或为什么会发生此
我试图告诉 Websphere Liberty 我的 log4j2.xml 文件在哪里,但它不起作用。 在我的文件 jvm.options 中,我配置: -Dlog4j.configurationFi
从 websphere liberty 16 迁移到 19.0.0.1 我遇到以下异常:运行存储过程后关闭连接,出现以下异常: EJB threw an unexpected (non-declare
当对大小为 210*8 的种子数据集运行此代码时,我在预测函数中的 qsort() 行之后收到错误。它不在 qsort() 之后执行。 我不确定 qsort 是否导致了此错误或为什么会发生此错误,但如
这个问题已经有答案了: Facing an error "*** glibc detected *** free(): invalid next size (fast)" (2 个回答) 已关闭 9
我是一名优秀的程序员,十分优秀!