Полны ли деревья выражений LINQ?

Как они находятся в .Net 3.5. Я знаю, что они в 4.0, как и то, с чем работает DLR, но меня интересует версия, которую мы имеем сейчас.

Ответ 1

В раннем проекте спецификации С# 3.0 на полях раздела на деревьях выражений было указано:

У меня есть поистине чудесное доказательство полноты Тьюринга, которая эта граница слишком узкая, чтобы содержать.

К сожалению, никто не смог узнать, кто его написал или разработать доказательство.

Ответ 2

Без определения вещи, которая будет выполнять дерево, мы не знаем. В собственной интерпретации CLR (когда вы их компилируете в делегаты). Но если вы переводите их в SQL, это не так, и вы можете придумать свою собственную путаную интерпретацию их с любыми свойствами, которые вам нравятся.

Пока вы не решили, как их интерпретировать, это всего лишь структуры данных.

Ответ 3

Деревья выражений LINQ могут представлять все, что вы можете поместить в обычное выражение С#. Таким образом, они не могут использоваться для прямого представления циклов while, циклов for и т.д.

Однако теоретически возможно использовать лямбда-выражения и рекурсию для выполнения любой итерации, в которой вам может понадобиться. На практике может быть проще отказаться от методов Enumerable в вашем дереве.

Ответ 4

Хорошо, почему вы не пытаетесь это доказать? Уверен, это забавная задача;)

Но деревья выражений представляют только выражение, и поэтому вам нужно будет определить, что вам разрешено делать, как указано в Earwicker.

Если вы разрешаете деревьям выражений использовать рекурсию, вы можете добиться повторения, т.е. для циклов и т.д.

Тем не менее, нетипизированное лямбда-исчисление является полным Тьюрингом. Turing_completeness # Примеры, но исчисление лямбда не позволяет рекурсии как таковой. Lambda_calculus # Рекурсия все это очень рискованно.

Я бы сделал вывод, что выражение, вероятно, завершено, но для этого потребуется кто-то, кто знаком с этим.