কোনও কার্য শুদ্ধ হলে গণনা করুন


11

উইকিপিডিয়া অনুসারে:

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

আমি ভাবছি যদি কোনও ফাংশন খাঁটি বা না হয় এমন কোনও ফাংশন লিখতে সম্ভব হয় তবে তা গুনতে হবে। জাভাস্ক্রিপ্টে কোডের উদাহরণ:

function sum(a,b) {
    return a+b;
}

function say(x){
    console.log(x);
}

isPure(sum) // True
isPure(say) // False

7
এটি কম্পিউটার সায়েন্স স্ট্যাক এক্সচেঞ্জের প্রার্থী হতে পারে । এটি ব্যবহারিক এবং নকশার চেয়ে তত্ত্বের ("সম্ভাব্য") রাজ্যে বেশি ঝোঁক ... এটি আমার কেনের বাইরে কিছুটা।

... এবং যদিও এটি "সম্ভাব্য" এবং "তত্ত্ব" খুব সম্ভবত এটির একটি আসল উত্তর (প্রশ্নোত্তর জন্য একটি ভাল ফিট) রয়েছে যা এমনকি একটি প্রমাণ জড়িত থাকতে পারে ... যা আবার কম্পিউটার বিজ্ঞানের জগতে ফিরিয়ে নিয়ে যায় ।

আমি মনে করি যে কোনও ফাংশন এর সংজ্ঞা অনুসারে ব্যবহৃত ফাংশনগুলির প্রকারটি দেখে আপনি নির্ধারণ করতে পারেন। আমি বলতে চাইছি, আপনি কার্যগুলির কাঠামোর উপর অন্তর্ভুক্তির মাধ্যমে বিশুদ্ধতা সংজ্ঞা দিতে পারেন can
জর্জিও

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

1
@ user470365 খাঁটি ফাংশনটির সংজ্ঞা থেকে - "ফলাফলের মূল্যায়ন কোনও শব্দার্থগতভাবে পর্যবেক্ষণযোগ্য পার্শ্ব প্রতিক্রিয়া বা আউটপুটকে যেমন I / O ডিভাইসগুলিতে রূপান্তরকারী অবজেক্টের আউটপুট বা আউটপুট সৃষ্টি করে না" " - আইও-র কাছে যে কোনও কিছু লিখলে তা সংজ্ঞা দ্বারা অশুচি। উদাহরণস্বরূপ, sayকলগুলি console.logযা এইভাবে sayঅপরিষ্কার তাও অশুদ্ধ।

উত্তর:


17

হ্যাঁ, ভাষার উপর নির্ভর করে এটি সম্ভব।

জাভাস্ক্রিপ্টে, আপনি বলতে পারেন যে কোনও ক্রিয়া নিম্নলিখিত মানদণ্ডের দ্বারা বিশুদ্ধ কিনা:

  • এটি কেবল পরামিতি এবং স্থানীয়দের পড়তে পারে;

  • এটি কেবল স্থানীয় লেখেন;

  • অ-স্থানীয়দের ক্ষেত্রে, এটি কেবল খাঁটি ফাংশন বলে;

  • এটি যে সমস্ত ফাংশনকে স্পষ্টভাবে কল করে তা খাঁটি, যেমন toString,; এবং

  • এটি কেবল স্থানীয়দের সম্পত্তি লিখলে তারা স্থানীয় লোকদের নাম না রাখে।

সাধারণ ক্ষেত্রে জাভাস্ক্রিপ্টে এলিয়াসিং নির্ধারণ করা সম্ভব নয়, কারণ আপনি সর্বদা কোনও বস্তুর বৈশিষ্ট্য পরিবর্তনশীল ( object["property"]) হিসাবে দেখতে পারেন। আপনি যদি এটি কখনও না করেন তবে আপনি পুরো প্রোগ্রামটির উত্স পেয়ে থাকেন তবে আমি মনে করি সমস্যাটি ট্র্যাকটেবল। কোন নেটিভ ফাংশনগুলির পার্শ্ব-প্রতিক্রিয়া console.logরয়েছে সে সম্পর্কে আপনারও তথ্য প্রয়োজন হবে যেমন ডমকে জড়িত বা সর্বাধিক কিছু।

"খাঁটি" শব্দটিও কিছু স্পষ্টতা ব্যবহার করতে পারে। এমনকি দৃ a়, স্থিতিশীল টাইপযুক্ত, খাঁটি কার্যকরী প্রোগ্রামিং ভাষায়, যেখানে সমস্ত ফাংশন উল্লেখযোগ্যভাবে স্বচ্ছ, কোনও ফাংশন এখনও বন্ধ করতে ব্যর্থ হতে পারে। সুতরাং আমরা যখন কথা বলি তখন আমরা যা বলি id :: a -> aতা হ'ল না:

টাইপের কিছু মান দেওয়া a, ফাংশন idটাইপের একটি মান তৈরি করে a

বরং:

টাইপ কিছু মান দেওয়া হয়েছে a, ফাংশন idনেই না একটি মান যা উত্পাদন না ধরনের a

