প্রমাণ যে মৃত কোড সংকলক দ্বারা সনাক্ত করা যায় না


32

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

public class DeadCode {
  public static void main(String[] args) {
     return;
     System.out.println("This line won't print.");
  }
}

উপরের প্রোগ্রামটিতে, এটি স্পষ্টত যে মুদ্রণ বিবৃতিটি কখনই কার্যকর করে না return। সংকলকরা কখনও কখনও ডেড কোড সম্পর্কে সতর্কতা বা ত্রুটি দেয়। উদাহরণস্বরূপ, উপরের কোডটি জাভাতে সংকলন করবে না। জাভাক সংকলক, তবে প্রতিটি প্রোগ্রামে ডেড কোডের সমস্ত উদাহরণ সনাক্ত করতে পারে না। আমি কীভাবে প্রমাণ করব যে কোনও সংকলক তা করতে পারে না?


29
আপনার পটভূমি কী এবং আপনি যে প্রসঙ্গে পাঠদান করবেন তা কী? খালি বলতে গেলে, আমি হালকাভাবে চিন্তিত যে আপনাকে এটি জিজ্ঞাসা করতে হবে, আপনি যেমন পড়িয়ে যাচ্ছেন তা দেখে। ভাল কল এখানে জিজ্ঞাসা!
রাফায়েল


9
@ মাইকেলKjörling এই বিবেচনা ছাড়াই ডেড কোড সনাক্তকরণ অসম্ভব।
ডেভিড রিচার্বি

2
BigInteger i = 0; while(isCollatzConjectureTrueFor(i)) i++; printf("Hello world\n");
ব্যবহারকারী 253751

2
@ ইমিবিস প্রশ্নটি মৃত কোড সনাক্তকরণ অসম্ভব এমন একটি প্রমাণ চেয়েছে । আপনি একটি উদাহরণ দিয়েছেন যেখানে সঠিক ডেড কোড সনাক্তকরণের জন্য গণিতে একটি উন্মুক্ত সমস্যা সমাধান করা দরকার। এটি প্রমাণ করে না যে মৃত কোড সনাক্তকরণ অসম্ভব
ডেভিড রিচার্বি

উত্তর:


57

এটি সমস্তটি থামিয়ে দেওয়া সমস্যার অনিশ্চয়তা থেকে আসে। মনে করুন আমাদের কাছে একটি "নিখুঁত" ডেড কোড ফাংশন, কিছু ট্যুরিং মেশিন এম, এবং কিছু ইনপুট স্ট্রিং এক্স এবং এমন একটি পদ্ধতি যা দেখতে দেখতে কিছুটা এমন দেখায়:

Run M on input x;
print "Finished running input";

এম যদি চিরকালের জন্য চালায় তবে আমরা মুদ্রণ বিবৃতি মুছব, যেহেতু আমরা এটিতে পৌঁছাতে পারি না। এম যদি চিরকালের জন্য না চালায় তবে আমাদের মুদ্রণ বিবৃতি রাখতে হবে। সুতরাং, যদি আমাদের একটি ডেড-কোড রিমুভার থাকে, তবে এটি আমাদের হ্যালটিং সমস্যা সমাধান করতে দেয়, তাই আমরা জানি যে এই জাতীয় কোনও ডেড-কোড রিমুভার হতে পারে না।

আমরা এর আশেপাশে যাবার উপায় হ'ল "রক্ষণশীল আনুমানিকতা"। সুতরাং, উপরে আমার ট্যুরিং মেশিনের উদাহরণে আমরা ধরে নিতে পারি যে এম তে এম চালানো শেষ হতে পারে, তাই আমরা এটি নিরাপদে খেলি এবং মুদ্রণ বিবৃতিটি সরিয়ে নেই। আপনার উদাহরণস্বরূপ, আমরা জানি যে কোনও কাজ যা করুক বা থামবে না, আমরা মুদ্রণ বিবৃতিতে পৌঁছানোর কোনও উপায় নেই।

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

