LINQ表达式树是否具备图灵完备性?

11

他们是在.Net 3.5中。我知道它们也在4.0中,因为DLR与之配合使用,但我对我们现在拥有的版本感兴趣。

4个回答

21
在C#3.0规范的早期草案中,在表达式树章节的边距处有一个注释,上面写着:“我有一个真正奇妙的Turing完备性证明,这个边距装不下。”可悲的是,没有人能找出谁写了这句话或开发出这个证明。

3
希望它不会需要358年。*8') - Mark Booth
他们应该使用版本控制和/或维基 :-p - Péter Török

4

如果没有定义执行树的对象,我们就不知道它们是什么。在CLR(公共语言运行库)的解释中(当您将它们编译为委托时),它们是确定的。但是,如果将它们翻译成SQL,它们就不是确定的,您可以使用任何属性来发明自己混淆的解释。

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


2
LINQ表达式树可以表示普通C#表达式中的任何内容。因此,它们不能直接用于表示while循环、for循环等等。
但是,理论上可以使用Lambda表达式和递归来执行您需要的任何迭代。在实践中,将Enumerable方法放入您的树中可能更容易。

LINQ 表达式树不支持递归,所以你唯一的选择似乎是使用装箱和 Y 组合子,这将非常慢(每个函数调用都会分配内存)。 - J D

1

为什么不试着去证明它呢?我敢打赌这会是一个有趣的挑战 ;)

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

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

然而,未经类型化的λ演算是图灵完备的(turing_completeness#Examples),但λ演算本身不允许递归(Lambda_calculus#Recursion),这一切都非常棘手。

我认为表达式可能是图灵完备的,但需要更熟悉此方面的人来确认。


1
你不需要“允许”树使用递归 - 它们已经可以了:http://blogs.msdn.com/madst/archive/2007/05/11/recursive-lambda-expressions.aspx - Marc Gravell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接