【问题标题】:Are LINQ expression trees Turing complete?LINQ 表达式树图灵完备吗?
【发布时间】:2010-09-20 00:08:51
【问题描述】:

就像它们在 .Net 3.5 中一样。我知道它们是 4.0,因为这是 DLR 使用的,但我对我们现在拥有的版本感兴趣。

【问题讨论】:

    标签: .net linq expression-trees dynamic-language-runtime turing-complete


    【解决方案1】:

    LINQ 表达式树可以表示您可以放入普通 C# 表达式中的任何内容。因此,它们不能用于直接表示while 循环、for 循环等。

    但是,理论上可以使用 lambda 表达式和递归来执行您可能需要的任何迭代。在实践中,将 Enumerable 方法放入树中可能更容易。

    【讨论】:

    • LINQ 表达式树不支持递归,因此您唯一的选择似乎是求助于装箱和 y 组合器,这将非常慢(每个函数调用分配一次)。
    【解决方案2】:

    如果不定义将执行树的东西,我们不知道。在 CLR 自己的解释中(当您将它们编译为委托时)它们是。但是如果你将它们翻译成 SQL,它们就不是,你可以用你喜欢的任何属性来创造你自己的令人困惑的解释。

    在您决定如何解释它们之前,它们只是数据结构。

    【讨论】:

      【解决方案3】:

      好吧,你为什么不尝试证明呢?我敢打赌这是一个有趣的挑战;)

      但表达式树仅代表一个表达式,因此您必须定义允许执行的操作,如 Earwicker 所述。

      如果您允许表达式树使用递归,您可以实现重复,即 for 循环等。

      然而,无类型的 lambda 演算是图灵完备的 Turing_completeness#Examples 但 Lambda 演算本身不允许递归 Lambda_calculus#Recursion 这一切都很冒险。

      我会得出结论,表达式可能是图灵完备的,但需要对此更熟悉的人来确认。

      【讨论】:

      【解决方案4】:

      在 C# 3.0 规范的早期草案中,表达式树部分的边缘有一条评论说:

      我有一个非常了不起的图灵完备性证明,这个边距太窄而无法包含。

      遗憾的是,没有人能够找出是谁写的或开发证明。

      【讨论】:

      • 希望它不会占用358 years。 *8')
      • 他们应该使用版本控制和/或 Wiki :-p
      猜你喜欢
      • 2011-12-20
      • 2011-06-17
      • 2014-12-26
      • 2015-08-23
      • 2011-05-22
      • 2017-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多