【问题标题】:Are Perl regexes turing complete?Perl 正则表达式图灵完备吗?
【发布时间】:2011-12-20 10:51:34
【问题描述】:

我见过 Ruby 和 Perl 程序员完全使用正则表达式来完成一些complicated code challenges。 Perl 正则表达式中的lookahead and lookbehind 功能使其比大多数其他语言中的正则表达式实现更强大。我想知道它们到底有多强大。

有没有一种简单的方法可以证明或反驳 Perl 正则表达式是 Turing complete

【问题讨论】:

  • 对于那些投票以离题结束的人:thesequestionsalso离题了吗?
  • @PeterOlson:是的,但是在没有programmers.se之前他们就被问到了
  • @daxim - 这里有什么规则?您可以轻松地为规则 110 编写模式(例如,以 '010' 和模式 s/(?:|(?<=0)(0)(?=0)|(?<=0)0(?=(1))|...|(?<=1)1(?=1)(?=1*(0))|^(?=(0))|(?<=(0))$)/$1/g 开头 - 我猜它需要更多思考),但我认为您需要在循环中使用它才能成为任何采用。这是合法的吗?也许你有你所追求的程序的模板?
  • @Kobi 如果图灵完备,它就是合法的。我不太了解第 110 条规则,所以我不知道这是否有效。

标签: regex perl turing-complete


【解决方案1】:

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

  1. 带有嵌入式代码:它们当然是图灵完备的。
  2. 没有嵌入代码:它们总是停止,因此它们不是通用的图灵机。

每个regular language 都可以被finite automaton 接受。它的输入必须是一个有限的字符串。

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

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

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

【讨论】:

  • 他们是否总是在任意输入时停止?例如,它们不会总是停在无限长的字符串上。
  • @MilesRout 我不认为无限输入是允许的或有意义的。几乎没有什么会因无限输入而停止。即使(ab)* 也不会停止,因为将来总会有c。教科书的答案是常规语言显然不是图灵完备的。我认为无限输入不是定义的一部分。
  • (ab)*abcabcabcabcabcabc... 等无限输入时停止
  • 是的,不好的例子。 a*b 不会因输入 aaaaa... 而停止。无论如何,我不认为无限输入是允许的或有意义的。这将使许多重要且明显真实的结果无效。
  • @WilliamShipley 无限磁带并不意味着无限输入。再次注意,如果您向其提供无限输入,Chomsky 层次结构的 any 机器不会停止。因此,不可能提供无限的输入来使现有定义起作用。
【解决方案2】:

不包括任何类型的嵌入式代码,例如?{ },它们可能并未涵盖所有上下文无关代码,更不用说图灵机了。他们可能会,但据我所知,实际上没有人以一种或另一种方式证明这一点。鉴于人们一直在尝试使用 Perl 正则表达式解决某些与上下文无关的问题,但尚未提出解决方案,它们很可能不是上下文无关的。

关于哪些功能只是方便,哪些功能实际上增加了功能,有一个有趣的讨论。例如,匹配 0n*1*0n (这是“任意数量的零,后跟一个,后跟与之前相同数量的零”的符号) 不是纯正则表达式可以做到的。您可以使用 Pumping Lemma 证明使用正则表达式无法做到这一点,但简单、非正式的证明是正则表达式必须计算任意数量的零,而正则表达式不能进行计数。

但是,反向引用可以匹配:

/(0*) 1 \1/x;

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

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

【讨论】:

【解决方案3】:

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

共识(在我未经训练的眼中)似乎是答案是否定的,但我不确定我是否正确理解了所有内容。

【讨论】:

    猜你喜欢
    • 2011-06-17
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    • 2014-12-26
    相关资源
    最近更新 更多