কারণ একটি বৈধ বাস্তবায়ন idহয় error "Not implemented!"। পিটারিস যেমন উল্লেখ করেছেন, এই নটোগুলিটি এক ধরণের অপরিষ্কারতা হিসাবে দেখা যেতে পারে। কোকা একটি কার্যকরী প্রোগ্রামিং ল্যাঙ্গুয়েজ - জাভাস্ক্রিপ্টে তৈরি সিনট্যাক্স সহ — যা ডাইভারজেন্স (অবিচ্ছিন্নতা), রেফারেনশিয়াল স্বচ্ছতা, ব্যতিক্রম ছোঁড়া এবং I / O ক্রিয়াকলাপের মতো সম্ভাব্য প্রভাবগুলি নির্ধারণ করতে পারে।


+1 - পিটারিসের জবাব দেওয়া এতগুলি উপার্জন পেয়েছে .....
ম্যাট্নজ

আমি মনে করি আপনাকে "এটি কেবল খাঁটি ফাংশন বলে" মাপদণ্ডের তালিকায় যুক্ত করা দরকার।
গ্রেগ হিউগিল

1
@ গ্রেগ হিউগিল: ভাল ক্যাচ আমি সেই অনুযায়ী উত্তর আপডেট করেছি। এটা তোলে ঠিক আছে কল mutating স্থানীয়দের উপর ফাংশন, দীর্ঘ হিসাবে হিসাবে তারা অন্যভাবে পার্শ্ব-effectful নন। "খাঁটি" শব্দটি খুব বেশি বোঝা হয়ে যায়…
জন পুরদি

আপনি toStringস্ট্রিং হিসাবে ব্যবহার করেন এমন কোনও বস্তুর জন্য খাঁটি কিনা তাও আপনাকে পরীক্ষা করতে হবে।
ওলেগ ভি। ভলকভ

আমি এই উত্তরটি সঠিক বলে মনে করি না, কারণ সেখানে পরিস্থিতিতে কেবলমাত্র একটি উপসেট রয়েছে যেখানে আপনি প্রকৃতপক্ষে এই নির্ধারণগুলি করতে পারেন। বিবেচনা করুন: এই ফাংশন শুদ্ধ? function a (o) { return o.method(); }- আমরা আসলে এটির উত্তর দিতে পারি না, কারণ এটি কী পরামিতিটি oপাস হবে তার উপর নির্ভর করে । এছাড়াও, যদি পূর্ব-প্রত্যয়িত-খাঁটি ফাংশনটি অ-খাঁটি বাস্তবায়নে পরিবর্তিত হয় তবে আমরা কী হতে পারি তার জবাবদিহি করতে পারি না, যা সর্বদা জাভাস্ক্রিপ্ট সহ একটি সম্ভাব্য সমস্যা।
জুলস

11

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

এই ফাংশনটি বিবেচনা করুন:

function possiblyPure(x) {
    if (someCheck(x)) {
        return x+1; // pure code path
    }
    else {
        console.log("I'm so unpure..."); // unpure code path
    }
}

স্পষ্টতই, যদি someCheckঅপরিষ্কার হয়, তাই হয় possiblyPure। কিন্তু, যদি someCheckপবিত্র এবং আয় trueপ্রতি সম্ভব মানের জন্য x, possiblyPureবিশুদ্ধ, কারণ unpure কোড পাথ পাওয়া যাচ্ছে না!

এবং এখানে কঠোর অংশটি আসে: someCheckপ্রতিটি সম্ভাব্য ইনপুটটির জন্য সত্য ফিরে আসে কি না তা নির্ধারণ করে। এই প্রশ্নের তাত্ক্ষণিকভাবে উত্তর দেওয়ার চেষ্টা করা আপনাকে থামানো সমস্যা এবং অনুরূপ অনির্বচনীয় সমস্যার ক্ষেত্রের দিকে নিয়ে যায়।

সম্পাদনা: প্রমাণ যে এটি অসম্ভব

এখানে কিছু অনিশ্চয়তা আছে বা না খাঁটি ফাংশনটি প্রতিটি সম্ভাব্য ইনপুটটিতে অবশ্যই শেষ করতে হবে। তবে উভয় ক্ষেত্রেই, থামার সমস্যাটি খাঁটিতা যাচাই করা অসম্ভব তা দেখাতে ব্যবহার করা যেতে পারে।

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

কেস বি) খাঁটি ফাংশনটি যদি কিছু ইনপুটগুলিতে শেষ না করার অনুমতি দেয় তবে আমরা এর মতো কিছু তৈরি করতে পারি: আসুন ধরে নেওয়া যাক যে খাঁটি ফাংশন সংজ্ঞায়িত স্ট্রিং isPure(f)যদি গণনাগুলি fকরে।

