সম্পাদনা: উপরের একটি মন্তব্য অনুপস্থিত অংশটি সরবরাহ করেছে। কিছু লোক ইচ্ছাকৃতভাবে কম-টিউরিং-সম্পূর্ণ ভাষা নিয়ে খেলছেন। আমি স্পষ্টভাবে এই জাতীয় ভাষা সম্পর্কে যত্ন নিই। সত্যিকারের ব্যবহারযোগ্য না-টিউরিং-সম্পূর্ণ ভাষা হ'ল ডিজাইন করা একটি ক্রেজি hard এই সম্পূর্ণরূপে একটি সম্পূর্ণ ভাষায় এই উপপাদাগুলি প্রয়োগ করার চেষ্টা করে যা ঘটে তার প্রসার ঘটে।
মিথ্যা!
function f(a): forall t: Type, t->t
function g(a): forall t: Type, t->t
return (a is g) ? f : a
return a is f ? g : a
যেখানে is
অপারেটর রেফারেন্স পরিচয়ের জন্য দুটি ভেরিয়েবলের তুলনা করে। অর্থাৎ, তাদের একই মান রয়েছে। সমমানের মান নয়, একই মান। ফাংশন f
এবং g
কিছু সংজ্ঞা অনুসারে সমান তবে সেগুলি এক নয়।
যদি এই ফাংশনটি নিজেই পাস হয়ে যায় তবে এটি অন্য কিছু দেয়; অন্যথায় এটি তার ইনপুট ফেরত দেয়। অন্য কোনও কিছুর নিজস্ব ধরণের রয়েছে তাই এটি প্রতিস্থাপন করা যেতে পারে। অন্য কথায়, f
পরিচয়টি নয়, কারণ f(f)
ফিরে আসে g
, যেখানে পরিচয়টি ফিরে আসবে f
।
উপপাদ্যটি ধরে রাখার জন্য এটি হ্রাস করার হাস্যকর ক্ষমতা ধরে নিতে হবে
function cantor(n, <z, a>) : forall t: t: Type int, <int, t> -> <int, t>
return n > 1 ? cantor((n % 2 > 0) ? (n + 1) : n / 2, <z + 1, a>) : <z, a>
return cantor(1000, <0, a>)[1]¹
আপনি যদি ধরে নিতে ইচ্ছুক হন তবে আপনি ধরে নিতে পারেন যে খুব সহজ প্রকারের অনুমানটি পরিচালনা করা যায়।
যদি আমরা উপপাদ্যটি ধরে না ফেলে আমরা ডোমেনকে সীমাবদ্ধ রাখার চেষ্টা করি তবে আমরা এটিকে ভয়াবহভাবে সীমাবদ্ধ করে চলেছি।
- খাঁটি কার্যকরী (কোনও পরিবর্তনযোগ্য রাষ্ট্র নয়, আইও নেই)। ঠিক আছে আমি তার সাথে বাঁচতে পারি। অনেক সময় আমরা ফাংশনগুলিতে প্রমাণ চালাতে চাই।
- খালি স্ট্যান্ডার্ড লাইব্রেরি। Meh।
- না
raise
এবং না exit
। এখন আমরা বাধা পেতে শুরু করছি।
- কোন নীচের প্রকার নেই।
- ভাষার একটি নিয়ম রয়েছে যা সংকলককে অবশ্যই এটি অবসান করতে হবে এমন ধারনা করে অসীম পুনরাবৃত্তি সঙ্কুচিত করতে দেয়। সংকলককে তুচ্ছ অসীম পুনরাবৃত্তি প্রত্যাখ্যান করার অনুমতি দেওয়া হয়।
- কোনওভাবেই প্রমাণিত হতে পারে না এমন কিছু উপস্থাপন করা হলে সংকলকটি ব্যর্থ হওয়ার অনুমতি দেওয়া হয়েছে ² এখন মানক পাঠাগারটি যুক্তি হিসাবে ফাংশন নিতে পারে না। বু।
- নেই
nil
। এটি সমস্যা হতে শুরু করে। 1 / 0.³ এর সাথে ডিল করার উপায়গুলি আমরা অতিক্রম করেছি ³
- ভাষা শাখার ধরণের সূচনা করতে পারে না এবং যখন প্রোগ্রামার ভাষা ক্যান্সারটি প্রকারভেদ প্রমাণ করতে পারে তখন তার ওভাররাইড থাকে না। এটা বেশ খারাপ।
শেষ দুটি বাধা উভয়েরই অস্তিত্ব ভাষাটিকে পঙ্গু করে দিয়েছে। যদিও এটি এখনও টুরিংয়ের সাধারণ উদ্দেশ্য কাজটি সম্পাদনের একমাত্র উপায় সম্পূর্ণরূপে হ'ল একটি অভ্যন্তরীণ প্ল্যাটফর্ম অনুকরণ করে যা কোনও ভাষা আলগা প্রয়োজনীয়তার সাথে ব্যাখ্যা করে।
You আপনি যদি মনে করেন যে সংকলকটি এটিটি হ্রাস করতে পারে তবে এটি ব্যবহার করে দেখুন
function fermat(z) : int -> int
function pow(x, p)
return p = 0 ? 1 : x * pow(x, p - 1)
function f2(x, y, z) : int, int, int -> <int, int>
left = pow(x, 5) + pow(y, 5)
right = pow(z, 5)
return left = right
? <x, y>
: pow(x, 5) < right
? f2(x + 1, y, z)
: pow(y, 5) < right
? f2(2, y + 1, z)
: f2(2, 2, z + 1)
return f2(2, 2, z)
function cantor(n, <z, a>) : forall t: t: Type int, <int, t> -> <int, t>
return n > 1 ? cantor((n % 2 > 0) ? (n + 1) : n / 2, <z + 1, a>) : <z, a>
return cantor(fermat(3)[0], <0, a>)[1]
The সংকলক এটি করতে পারে না তার প্রমাণ অন্ধ করার উপর নির্ভর করে। সংকলক একবারে লুপটি দেখতে না পারে তা নিশ্চিত করতে আমরা একাধিক গ্রন্থাগার ব্যবহার করতে পারি। এছাড়াও, আমরা সবসময় এমন কিছু তৈরি করতে পারি যেখানে প্রোগ্রামটি কাজ করবে তবে সংকলন করা যায়নি কারণ সংকলক উপলব্ধ মেমরিতে আবেশন সম্পাদন করতে পারে না।
³ কেউ কেউ মনে করেন যে সাধারণ জেনেরিক ধরণের রিটার্নিং শিল ছাড়াই আপনি এই রিটার্ন শিল করতে পারবেন। এটি একটি বাজে শাস্তি প্রদান করে যার জন্য আমি কোনও কার্যকর ভাষা দেখেনি যে এটি প্রদান করতে পারে।
function f(a, b, c): t: Type: t[],int,int->t
return a[b/c]
সংকলন করা উচিত নয়। মূল সমস্যাটি রানটাইম অ্যারে ইনডেক্সিংটি আর কাজ করে না।