মন্তব্যগুলি থেকে কয়েকটি বিভ্রান্তি স্পষ্ট করতে:

  1. নিতপিক: স্থির এম এর জন্য এটি সর্বদা নির্ধারিত। এম ইনপুট হতে হবে

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

  2. বিশ্বাসী না কোনও নো-ব্রাঞ্চে একটি ভোঁতা স্টেটমেন্ট হিসাবে প্রত্যাবর্তন করা সরাসরি ফায়ার এক্সিকিউশন সিদ্ধান্ত নেওয়া কঠিন নয়। (এবং আমার সংকলক আমাকে বলছে এটি এটি নির্ণয় করতে সক্ষম)

    Njzk2 ইস্যুটি উত্থাপনের জন্য: আপনি একেবারে সঠিক, এই ক্ষেত্রে আপনি নির্ধারণ করতে পারবেন যে ফিরে যাওয়ার পরে কোনও বিবৃতি পাওয়া যায় না। এর কারণ এটি যথেষ্ট সহজ যে আমরা নিয়ন্ত্রণ-প্রবাহ গ্রাফের সীমাবদ্ধতাগুলি ব্যবহার করে (যেমন কোনও রিটার্নের স্টেটমেন্টের বাইরে কোনও বহির্গমন প্রান্ত নেই) ব্যবহার করে এর অদম্যতা বর্ণনা করতে পারি। তবে কোনও নিখুঁত ডেড কোড নির্মূলকারী নেই, যা সমস্ত অব্যবহৃত কোডকে সরিয়ে দেয়।

  3. আমি প্রমাণের জন্য ইনপুট-নির্ভর প্রমাণ গ্রহণ করি না। যদি এমন ধরণের ব্যবহারকারীর ইনপুট থাকে যা কোডটিকে সসীম হতে দেয়, তবে নিম্নলিখিত সংস্থাগুলি মারা যায়নি এমনটি ধারণা করা কম্পাইলারের পক্ষে সঠিক। আমি দেখতে পাচ্ছি না এই সমস্তগুলি কীসের জন্য, এটি উভয়টি সুস্পষ্ট (যেমন। অন্তহীন স্টিডিন) এবং ভুল।

    টমজাটো জন্য: এটি আসলে কোনও ইনপুট নির্ভর প্রমাণ নয় not বরং এটিকে "ফোরাল" হিসাবে ব্যাখ্যা করুন। এটি নিম্নলিখিত হিসাবে কাজ করে: ধরে নিন আমাদের কাছে একটি নিখুঁত ডিসিই অ্যালগরিদম রয়েছে। আপনি যদি আমাকে একটি নির্বিচারে ট্যুরিং মেশিন এম এবং ইনপুট এক্স দেন তবে আমি উপরের কোড স্নিপেট তৈরি করে এবং মুদ্রণ-বিবৃতিটি সরিয়ে ফেলা হয়েছে কিনা তা দেখে, আমার ডিসিই অ্যালগরিদম ব্যবহার করতে পারি M এই কৌশলটি, একটি ফোরাল-স্টেটমেন্ট প্রমাণের জন্য নির্বিচারে একটি পরামিতি রেখে যাওয়া, গণিত এবং যুক্তিতে সাধারণ।

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

    চূড়ান্ত শাখাটি মৃত নয় বলে বিবেচনা করার জন্য: আমি যে "রক্ষণশীল অনুমান" এর কথা বলছি সে ক্ষেত্রে এটি নিরাপদ, তবে ওপি যেমন বলেছে তেমন ডেড কোডের সমস্ত উদাহরণ সনাক্ত করার পক্ষে এটি যথেষ্ট নয়।

কোডটি বিবেচনা করুন:

while (true)
  print "Hello"
print "goodbye"