function halts(f) {
   var fescaped = f.replace(/\"/g, '\\"');
   var upf = 'function() { '+f+'("'+fescaped+'\); console.log("unpure"); }';
   return isPure(upf);
}

ইনপুট হিসাবে এটি তার নিজস্ব উত্সে থামবে isPureকি না তা এখন নির্ধারণ করতে fহবে। যদি এটি বন্ধ হয়ে যায় তবে তা upfঅপরিষ্কার; যদি এটি শেষ হয় না, upfখাঁটি iff fখাঁটি।

যদি isPureপ্রত্যাশিত হিসাবে কাজ করা হয় (প্রতিটি ফলাফলের সঠিক ফলাফল দেয় এবং শেষ হয়), তবে আমরা থামানো সমস্যাটি সমাধান করতে পারতাম (*)! যেহেতু এটি অসম্ভব হিসাবে পরিচিত, isPureঅস্তিত্ব থাকতে পারে না।

(*) খাঁটি জাভাস্ক্রিপ্ট ফাংশনগুলির জন্য, যা ট্যুরিং মেশিনের জন্য এটি সমাধান করার জন্যও যথেষ্ট।


3
সত্য। রক্ষণশীল বিশ্লেষণ করা সর্বদা সম্ভব - কোনও ফাংশন অবশ্যই খাঁটি কিনা তা যাচাই করার জন্য, তবে এটি অবশ্যই খাঁটি নয় কিনা তা যাচাই করা সম্ভব নয়।
এসকে-যুক্তি

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

1

এই স্ট্যাকওভারফ্লো প্রশ্নের yfeldblum এর উত্তর রয়েছে যা এখানে প্রাসঙ্গিক। (এবং এই কারণে একটি ডাউনওয়েট রয়েছে যার কারণ আমি জানতে পারি না 3 3 বছরের পুরানো কোনও বিষয়কে উত্সাহ দেওয়া কি খারাপ শিষ্টাচার হবে?) তিনি একটি প্রমাণ দিয়েছিলেন যে কোনও ফাংশন খাঁটি কিনা একটি মন্তব্যে থামানো সমস্যার ক্ষেত্রে হ্রাসযোগ্য।

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

সুতরাং, তাত্ত্বিকভাবে অসম্ভব, ব্যবহারিকভাবে সম্ভব যদি আপনি প্রশ্নটি কিছুটা টুইট করেন এবং আমি মনে করি এটি কতটা কঠিন হবে ভাষার উপর নির্ভর করবে। অপরিবর্তনীয়তা এবং ভাল প্রতিফলনের উপর ফোকাস সহ সহজ / ক্লিনার ভাষাগুলি আরও সহজ।


আমি মনে করি, এটি ভুল ছিল কারণ এটি ডাউনভোটেড ছিল। bottomএটি একটি বৈধ, প্রথম শ্রেণীর মান, এটি এইভাবে বৈষম্যের যোগ্য নয়।
এসকে-যুক্তি

0

দুর্দান্ত প্রশ্ন।

কার্যত যতবার সম্ভব তার কার্যকারিতা কল করার জন্য i / o ক্রিয়া শোনার কোনও ক্ষমতা ধরে নিলে আপনি সর্বোত্তম ব্যবহার করতে পারেন। তারপরে দেখুন রিটার্নের মানটি সামঞ্জস্যপূর্ণ কিনা।

তবে আপনি সাধারণভাবে এটি করতে পারবেন না। তর্কযুক্তভাবে, অ-থামানো প্রোগ্রামগুলি খাঁটি নয় এবং আমরা থামার সমস্যাটি সিদ্ধান্ত নিতে পারি না।


1
-১: এই পরীক্ষায় পাস করা এবং খাঁটি ব্যতীত এমন কোনও ফাংশন লিখলে এটি তুচ্ছতার বাইরে হবে।
mattnz

3
এই যুক্তি দ্বারা, কোনও voidফাংশন "খাঁটি" হবে, যা স্পষ্টতই মিথ্যা।
গ্রেগ হিউগিল

1
@ গ্রেগ: এক্সটেনশনের মাধ্যমে, শূন্য ফু (শূন্য )ও খাঁটি হতে হবে।
mattnz

0

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


5
চিরকালের জন্য চালানো কোনও খাঁটি ফাংশনের জন্য তার মানদণ্ড ফিট করে কোনও ফাংশন ছাড় বলে মনে হয় না।
4:53

+1: একটি অন্তর্নিহিত আবশ্যক আছে যে ফান্টটিউনটি "ফাংশনটি সর্বদা একই ফলাফলের মানটি মূল্যায়ন করে ...." দ্বারা অবসান করে
ম্যাটনজ

2
কোনও রাষ্ট্র পরিবর্তন না করে ধারাবাহিকভাবে চিরকালের জন্য চলমান পুরোপুরি "খাঁটি"। তবে অবশ্যই এটি এখানে একটি পরিভাষা সম্পর্কিত বিষয়।
এসকে-যুক্তি

@ ম্যাটনজ, এই জাতীয় ফাংশন সর্বদা bottomমানটির মূল্যায়ন করবে ।
এসকে-যুক্তি

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