এসকিউএল বা এমনকি টিএসকিউএল টুরিং সম্পূর্ণ?


171

এটি আজ অফিসে এসেছিল। আমার এ জাতীয় কোনও কাজ করার কোনও পরিকল্পনা নেই তবে তাত্ত্বিকভাবে আপনি কি এসকিউএল একটি সংকলক লিখতে পারেন? প্রথম নজরে এটি আমার কাছে সম্পূর্ণরূপে ট্যুরিং মনে হয়েছে, যদিও অনেক শ্রেণীর সমস্যার জন্য এটি অত্যন্ত জটিল।

এটি সম্পূর্ণ টিউরিং না হলে, এটি কী হওয়ার দরকার পড়বে?

দ্রষ্টব্য: এসকিউএল-তে একটি সংকলক লেখার মতো কিছু করার আমার ইচ্ছা নেই, আমি জানি এটি করা একটি নির্বোধ কাজ হবে, তাই আমরা যদি সেই আলোচনা এড়াতে পারি তবে আমি এটির প্রশংসা করব।

উত্তর:


219

দেখা গেছে যে পিএল / এসকিউএল বা পিএসএমের মতো সত্য 'স্ক্রিপ্টিং' এক্সটেনশন ছাড়াই এসকিউএল টিউরিং সম্পূর্ণ হতে পারে (যা সত্য প্রোগ্রামিং ভাষা হিসাবে ডিজাইন করা হয়েছে, সুতরাং এটি প্রতারণামূলক প্রতারণা)।

ইন স্লাইডের এই সেট অ্যান্ড্রু Gierth প্রমাণ যে সঙ্গে কোটে এবং Windowing এসকিউএল সম্পূর্ণ টুরিং একটি নির্মাণের দ্বারা, আবর্তনশীল ট্যাগ সিস্টেম , যা সম্পূর্ণ টুরিং করা প্রমাণিত হয়েছে। তবে সিটিই বৈশিষ্ট্যটি হ'ল গুরুত্বপূর্ণ অংশ - এটি আপনাকে নামযুক্ত উপ-এক্সপ্রেশন তৈরি করতে দেয় যা নিজেরাই উল্লেখ করতে পারে এবং এর ফলে পুনরাবৃত্তিমূলক সমস্যার সমাধান করতে পারে।

মজার আকর্ষণীয় বিষয়টি হ'ল এসটিউএলকে একটি প্রোগ্রামিং ভাষায় পরিণত করার জন্য সিটিই আসলেই যুক্ত হয় নি - কেবল একটি ঘোষণামূলক অনুসন্ধানী ভাষাটিকে আরও শক্তিশালী ঘোষণামূলক অনুসন্ধানী ভাষাতে পরিণত করার জন্য TE সি ++ এর মতো বাছাই করুন, যার টেমপ্লেটগুলি মেটা প্রোগ্রামিং ল্যাঙ্গুয়েজ তৈরির উদ্দেশ্যে নয় এমনকী টুরিং সম্পূর্ণ হয়ে গেছে।

ওহ, এসকিউএল উদাহরণে ম্যান্ডেলব্রোট সেটটি খুব চিত্তাকর্ষক, :)


1
ওরাকল এসকিউএল সম্পূর্ণ অসুস্থতার সাথেও সম্পূর্ণ নিরাময় করছে
জেনস

2
> দেখা যাচ্ছে যে এসকিউএল এটি বলা উচিত নয়: এটি প্রমাণ করে যে এসকিউএল: 1999? কেবল এটি বলার কারণ সিটিইগুলি 99 সংস্করণে যুক্ত করা হয়েছিল এবং অনেক লোক স্ট্যান্ডার্ড স্কেলকে 92 এর সাথে সংযুক্ত করে 92 92.
আর্নেস্তো

1
@ জেনস শ্যাডার যাকে "ওরাকল $ প্রযুক্তি হিসাবে সাধারণকরণ করা যায় - তা কিছুটা অসুস্থ উপায়ে যদিও"
রব গ্রান্ট


33

প্রদত্ত একটি প্রোগ্রামিং ল্যাঙ্গুয়েজকে বলা হয় ট্যুরিং-সম্পূর্ণ, যদি এটি দেখানো যেতে পারে যে এটি কম্পিউটারে ট্যুরিং মেশিনের সমতুল্য।