স্পষ্টতই আমরা print "goodbye"প্রোগ্রামটির আচরণ পরিবর্তন না করে মুছে ফেলতে পারি । সুতরাং, এটি ডেড কোড। কিন্তু যদি পরিবর্তে একটি ভিন্ন ফাংশন কল (true)মধ্যে whileশর্ত, তাহলে আমরা যদি আমরা তা সরাতে বা করতে পারে না, undecidability নেতৃস্থানীয় জানি না।

মনে রাখবেন যে আমি নিজে থেকে এটি নিয়ে আসছি না। এটি সংকলকগুলির তত্ত্বের একটি সুপরিচিত ফলাফল। এটি টাইগার বইয়ে আলোচিত । ( গুগল বইগুলিতে তারা কোথায় কথা বলবে তা আপনি দেখতে সক্ষম হবেন ।


1
@ njzk2: আমি তা মৃত কোড eliminator গড়ে তুলতে অসম্ভব দেখানোর চেষ্টা করছেন ঘটিয়েছে সব মৃত কোড, না যে এটি একটি মৃত কোড eliminator যে ঘটিয়েছে গড়ে তুলতে অসম্ভব কিছু মৃত কোড। নিয়ন্ত্রণ-প্রবাহ গ্রাফ কৌশলগুলি ব্যবহার করে মুদ্রণ-পরে-রিটার্ন উদাহরণটি সহজেই মুছে ফেলা যায়, তবে সমস্ত ডেড কোড এইভাবে মুছে ফেলা যায় না।
ব্যবহারকারী 2357112 মনিকা

4
এই উত্তর মন্তব্য উল্লেখ করে । আমি উত্তরটি পড়ার সাথে সাথে আমার মন্তব্যে ঝাঁপিয়ে পড়তে হবে, তারপরে উত্তরে ফিরে যেতে হবে। এটি বিভ্রান্তিকর (দ্বিগুণ তাই যখন আপনি বিবেচনা করেন যে মন্তব্যগুলি ভঙ্গুর এবং হারিয়ে যেতে পারে)। একটি স্ব-অন্তর্ভুক্ত উত্তর পড়া অনেক সহজ হবে।
TRIG

1
@ টোমাজাটো - এমন একটি প্রোগ্রাম বিবেচনা করুন যা একটি পরিবর্তনশীল বাড়িয়ে দেয় এবং একটি বিজোড় নিখুঁত সংখ্যা কিনা তা যাচাই করে , যখন এই জাতীয় সংখ্যাটি পাওয়া যায় কেবল তখনই শেষ হয়। স্পষ্টতই এই প্রোগ্রামটি কোনও বাহ্যিক ইনপুটের উপর নির্ভর করে না। আপনি কি জোর দিয়ে বলছেন যে এই প্রোগ্রামটি শেষ হবে কিনা তা সহজেই নির্ধারণ করা যায়? nn
গ্রেগরি জে পুলিও

3
@ টম্যাজাটো আপনার থামার সমস্যাটি বোঝার ক্ষেত্রে ভুল হয়েছে। একটি সসীম টুরিং মেশিন , এবং সসীম ইনপুট , উপর চলার সময় অসীম লুপ থাকে কিনা তা নির্ধারণ করা অসম্ভব । আমি এটি কঠোরভাবে প্রমাণ করতে পারি নি কারণ এটি বারবার প্রমাণিত হয়েছে এবং এটি কম্পিউটার বিজ্ঞানের একটি মৌলিক নীতি। উইকিপিডিয়ায় প্রমাণের একটি চমৎকার স্কেচ রয়েছেMxMx
jmite

1
জিমাইট, দয়া করে উত্তরের মধ্যে কার্যকর মন্তব্য অন্তর্ভুক্ত করুন যাতে উত্তরটি নিজেরাই দাঁড়িয়ে থাকে। তারপরে এমন সমস্ত মন্তব্যগুলিকে পতাকাঙ্কিত করুন যা অপ্রচলিত যেমন আমরা পরিষ্কার করতে পারি। ধন্যবাদ!
রাফেল

14

এটি জাইমাইটের উত্তরের একটি মোড় যা অবসানহীনতা সম্পর্কে সম্ভাব্য বিভ্রান্তি দূর করে। আমি এমন একটি প্রোগ্রাম দেব যা সর্বদা থেমে থাকে, এতে ডেড কোড থাকতে পারে তবে আমরা (সর্বদা) আলগোরিদিমিকভাবে সিদ্ধান্ত নিতে পারি না এটি আছে কিনা।

ডেড-কোড সনাক্তকারীর জন্য নিম্নলিখিত শ্রেণীর ইনপুটগুলি বিবেচনা করুন:

simulateMx(n) {
  simulate TM M on input x for n steps
  if M did halt
    return 0
  else
    return 1
}

যেহেতু Mএবং xস্থির হয়েছে, এর simulateMsসাথে ডেড কোড রয়েছে return 0এবং কেবলমাত্র যদি Mএটি বন্ধ না হয় x

এটি তাত্ক্ষণিক আমাদের থামানো সমস্যা থেকে ডেড-কোড চেকিংয়ে হ্রাস পেয়েছে: টিএম থামানো-সমস্যা উদাহরণ হিসাবে দেওয়া হয়েছে , এর কোড সহ উপরের প্রোগ্রামটি তৈরি করুন - এর নিজস্ব কোডটি রয়েছে এবং কেবল তার নিজের উপর থামেনি যদি কোড।MxMM

সুতরাং, ডেড-কোড চেক করা গণনাযোগ্য নয়।

আপনি যদি এই প্রসঙ্গে প্রমাণ কৌশল হিসাবে হ্রাস সম্পর্কে অপরিচিত হন তবে আমি আমাদের রেফারেন্স উপাদানটির প্রস্তাব দিই ।


5

বিবরণে জড়িয়ে না পড়ে এই ধরণের সম্পত্তি প্রদর্শনের একটি সহজ উপায় হ'ল নিম্নলিখিত লেমা ব্যবহার করা:

লেমা: টিউরিং-সম্পূর্ণ ভাষার জন্য যে কোনও সংকলক সি-র জন্য, একটি ফাংশন রয়েছে undecidable_but_true()যা কোনও যুক্তি গ্রহণ করে না এবং বুলেটটি সত্য প্রদান করে, যেমন সি undecidable_but_true()সত্য বা মিথ্যা প্রত্যাবর্তন করে তা ভবিষ্যদ্বাণী করতে পারে না ।

নোট করুন যে ফাংশন সংকলক উপর নির্ভর করে। একটি ফাংশন দেওয়া undecidable_but_true1(), একটি সংকলক সর্বদা এই ফাংশনটি সত্য বা মিথ্যা প্রত্যাবর্তন করে কিনা তা জ্ঞানের সাথে বাড়ানো যেতে পারে; তবে সর্বদা কিছু অন্যান্য ক্রিয়াকলাপ রয়েছে undecidable_but_true2()যা আচ্ছাদন করা হবে না।

প্রমাণ: দ্বারা চাল এর উপপাদ্য , সম্পত্তি "এই ফাংশন আয় প্রকৃত" undecidable হয়। সুতরাং কোনও স্থিতিশীল বিশ্লেষণ অ্যালগরিদম সমস্ত সম্ভাব্য কার্যকারিতা জন্য এই সম্পত্তি সিদ্ধান্ত নিতে অক্ষম।

প্রতিচ্ছবি: একটি সংকলক সি দেওয়া, নিম্নলিখিত প্রোগ্রামে ডেড কোড রয়েছে যা সনাক্ত করা যায় না:

if (!undecidable_but_true()) {
    do_stuff();
}

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

some_method () {
    <code whose continuation is unreachable>
    // is throw InternalError() needed here?
}

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

String day_of_week(int n) {
    switch (n % 7) {
    case 0: return "Sunday";
    case 1: case -6: return "Monday";
    …
    case 6: case -1: return "Saturday";
    }
    // return or throw is required here, even though this point is unreachable
}

নোট করুন যে কয়েকটি ভাষার জন্য কয়েকটি সংকলক সনাক্ত করতে সক্ষম হতে পারে যে day_of_weekশেষেরটি পৌঁছনীয় নয়।
ব্যবহারকারী 253751

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

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

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

বিবৃতিটির মতো মনে হচ্ছে "অনিশ্চয়তার অর্থ এমন একটি উদাহরণ রয়েছে যা সমাধান করা যায় না", যা ভুল। (আমি জানি যে আপনি এটি বলতে চাইছেন না, তবে এটি অজ্ঞাত / নবাগতদের কাছে পড়তে পারে, ইমো))
রাফেল

