পলিমারফিক প্রকারের সাথে একটি ফাংশন কেন t forall t: প্রকার, t-> t` পরিচয় ফাংশন হতে হবে?


18

আমি প্রোগ্রামিং ভাষা তত্ত্বে নতুন। আমি কিছু অনলাইন বক্তৃতাগুলি দেখছিলাম যেখানে প্রশিক্ষক দাবি করেছিলেন যে পলিমারফিক ধরণের একটি ফাংশনই forall t: Type, t->tপরিচয়, তবে কেন তা ব্যাখ্যা করলেন না। কেউ আমাকে বোঝাতে পারেন কেন? প্রথম নীতি থেকে দাবি প্রমাণ হতে পারে।


3
আমি ভেবেছিলাম এই প্রশ্নটি অবশ্যই একটি সদৃশ হবে তবে আমি এটি খুঁজে পাচ্ছি না। cs.stackexchange.com/questions/341/… এক ধরণের ফলোআপ। স্ট্যান্ডার্ড রেফারেন্স হ'ল থিওরেমস! ফিল ওয়াডলার দ্বারা।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন' 21

1
এই ধরণের সাথে জেনেরিক ফাংশন তৈরির চেষ্টা করুন যা অন্য কিছু করে। আপনি দেখতে পাবেন যে সেখানে কেউ নেই।
বার্গি

@ বেরগি হ্যাঁ আমি কোনও পাল্টা উদাহরণ খুঁজে পেতে অক্ষম ছিলাম তবে কীভাবে এটি প্রমাণ করতে হবে তা নিশ্চিত ছিলাম না।
অভিষেক

আপনি যখন এটি সন্ধান করার চেষ্টা করেছিলেন তখন আপনার পর্যবেক্ষণগুলি কী ছিল? কেন আপনি কোন প্রচেষ্টা কার্যকর হয়নি?
বার্গি

@ গিলস হয়ত আপনার মনে আছে cs.stackexchange.com/q/19430/14663 ?
বার্গি

উত্তর:


32

প্রথম বিষয় লক্ষণীয় যে এটি অগত্যা সত্য নয়। উদাহরণস্বরূপ, ভাষাটির উপর নির্ভর করে এই ধরণের একটি ফাংশন, পরিচয় ফাংশন হওয়া ছাড়াও: 1) চিরতরে লুপ, ২) কিছু অবস্থা পরিবর্তন করতে পারে, 3) ফিরে আসতে পারে null, 4) একটি ব্যতিক্রম নিক্ষেপ করতে পারে, 5) কিছু আই / ও করতে পারে, )) অন্য কিছু করার জন্য একটি সুতোর কাঁটাচামচ করুন,)) call/ccশানানিগান করুন, ৮) জাভা এর মতো কিছু ব্যবহার করুন Object.hashCode, ৯) প্রকারটি পূর্ণসংখ্যা কিনা তা নির্ধারণ করতে প্রতিবিম্বটি ব্যবহার করুন এবং যদি তা হয় তবে, 10) কল স্ট্যাক বিশ্লেষণ করতে প্রতিবিম্বটি ব্যবহার করুন এবং যে প্রসঙ্গে এটি বলা হয় তার উপর ভিত্তি করে কিছু করুন, 11) সম্ভবত আরও অনেকগুলি জিনিস এবং অবশ্যই উপরের যথেচ্ছ সংমিশ্রণগুলি।

সুতরাং যে সম্পত্তি এটির দিকে নিয়ে যায়, প্যারামিট্রিকটিটি সামগ্রিকভাবে ভাষার একটি সম্পত্তি এবং এর আরও শক্তিশালী এবং দুর্বল প্রকরণ রয়েছে। টাইপ থিওরিতে অধ্যয়ন করা অনেকগুলি ফর্মাল ক্যালকুলির জন্য, উপরের আচরণগুলির মধ্যে কোনওটিই ঘটতে পারে না। উদাহরণস্বরূপ, সিস্টেম এফ / খাঁটি পলিমারফিক ল্যাম্বডা ক্যালকুলাসের জন্য, যেখানে প্যারামিট্রিকটি প্রথম অধ্যয়ন করা হয়েছিল, উপরোক্ত উপরের কোনও আচরণই ঘটতে পারে না। এটা শুধু ব্যতিক্রম চপল রাষ্ট্র, নেই null, call/ccI / O, প্রতিফলন, এবং এটি দৃঢ়ভাবে তাই এটি লুপ চিরকাল পারবনা স্বাভাবিক হচ্ছে। গিলস যেমন একটি মন্তব্যে উল্লেখ করেছেন, নিখরচায় কাগজের উপপাদ্য!ফিল ওয়াডলারের দ্বারা এই বিষয়টির একটি ভাল পরিচয় এবং এর উল্লেখগুলি তত্ত্বের দিকে আরও বিশেষভাবে যুক্তিযুক্ত সম্পর্কের কৌশলতে চলে যাবে। সেই লিঙ্কটি প্যারামিট্রিকটির বিষয়ে ওয়াডলারের আরও কিছু কাগজপত্র তালিকাভুক্ত করে।

যেহেতু প্যারামিট্রিকটি ভাষার একটি সম্পত্তি, এটি প্রমাণ করার জন্য প্রথমে ভাষাটি আনুষ্ঠানিকভাবে উচ্চারণ করতে হবে এবং তারপরে অপেক্ষাকৃত জটিল যুক্তি প্রয়োজন। এই বিশেষ মামলার জন্য অনানুষ্ঠানিক যুক্তি ধরে নেওয়া যে আমরা বহুকোষী ল্যাম্বডা ক্যালকুলাসে রয়েছি তা হ'ল যেহেতু আমরা ইনপুটটিতে tকোনও ক্রিয়াকলাপ পরিচালনা করতে পারি না (যেমন আমরা এটি বৃদ্ধি করতে পারি না কারণ এটি আমরা জানি না একটি সংখ্যা) বা সেই ধরণের মান তৈরি করুন (আমরা সবাই জানি t= Void, এমন কোনও প্রকারের কোনও মূল্য নেই)। ধরণের মান উত্পন্ন করার একমাত্র উপায় tহ'ল আমাদেরকে দেওয়া ফিরিয়ে দেওয়া। অন্য কোনও আচরণ সম্ভব নয়। এটি দেখার একটি উপায় হ'ল শক্তিশালী নরমালাইজেশন ব্যবহার করা এবং দেখানো যে এই ধরণের একমাত্র ফর্মের মেয়াদ রয়েছে।


1
টাইপ সিস্টেম সনাক্ত করতে পারে না এমন অসীম লুপগুলি কীভাবে সিস্টেম এফ এড়িয়ে গেল? এটি সাধারণ ক্ষেত্রে অবিশ্বাস্য হিসাবে শ্রেণীবদ্ধ করা হয়েছে।
জোশুয়া

2
@ জোশুয়া - থামার সমস্যার জন্য স্ট্যান্ডার্ড অসম্ভবতার প্রমাণটি প্রথম জায়গায় একটি অসীম লুপ রয়েছে এই ধারণা দিয়ে শুরু হয়। সুতরাং সিস্টেম এফের অসীম লুপগুলি কেন নেই তা নিয়ে প্রশ্ন করার জন্য এটি বিজ্ঞপ্তিযুক্ত যুক্তি। আরও বিস্তৃতভাবে, সিস্টেম এফ প্রায় টিউরিং সম্পূর্ণ নয়, তাই আমি সন্দেহ করি যে এটি প্রমাণের কোনও অনুমানকে সন্তুষ্ট করে। কোনও কম্পিউটারের পক্ষে এটি প্রমাণ করার পক্ষে এটি খুব সহজেই দুর্বল যে এর সমস্ত প্রোগ্রাম শেষ হয়ে যায় (কোনও পুনরাবৃত্তি হবে না, লুপগুলি নেই, কেবল লুপগুলির জন্য খুব দুর্বল ইত্যাদি)।
জোনাথন কাস্ট

@ জোশুয়া: সাধারণ ক্ষেত্রে এটি অবিশ্বাস্য , যা অনেকগুলি বিশেষ ক্ষেত্রে এটি সমাধান করা থেকে বিরত থাকে না। বিশেষত, প্রতিটি প্রোগ্রাম যেটি একটি টাইপযুক্ত সিস্টেম এফ টার্ম হিসাবে দেখা যায় তা থামানো প্রমাণিত হয়েছে: একটি অভিন্ন প্রমাণ রয়েছে যা এই সমস্ত প্রোগ্রামের জন্য কাজ করে। স্পষ্টতই, এর অর্থ অন্যান্য প্রোগ্রাম রয়েছে, যা সিস্টেম এফ এ টাইপ করা যায় না ...
কোডি

15

দাবির প্রমাণটি বেশ জটিল, তবে আপনি যদি সত্যিই এটি চান তবে আপনি বিষয়টিতে রেনল্ডসের মূল কাগজটি পরীক্ষা করতে পারেন ।

মূল ধারণাটি হ'ল এটি প্যারাম্যাট্রিকલી পলিমর্ফিক ফাংশনগুলির জন্য ধারণ করে, যেখানে পলিমারফিক ফাংশনের বডিটি ফাংশনের সমস্ত মনোমরফিক ইনস্ট্যানটিশনের জন্য একই। এমন সিস্টেমে পলিমারফিক টাইপের কোনও প্যারামিটারের ধরণ সম্পর্কে কোনও অনুমান করা যায় না, এবং যদি সুযোগের একমাত্র মানটির একটি জেনেরিক প্রকার থাকে, তবে এটির সাথে কিছুই করার নয় তবে তা ফেরত পাঠাতে হবে, বা অন্য ক্রিয়াকলাপগুলিতে আপনি এটি প্রেরণ করতে পারবেন না ' সংজ্ঞায়িত, যে পরিবর্তে এটি কিছুই করতে পারে না এটি ফেরত বা পাস .. .. ইত্যাদি। সুতরাং শেষ পর্যন্ত, আপনি যা করতে পারেন তা হ'ল প্যারামিটারটি ফেরানোর আগে কিছু পরিচয় ফাংশন chain


8

ডেরেক যে সমস্ত সাবধানবাণীগুলির উল্লেখ করেছেন এবং সেট তত্ত্ব ব্যবহারের ফলে প্রাপ্ত প্যারাডক্সকে উপেক্ষা করে আমি রেইনল্ডস / ওয়াডলারের আত্মায় একটি প্রমাণ স্কেচ করি।

ধরণের একটি ফাংশন:

f :: forall t . t -> t

ফাংশন একটি পরিবার সূচীবদ্ধ টাইপ দ্বারা টনftt

ধারণাটি হ'ল পলিমারফিক ফাংশনগুলিকে আনুষ্ঠানিকভাবে সংজ্ঞায়িত করার জন্য, আমাদের প্রকারগুলি মানগুলির সেট হিসাবে নয়, বরং সম্পর্কের হিসাবে বিবেচনা করা উচিত। বুনিয়াদি প্রকারের Intসমান সম্পর্ক প্রেরণার মতো - যেমন, দুটি Intমান সমান হয় তবে তা সম্পর্কিত। সম্পর্কিত মানগুলিতে সম্পর্কিত মানগুলি মানচিত্রে যদি কার্যগুলি সম্পর্কিত হয় ctions আকর্ষণীয় কেসটি হল পলিমারফিক ফাংশন। এগুলি সম্পর্কিত মানগুলির সাথে সম্পর্কিত ধরণের মানচিত্র তৈরি করে।

আমাদের ক্ষেত্রে, আমরা দুটি বহুরুপী ফাংশন মধ্যে একটা সম্পর্ক প্রতিষ্ঠা করতে চাই এবং ধরনের:fg

forall t . t -> t

ধরুন যে টাইপ টাইপ সঙ্গে সম্পর্কযুক্ত টি । প্রথম ফাংশন টাইপ মানচিত্র গুলি মান - এখানে, মান নিজেই একটি ফাংশন গুলি ধরনের গুলি গুলিstfsfsss । দ্বিতীয় ফাংশন টাইপ মানচিত্র অন্য মান টি টাইপ টি টি । আমরা যে সঙ্গে সম্পর্কযুক্ত যদি মান গুলি এবং টি সম্পর্কিত হয়। যেহেতু এই মানগুলি নিজস্ব ফাংশন, তারা সম্পর্কিত মানগুলিতে সম্পর্কিত মানগুলি মানচিত্রে এগুলি সম্পর্কিত।tgtttfgfsgt

অত্যন্ত গুরুত্বপূর্ণ পদক্ষেপটি রেনল্ডসের প্যারামিট্রিসিটি উপপাদ্যটি ব্যবহার করা, যা বলে যে কোনও শব্দই নিজের সাথে সম্পর্কযুক্ত। আমাদের ক্ষেত্রে, ফাংশনটি fনিজের সাথে সম্পর্কিত। অন্য কথায়, যদি sসঙ্গে সম্পর্কযুক্ত t, এছাড়াও সঙ্গে সম্পর্কযুক্ত টিfsft

()()t()t((), c)ctf()ftf()()()ftcc()cftidttfid

আপনি আমার ব্লগে আরও বিশদ জানতে পারেন ।


-2

সম্পাদনা: উপরের একটি মন্তব্য অনুপস্থিত অংশটি সরবরাহ করেছে। কিছু লোক ইচ্ছাকৃতভাবে কম-টিউরিং-সম্পূর্ণ ভাষা নিয়ে খেলছেন। আমি স্পষ্টভাবে এই জাতীয় ভাষা সম্পর্কে যত্ন নিই। সত্যিকারের ব্যবহারযোগ্য না-টিউরিং-সম্পূর্ণ ভাষা হ'ল ডিজাইন করা একটি ক্রেজি 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]

সংকলন করা উচিত নয়। মূল সমস্যাটি রানটাইম অ্যারে ইনডেক্সিংটি আর কাজ করে না।


@ বার্গি: আমি একটি পাল্টা নমুনা তৈরি করেছি।
জোশুয়া 21

1
আপনার উত্তর এবং অন্যান্য দুটি মধ্যে পার্থক্য প্রতিফলিত করতে দয়া করে কিছুক্ষণ সময় নিন। ডেরেকের খোলার বাক্যটি হ'ল "লক্ষ্য করার জন্য প্রথম জিনিসটি এটি প্রয়োজনীয় সত্য নয়"। এবং তারপরে তিনি ব্যাখ্যা করেন কোনও ভাষার কী বৈশিষ্ট্য তা সত্য করে তোলে। জমিতে এটি কী সত্য করে তোলে তাও ব্যাখ্যা করে । বিপরীতে, আপনার উত্তরটি শূন্য ব্যাখ্যা সহ একটি অনির্দিষ্ট (এবং অস্বাভাবিক ভাষা) একটি উদাহরণ দেয়। ( foilযাইহোক কোয়ান্টিফায়ার কী ?) এটি মোটেই সহায়ক নয়।
গিলস 'অশুভ হওয়া বন্ধ করুন' 21

1
@ ডাব্লুডাব্লু: যদি এফ হয় তবে এ এর ​​ধরণটি এফ এর ধরণ যা জি টাইপ এবং তাই টাইপচেকটি পাস করা উচিত। যদি কোনও সত্যিকারের সংকলক এটিকে বের করে দেয় তবে আমি রানটাইম কাস্ট ব্যবহার করব যে স্থির টাইপ সিস্টেমটি ভুল হয়ে যায় তার জন্য বাস্তব ভাষাগুলি সর্বদা থাকে এবং এটি রানটাইমে কখনও ব্যর্থ হয় না।
জোশুয়া

2
এটি একটি স্ট্যাটিক টাইপচেকার কীভাবে কাজ করে তা নয়। এটি কোনও একক নির্দিষ্ট ইনপুটটির জন্য প্রকারগুলি মেলে তা পরীক্ষা করে না। নির্দিষ্ট ধরণের বিধি রয়েছে, যা নিশ্চিত করা হয় যে ফাংশনটি সমস্ত সম্ভাব্য ইনপুটগুলিতে টাইপচেক করবে। আপনার যদি টাইপকাস্ট ব্যবহারের প্রয়োজন হয় তবে এই সমাধানটি খুব কম আকর্ষণীয়। অবশ্যই আপনি যদি টাইপ সিস্টেমটিকে বাইপাস করেন তবে কোনও ফাংশনের ধরণের কোনও কিছুর গ্যারান্টি নেই - সেখানে কোনও আশ্চর্যের কিছু নেই!
DW

1
@ ডিডাব্লু: আপনি বিষয়টি মিস করেছেন miss স্ট্যাটিক টাইপ চেকারের পক্ষে কোড প্রকারটি নিরাপদ তা প্রমাণ করার জন্য পর্যাপ্ত তথ্য রয়েছে যদি এটির সন্ধানের বুদ্ধি থাকে।
জোশুয়া
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.