本页收集了重构sage.combinat.words和实现平铺的想法。您可以订阅关联的邮件列表讨论这个问题。

如何实现我的语言?我的瓷砖?

例如,有不同的地方可以查看:

对于移位和平铺,(到目前为止)几乎什么都没有:

结构

当前代码的重构应该放在补丁中#12224这几乎完成了。到目前为止,Sage的代码有点被破坏了。。

概述

有限单词类

所有有限单词的基类当前位于sage.combinat.words.finite_word中,称为FiniteWord(有限单词)一些泛型算法是在语言和阶乘语言类别中实现的。具体类别包括

评论

类别的好坏:

我们保留什么?我们创建了哪些类别?我们是否在类别中提供了默认的_element_constructor_(如果是,它与facade高度不兼容)?

在下一个未来,我们应该考虑可变性/不变性。

算法和命名约定

==具有无限输入数据的算法的行为=

如何实现无限单词的相等?

应该做什么

鼠尾草:w1==w2

两种可能性:

  1. 测试前XXX个字母以找出差异。如果find-one返回False,则会引发错误,“似乎等于use.is_equal(force=True)启动无限测试”。
  2. 测试所有字母,如果相等,则不返回True

其他建议?

帕里克氏病媒、评估、变异

姓名阿贝尔化是最通用的。Parikh矢量是单词组合的标准。评价主要用于组合学。

请注意,评估在形式上是一种组合,换句话说,字母表应该是有限的和有序的。

模式匹配

模式匹配算法可以在子类中进行优化。因此,我们应该注意低水平和高水平的作用。

文森特建议对低级例程使用以下约定。由于在不久的将来在C中实现它们是个问题,因此这个问题至关重要:

还有多重匹配的问题,更普遍的是正则表达式的问题。

模式匹配的实际实现使用了Boyer-Moore算法,该算法需要对:last_position_dict,前缀_function_table,good_suffix_table。所有这些预计算都是一个单词的cached_method,可能会占用内存,效率不高,因为以下代码实际上调用了两倍的预计算:

sage:w1=单词('ababaabaaababa',字母='ab')sage:w2=单词('ababaaaa',字母='ab')圣人:w1.find('aa')5圣人:w2.查找('aa')6

文森特建议将所有预计算移动到一个专用于模式匹配的模块中使用缓存,除非用户想对在许多不同的x个在这种情况下,我们应该这样做:

sage:w=单词('ab',字母表='ab')sage:f=查找器(w)sage:f.match(单词('ababababaababbabababbabababa',字母='ab'))...

重复次数和指数

另请参见#

实际姓名

子项目

有限语言与因子集

它的大部分是由Franco(后缀树和后缀trie)实现的。我们希望对其进行增强,并为FiniteFactorial语言。请参阅#12225.

替代语言和adic语言

对于由一系列替换(称为指令词)描述的语言,有许多算法。形态语言和纯形态语言的特殊情况分别对应于周期性和纯周期性指令词。

最终周期性语言/单词

它们将有助于最终定义adic语言的周期性指令词。请参见#12228.

TODO列表

对于#12224:

对于其他门票:

语言和瓷砖(上次编辑:2014-03-19 13:30:06vdelecroix公司)