3

jmite এর উত্তর প্রোগ্রামটি কখনই কোনও গণনা থেকে প্রস্থান করবে কিনা তার প্রযোজ্য - এটি অসীম কারণেই আমি কোডটি মারা যাওয়ার পরে কল করব না।

তবে, আরও একটি উপায় আছে: একটি সমস্যা যার জন্য উত্তর রয়েছে তবে এটি অজানা:

public void Demo()
{
  if (Chess.Evaluate(new Chessboard(), int.MaxValue) != 0)
    MessageBox.Show("Chess is unfair!");
  else
    MessageBox.Show("Chess is fair!");
}

public class chess
{
  public Int64 Evaluate(Chessboard Board, int SearchDepth)
  {
  ...
  }
}

একটি সন্দেহ ছাড়াই এই রুটিন নেই মৃত কোড সম্বলিত - ফাংশন একটি উত্তর যে এক পথ কিন্তু অন্যান্য না executes ফিরে আসবে। ভাগ্য ভাল যদিও এটি খুঁজে! আমার স্মৃতি কোন তাত্ত্বিক কম্পিউটার এটি মহাবিশ্বের আজীবনের মধ্যে সমাধান করতে পারে না।

আরো বিস্তারিত:

Evaluate()ফাংশন নির্ণয় যদি উভয় পক্ষের পুরোপুরি (সর্বোচ্চ অনুসন্ধান গভীরতা সঙ্গে) খেলা যা পার্শ্ব একটি দাবা গেম ধিক্কার জানাই।

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

