Perl regexes图灵完整吗?

时间:2011-11-02 15:40:12

标签: regex perl turing-complete

3 个答案:

答案 0 :(得分:25)

排除任何类型的嵌入代码,例如?{ },它们可能无法涵盖所有​​无上下文,更不用说图灵机了。他们可能,但据我所知,没有人真正以某种方式证明这一点。鉴于人们一直在尝试使用Perl正则表达式来解决某些无上下文的问题并且还没有提出解决方案,因此它们很可能不是无上下文的。

有一个有趣的讨论,关于哪些特征仅仅是方便的,哪些实际上增加了力量。例如,匹配0 n * 1 * 0 n (这是“任意数量的零,后跟一个,后跟与之前相同的零数”的表示法“ )不是纯正的正则表达式可以完成的事情。您可以使用Pumping Lemma证明这不能用正则表达式完成,但简单,非正式的证据是正则表达式必须计算任意数量的零,并且正则表达式不能进行计数。

但是,反向引用可以与以下内容匹配:

/(0*) 1 \1/x;

这意味着反向引用会给你更多力量,而不仅仅是方便。还有什么可以给我们更大的力量,我想知道?

另外,Perl6“模式”(它们甚至不再假装它们是正则表达式)的设计看起来有点像Perl5正则表达式(所以你不需要重新学习很多),但它们有足够的功能添加到完全没有背景。它们实际上是经过精心设计的,因此您可以使用它们来改变在词法范围内解析语言的方式。

答案 1 :(得分:16)

至少有两个讨论:Turing completeness and regular expressionsAre Perl patterns universal?以及进一步的参考。

对于我未经训练的人来说,共识似乎是答案是“不”,但我不确定我是否理解正确。

答案 2 :(得分:6)

对于Perl中的正则表达式,有两种情况:

  1. 使用嵌入式代码:它们当然是Turing-complete。
  2. 没有嵌入代码:它们总是停止,因此它们不是一般的图灵机。
  3. regular language可以接受finite automaton。它的输入必须是有限的字符串。

      

    [...] a   确定性有限自动机(DFA) - 也称为确定性   有限状态机 - 是接受/拒绝的有限状态机   有限的符号串[...]。

    Turing machines同样如此:正式定义甚至没有输入。它必须以有限数量的状态编码。

    Alternative (equivalent) definitions include input, but it must be finite.