Является ли SQL или даже TSQL Turing полным?
Это произошло сегодня в офисе. У меня нет планов делать такие вещи, но теоретически вы могли бы написать компилятор в SQL? На первый взгляд это кажется мне полным Тьюрингом, хотя и чрезвычайно громоздким для многих классов проблем.
Если это не Тьюринг полный, что бы это потребовало, чтобы стать так?
Примечание: у меня нет желания делать что-либо вроде написания компилятора в SQL, я знаю, что это было бы глупо, поэтому, если мы сможем избежать этого обсуждения Я был бы вам очень признателен.
5 ответов:
оказывается, что SQL может быть Turing Complete даже без истинного расширения "сценариев", такого как PL/SQL или PSM (которые предназначены для истинных языков программирования, так что это своего рода обман).
на это набор слайдов Эндрю Гирт доказывает, что с CTE и Windowing SQL является Turing полным, построив циклическая система тегов, который, как было доказано, является полным Тьюрингом. Однако функция CTE является важной частью - она позволяет создавать названы подвыражения, которые могут ссылаться на себя и тем самым рекурсивно решать задачи.
интересно отметить, что CTE на самом деле не был добавлен, чтобы превратить SQL в язык программирования-просто чтобы превратить декларативный язык запросов в более мощный декларативный язык запросов. Вроде как в C++, чьи шаблоны оказались полными Тьюринга, хотя они не были предназначены для создания языка мета-программирования.
о, Мандельброт установлен в SQL пример Очень впечатляет, как хорошо :)
http://channel9.msdn.com/forums/TechOff/431432-SQL-Turing-Completeness-question/
обсуждение этой темы. Цитата:
SQL как таковой (т. е. стандарт SQL92) не является полным Тьюрингом. Однако, многие языки, полученные из SQL, такие как PL/SQL Oracle и T-SQL SQL Server и другие-это Turing complete.
PL / SQL и T-SQL, безусловно, квалифицируются как языки программирования, будь то сам SQL92 квалификация открыта для обсуждения. Некоторые люди утверждают, что любой фрагмент кода, который говорит компьютеру, что делать, квалифицируется как язык программирования; по этому определению SQL92 является одним, но так же, например, HTML. Определение довольно расплывчатое,и это ИМО бессмысленно спорить.
TSQL-это Тьюринг Complete.To докажите, что я сделал переводчика BrainFuck.
Brainfuck интерпретатор в SQL-GitHub
-- Brain Fuck interpreter in SQL DECLARE @Code VARCHAR(MAX) = ', [>,] < [.<]' DECLARE @Input VARCHAR(MAX) = '!dlroW olleH'; -- Creates a "BrainFuck" DataBase. -- CREATE DATABASE BrainFuck; -- Creates the Source code table DECLARE @CodeTable TABLE ( [Id] INT IDENTITY(1,1) PRIMARY KEY NOT NULL, [Command] CHAR(1) NOT NULL ); -- Populate the source code into CodeTable DECLARE @CodeLen INT = LEN(@Code); DECLARE @CodePos INT = 0; DECLARE @CodeChar CHAR(1); WHILE @CodePos < @CodeLen BEGIN SET @CodePos = @CodePos + 1; SET @CodeChar = SUBSTRING(@Code, @CodePos, 1); IF @CodeChar IN ('+', '-', '>', '<', ',', '.', '[', ']') INSERT INTO @CodeTable ([Command]) VALUES (@CodeChar) END -- Creates the Input table DECLARE @InputTable TABLE ( [Id] INT IDENTITY(1,1) PRIMARY KEY NOT NULL, [Char] CHAR(1) NOT NULL ); -- Populate the input text into InputTable DECLARE @InputLen INT = LEN(@Input); DECLARE @InputPos INT = 0; WHILE @InputPos < @InputLen BEGIN SET @InputPos = @InputPos + 1; INSERT INTO @InputTable ([Char]) VALUES (SUBSTRING(@Input, @InputPos, 1)) END -- Creates the Output table DECLARE @OutputTable TABLE ( [Id] INT IDENTITY(1,1) PRIMARY KEY NOT NULL, [Char] CHAR(1) NOT NULL ); -- Creates the Buffer table DECLARE @BufferTable TABLE ( [Id] INT IDENTITY(1,1) PRIMARY KEY NOT NULL, [Memory] INT DEFAULT 0 NOT NULL ); INSERT INTO @BufferTable ([Memory]) VALUES (0); -- Initialization of temporary variables DECLARE @CodeLength INT = (SELECT COUNT(*) FROM @CodeTable); DECLARE @CodeIndex INT = 0; DECLARE @Pointer INT = 1; DECLARE @InputIndex INT = 0; DECLARE @Command CHAR(1); DECLARE @Depth INT; -- Main calculation cycle WHILE @CodeIndex < @CodeLength BEGIN -- Read the next command. SET @CodeIndex = @CodeIndex + 1; SET @Command = (SELECT [Command] FROM @CodeTable WHERE [Id] = @CodeIndex); -- Increment the pointer. IF @Command = '>' BEGIN SET @Pointer = @Pointer + 1; IF (SELECT [Id] FROM @BufferTable WHERE [Id] = @Pointer) IS NULL INSERT INTO @BufferTable ([Memory]) VALUES (0); END -- Decrement the pointer. ELSE IF @Command = '<' SET @Pointer = @Pointer - 1; -- Increment the byte at the pointer. ELSE IF @Command = '+' UPDATE @BufferTable SET [Memory] = [Memory] + 1 WHERE [Id] = @Pointer; -- Decrement the byte at the pointer. ELSE IF @Command = '-' UPDATE @BufferTable SET [Memory] = [Memory] - 1 WHERE [Id] = @Pointer; -- Output the byte at the pointer. ELSE IF @Command = '.' INSERT INTO @OutputTable ([Char]) (SELECT CHAR([Memory]) FROM @BufferTable WHERE [Id] = @Pointer); -- Input a byte and store it in the byte at the pointer. ELSE IF @Command = ',' BEGIN SET @InputIndex = @InputIndex + 1; UPDATE @BufferTable SET [Memory] = COALESCE((SELECT ASCII([Char]) FROM @InputTable WHERE [Id] = @InputIndex), 0) WHERE [Id] = @Pointer; END -- Jump forward past the matching ] if the byte at the pointer is zero. ELSE IF @Command = '[' AND COALESCE((SELECT [Memory] FROM @BufferTable WHERE [Id] = @Pointer), 0) = 0 BEGIN SET @Depth = 1; WHILE @Depth > 0 BEGIN SET @CodeIndex = @CodeIndex + 1; SET @Command = (SELECT [Command] FROM @CodeTable WHERE [Id] = @CodeIndex); IF @Command = '[' SET @Depth = @Depth + 1; ELSE IF @Command = ']' SET @Depth = @Depth - 1; END END -- Jump backward to the matching [ unless the byte at the pointer is zero. ELSE IF @Command = ']' AND COALESCE((SELECT [Memory] FROM @BufferTable WHERE [Id] = @Pointer), 0) != 0 BEGIN SET @Depth = 1; WHILE @Depth > 0 BEGIN SET @CodeIndex = @CodeIndex - 1; SET @Command = (SELECT [Command] FROM @CodeTable WHERE [Id] = @CodeIndex); IF @Command = ']' SET @Depth = @Depth + 1; ELSE IF @Command = '[' SET @Depth = @Depth - 1; END END END; -- Collects and prints the output DECLARE @Output VARCHAR(MAX); SELECT @Output = COALESCE(@Output, '') + [Char] FROM @OutputTable; PRINT @Output; Go
строго говоря, SQL теперь является полным языком Тьюринга, потому что последний стандарт SQL включает в себя "постоянные сохраненные модули" (PSMs). Короче говоря, PSM-это стандартная версия языка PL/SQL в Oracle (и других подобных процедурных расширений текущей СУБД).
с включением этих PSMs SQL стал turing complete
оператор ANSI select, как первоначально определено в SQL-86, не является полным turing, потому что он всегда завершается (за исключением рекурсивных CTEs и только если реализация поддерживает произвольно глубокую рекурсию). Поэтому невозможно смоделировать любую другую машину Тьюринга. Хранимые процедуры Тьюринга завершены, но это обман ; -)
Comments