টিএসকিউএল টিউরিং সম্পূর্ণ, কারণ আমরা টিএসকিউএলে একটি ব্রেইনফাক ইন্টারপ্রেটার তৈরি করতে পারি।

এসকিউএল - গিটহাবের ব্রেইনফাক দোভাষী

প্রদত্ত কোড মেমোরিতে কাজ করে এবং কোনও ডাটাবেস পরিবর্তন করে না।

-- 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 backwards 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

এটি এসকিউএল লেনদেন যা টুরিং সম্পূর্ণ, আমি যে এএনএসআই এসকিউএল বুঝলাম তা টিসি নয়। তবে ভালো চেষ্টা!
অ্যালিম্যাক

28

https://web.archive.org/web/20110807062050/http://channel9.msdn.com/forums/TechOff/431432-SQL-Turing-Completeness-question

এই বিষয়টির একটি আলোচনা। একটি উদ্ধৃতি:

এসকিউএল যেমন (SQL92 স্ট্যান্ডার্ড) টিউরিং সম্পূর্ণ হয় না complete তবে এসকিউএল থেকে প্রাপ্ত অনেকগুলি ভাষা যেমন ওরাকল এর পিএল / এসকিউএল এবং এসকিউএল সার্ভারের টি-এসকিউএল এবং অন্যান্য সম্পূর্ণরূপে ট্যুরিং সম্পূর্ণ।

পিএল / এসকিউএল এবং টি এসকিউএল অবশ্যই প্রোগ্রামিং ভাষা হিসাবে যোগ্যতা অর্জন করবে, এসকিউএল ৯২ নিজেই যোগ্যতা অর্জন করবে কিনা তা বিতর্কের জন্য উন্মুক্ত। কিছু লোক দাবি করে যে কোনও কোডের যে কোনও কম্পিউটার যা করতে হবে তা প্রোগ্রামিং ভাষা হিসাবে যোগ্যতা অর্জন করে; সেই সংজ্ঞা অনুসারে এসকিউএল 92 এক, তবে যেমন এইচটিএমএল। সংজ্ঞাটি বরং অস্পষ্ট এবং এটি নিয়ে তর্ক করার মতো অর্থহীন বিষয় o


15

কড়া কথায় বলতে গেলে এসকিউএল এখন একটি টুরিং সম্পূর্ণ ভাষা কারণ সর্বশেষতম এসকিউএল স্ট্যান্ডার্ডটিতে "পার্সেন্টিভ স্টোরেড মডিউল" (পিএসএম) অন্তর্ভুক্ত রয়েছে। সংক্ষেপে, একটি পিএসএম হ'ল ওরাকলে পিএল / এসকিউএল ভাষার মানক সংস্করণ (এবং বর্তমান ডিবিএমএসের অন্যান্য অনুরূপ পদ্ধতিগত এক্সটেনশন)।

এই পিএসএমগুলির অন্তর্ভুক্তির সাথে সাথে এসকিউএল সম্পূর্ণ ট্যুরিজিং হয়ে ওঠে


13

মূলত এসকিউএল-86 in এ সংজ্ঞায়িত একটি এএনএসআই নির্বাচন বিবরণ সম্পূর্ণরূপে টানছে না কারণ এটি সর্বদা সমাপ্ত হয় (পুনরাবৃত্ত সিটিই ব্যতীত এবং কেবলমাত্র বাস্তবায়ন যদি ইচ্ছামত গভীর পুনরাবৃত্তি সমর্থন করে)। সুতরাং অন্য কোনও টিউরিং মেশিন অনুকরণ করা সম্ভব নয়। সঞ্চিত পদ্ধতি সম্পূর্ণ টিউরিং করছে তবে প্রতারণা করছে ;-)


1

ওরাকল এর পিএলএসকিউএল এবং মাইক্রোসফ্টের টিএসকিউএল দু'জনেই টুরিং সম্পূর্ণ। ওরাকলের সিলেক্ট স্টেটমেন্ট নিজেই সম্পূর্ণ ট্যুরিং।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.