public Int64 Evaluate(Chessboard Board, int SearchDepth)
{
  foreach (ChessMove Move in Board.GetPossibleMoves())
    {
      Chessboard NewBoard = Board.MakeMove(Move);
      if (NewBoard.Checkmate()) return int.MaxValue;
      if (NewBoard.Draw()) return 0;
      if (SearchDepth == 0) return NewBoard.Score();
      return -Evaluate(NewBoard, SearchDepth - 1);
    }
}

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

লক্ষ্য করুন যে অনুসন্ধানের গভীরতা পুরো চালগুলি নয়, অর্ধ-চালিকায় রয়েছে। এই ধরণের এআই রুটিনের জন্য এটি স্বাভাবিক কারণ এটি একটি ও (x ^ n) রুটিন - আরও একটি অনুসন্ধান প্লাই যুক্ত করা চালানোতে কতক্ষণ সময় নেয় তার একটি বড় প্রভাব ফেলে।


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

6
প্রশ্নটি প্রমাণের জন্য অনুরোধ করেছে যে মৃত কোড সনাক্ত করা অসম্ভব । আপনার পোস্টে এমন একটি মামলার উদাহরণ রয়েছে যেখানে আপনি সন্দেহ করছেন যে ডেড কোড সনাক্ত করা কঠিন হবে । এটি হাতে থাকা প্রশ্নের উত্তর নয়।
ডেভিড রিচার্বি

2
@ লরেনপেকটেল আমি জানি না, তবে এটি কোনও প্রমাণ নয়। এখানেও দেখুন ; আপনার ভুল ধারণা একটি পরিষ্কার উদাহরণ।
রাফেল

