আপনার যদি কোনও বাধা বা অনুমানযোগ্য ইনপুট থাকে তবে কি থামানো সমস্যার সমাধান করা সম্ভব?


18

থামানো সমস্যাটি সাধারণ ক্ষেত্রে সমাধান করা যায় না। অনুমতিপ্রাপ্ত ইনপুটগুলিকে সীমাবদ্ধ করে এমন সংজ্ঞায়িত নিয়মগুলি নিয়ে আসা সম্ভব এবং সেই বিশেষ মামলার জন্য কী থামানো সমস্যা সমাধান করা যেতে পারে?

উদাহরণস্বরূপ, সম্ভবত মনে হচ্ছে যে কোনও ভাষা উদাহরণস্বরূপ লুপগুলিকে অনুমতি দেয় না, প্রোগ্রামটি থামবে কি না তা খুব সহজেই বলা যায়।

আমি এখনই যে সমস্যাটি সমাধান করার চেষ্টা করছি তা হ'ল আমি একটি স্ক্রিপ্ট পরীক্ষক তৈরি করার চেষ্টা করছি যা প্রোগ্রামটির বৈধতা পরীক্ষা করে। স্ক্রিপ্ট রাইটারদের কাছ থেকে ঠিক কী প্রত্যাশা করা উচিত ঠিক তা যদি আমি বুঝতে পারি তবে খুব সম্ভবত অনুমানযোগ্য ইনপুটগুলি কীভাবে থামানো সমস্যার সমাধান হতে পারে। এটি যদি ঠিকভাবে সমাধান করা যায় না, তবে এটি সমাধানের জন্য কিছু ভাল আনুমানিক কৌশল কী কী?

উত্তর:


10

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

recursion

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

  • সি প্রিপ্রোসেসর যখন ম্যাক্রোটি প্রসারিত করছে তখন একটি ম্যাক্রো অক্ষত রেখে দেয়। সর্বাধিক সাধারণ ব্যবহার হল একটি ফাংশনটির চারপাশে একটি মোড়ক সংজ্ঞায়িত করা:

    #define f(x) (printf("calling f(%d)\n", (x)), f(x))
    f(3);
    

    এটি প্রসারিত হয়

    (printf("calling f(%d)\n", (3)), f(3))
    

    পারস্পরিক পুনরাবৃত্তি পাশাপাশি পরিচালনা করা হয়। এর পরিণতি হ'ল সি প্রিপ্রোসেসর সর্বদা শেষ হয়, যদিও উচ্চ রান-টাইম জটিলতায় ম্যাক্রোগুলি তৈরি করা সম্ভব।

    #define f0(x) x(x)x(x)
    #define f1(x) f0(f0(x))
    #define f2(x) f1(f1(x))
    #define f3(x) f2(f2(x))
    f3(x)
    
  • ইউনিক্স শেলগুলি পুনরাবৃত্তভাবে এলিয়াসগুলি প্রসারিত করে তবে কেবল ততক্ষণ তাদের মুখোমুখি না হওয়া অবধি ইতিমধ্যে প্রসারিত হচ্ছে alias আবার, প্রাথমিক উদ্দেশ্য হ'ল একটি অনুরূপ-নামক কমান্ডের জন্য একটি উপাধি সংজ্ঞা দেওয়া।

    alias ls='ls --color'
    alias ll='ls -l'
    

এনএন

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

loops

forমিএন

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


4

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


4

হ্যাঁ, এটি সম্ভব হতে পারে। এই জাতীয় সমস্যা সমাধানের একটি সাধারণ উপায় হ'ল ইনপুটটির অংশ হিসাবে কোডের উপর নির্ভর করে একটি অতিরিক্ত (একঘেয়েমি) অবিরাম পরামিতি বিবেচনা করা । সেই প্যারামিটারটি থাকা সমস্যার জটিলতা মারাত্মকভাবে হ্রাস করা যায়।

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

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

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

আনুষ্ঠানিক-পদ্ধতিতে উত্থিত সমস্যাগুলি সাধারণত অনস্বীকার্য, আপনি অনুশীলনে এই সমস্যাগুলি কীভাবে মোকাবেলা করেন সে বিষয়ে আপনি সাহিত্য পরীক্ষা করতে চাইতে পারেন।


4

আনুষ্ঠানিকভাবে অনড় উত্তর না, তবে এখানে এটি যায়:

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

সর্বাধিক স্ট্যাক গভীরতার অনুমতি দেওয়ার মতো বা প্রতিটি পুনরাবৃত্তিতে একটি অ-নেতিবাচক প্যারামিটার হ্রাস করার মতো জোর করে যদি আপনি এটিকে সসীম করার জন্য কোনও শৈল্পিক নিয়মটি সেট না করেন তবে পুনরাবৃত্তি সম্ভবত ঠিক নয়।

যথেচ্ছ গোটোস সাধারণত খারাপ হয়। পিছনের দিকের গোটোগুলি অসীম হতে পারে এমন লুপগুলির দিকে পরিচালিত করার খুব সম্ভাবনা রয়েছে।

সময়সীমা এবং করণীয় বিবৃতিগুলি একটি সমস্যা, কারণ এগুলি এমন এক অবস্থার উপর নির্ভর করে যা সম্পাদনের সময় পরিবর্তন বা না করার গ্যারান্টিযুক্ত নয়। এটি সীমাবদ্ধ করার একটি সম্ভাব্য (তবে সম্ভবত খুব অসন্তুষ্ট) উপায় সম্ভাব্য সর্বাধিক সংখ্যক পুনরাবৃত্তি প্রদান করা।


2

আপনাকে আপনার স্ক্রিপ্ট ভাষার সংজ্ঞা দিতে হবে এবং স্ক্রিপ্ট লেখকদের "প্রত্যাশা" বলতে আপনার কী বোঝায়?

হে(এনω)

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

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