3
এটি যদি সহায়তা করে তবে বিবেচনা করুন যে মহাবিশ্বের আজীবনের চেয়ে কাউকে তাদের সংকলক চালানো থেকে তাত্ত্বিকভাবে থামানোর কিছু নেই; একমাত্র সীমাবদ্ধতা হ'ল ব্যবহারিকতা। একটি জটিল সিদ্ধান্ত হ'ল একটি সিদ্ধান্ত গ্রহণযোগ্য সমস্যা, এমনকি যদি এটি জটিলতা ক্লাসে আনা হয়।
ছদ্মনাম

4
অন্য কথায়, এই উত্তরটি সর্বোপরি একটি হিউরিস্টিক হ'ল এটি প্রমাণ করার জন্য যে সমস্ত মৃত কোড সনাক্ত করে এমন সংকলক তৈরি করা সম্ভবত কেন সহজ নয় - তবে এটি অসম্ভবতার প্রমাণ নয়। এই ধরণের উদাহরণ শিক্ষার্থীদের অন্তর্নিহিততা তৈরির উপায় হিসাবে কার্যকর হতে পারে তবে এটি কোনও প্রমাণ নয়। প্রমাণ হিসাবে নিজেকে উপস্থাপন করে, এটি একটি বিচ্ছিন্নতা করে। উত্তরে এটি সম্পাদনা করতে হবে যে এটি অন্তর্দৃষ্টি-নির্মাণের উদাহরণ তবে অসম্ভবতার প্রমাণ নয় not
DW

-3

আমি মনে করি একটি কম্পিউটিং কোর্সে, সংকলন সময় এবং রান সময়ের মধ্যে পার্থক্য বোঝার প্রসঙ্গে ডেড কোডের ধারণাটি আকর্ষণীয়!

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

যদি কোনও সংকলক আসলে রানটাইম ডেড কোড নির্ধারণ করতে পারে (অর্থাত্ ট্যুরিং সম্পূর্ণ) তখন একটি যুক্তি রয়েছে যে কোডটি কখনই চালানো দরকার না, কারণ কাজটি ইতিমধ্যে হয়ে গেছে!

অন্য কিছু না হলে, সংকলন-সময় ডেড কোড চেকগুলি পাস করে এমন কোডের অস্তিত্ব ইনপুটগুলি এবং সাধারণ কোডিং স্বাস্থ্যবিধি (বাস্তব প্রকল্পগুলির বাস্তব জগতে on


1
প্রশ্নটি প্রমাণ হিসাবে জিজ্ঞাসা করেছে যে মৃত কোড সনাক্ত করা অসম্ভব। আপনি এই প্রশ্নের উত্তর দেন নি।
ডেভিড রিচার্বি

এছাড়াও, আপনার বক্তব্য যে "একটি সংকলক নির্ধারণ করতে পারে যে কখন আপনি এমন কোড পেয়েছেন যা কোনও সংকলন-কালীন দৃশ্যে কখনই বিপর্যস্ত হতে পারে না" ভুল এবং প্রশ্ন আপনাকে প্রমাণ করতে বলার জন্য সরাসরি বিরোধিতা করে।
ডেভিড রিচার্বি

@ ডেভিড রিচার্বি, আমি মনে করি আপনি হয়ত আমার সম্পর্কে ভুল পড়ছেন। আমি প্রস্তাব দিচ্ছি না যে কম্পাইল-টাইম চেকিং সমস্ত মৃত কোড খুঁজে পাবে, অবশ্যই পাওয়া যাবে না। আমি প্রস্তাব দিচ্ছি যে সমস্ত মৃত কোডের সংকলনের একটি উপসেট রয়েছে যা সংকলনের সময় বিবেচনাযোগ্য। যদি আমি লিখি: যদি (সত্য == মিথ্যা) {মুদ্রণ ("কিছু");}, তবে মুদ্রণ কোডটি সংকলনের সময় সেই মুদ্রণ বিবরণীটি বোধগম্য হবে। আপনি কি একমত না যে এটি আপনার দাবির প্রতিদ্বন্দ্বী?
dwoz

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