কিছু খুব ভাল উত্তর আছে। আমি আলোচনায় অবদান রাখার চেষ্টা করব।
প্রোলগে ডিক্লেয়ারেশনাল, লজিক প্রোগ্রামিংয়ের বিষয়টিতে রিচার্ড ও'কিফের লেখা "দ্য ক্রাফট অফ প্রোলজ" দুর্দান্ত বই রয়েছে । এটি একটি প্রোগ্রামিং ভাষা ব্যবহার করে দক্ষ প্রোগ্রামগুলি লেখার বিষয়ে যা আপনাকে খুব অযোগ্য প্রোগ্রাম লিখতে দেয়। এই বইটিতে বেশ কয়েকটি অ্যালগরিদমের দক্ষ প্রয়োগের বিষয়ে আলোচনা করার সময় ("প্রোগ্রামিংয়ের পদ্ধতিগুলির অধ্যায়") লেখক নিম্নলিখিত পদ্ধতিটি গ্রহণ করেছেন:
- ইংরেজীতে সমস্যাটি সংজ্ঞায়িত করুন
- একটি কার্যনির্বাহী সমাধান লিখুন যা যথাসম্ভব ঘোষিত; সাধারণত, এর অর্থ হ'ল আপনার প্রশ্নে ঠিক ঠিক কী রয়েছে, কেবল প্রোগলোগটি সঠিক করুন
- সেখান থেকে, বাস্তবায়নটিকে আরও দ্রুততর করার জন্য পরিমার্জন করার পদক্ষেপ নিন
এর মাধ্যমে আমার পথে কাজ করার সময় আমি সবচেয়ে আলোকিত (আমার জন্য) পর্যবেক্ষণ করতে পেরেছিলাম:
হ্যাঁ, লেখক যে "ঘোষিত" স্পেসিফিকেশন দিয়ে শুরু করেছিলেন তার চেয়ে বাস্তবায়নের চূড়ান্ত সংস্করণটি আরও কার্যকর। এটি এখনও খুব ঘোষিত, সংক্ষিপ্ত এবং বোঝা সহজ। এর মধ্যে যা ঘটেছে তা হ'ল চূড়ান্ত সমাধান সমস্যার প্রাথমিক বৈশিষ্ট্য ক্যাপচার করে যার কাছে প্রাথমিক সমাধানটি গাফিল ছিল।
অন্য কথায়, একটি সমাধান বাস্তবায়ন করার সময়, আমরা সমস্যাটি সম্পর্কে আমাদের জ্ঞানের যতটা সম্ভব ব্যবহার করেছি। তুলনা করা:
একটি তালিকার ক্রম সন্ধান করুন যেমন সমস্ত উপাদানগুলি ক্রমবর্ধমান ক্রমে থাকে
করুন:
দুটি বাছাই করা তালিকা মার্জ করার ফলে একটি সাজানো তালিকার ফলস্বরূপ। যেহেতু ইতিমধ্যে বাছাই করা সাবলিস্ট থাকতে পারে তাই এগুলি দৈর্ঘ্য 1 এর সাবলিস্টের পরিবর্তে প্রারম্ভিক পয়েন্ট হিসাবে ব্যবহার করুন।
একটি ছোট্ট বিষয়: আপনার দেওয়া মত একটি সংজ্ঞা আকর্ষণীয় কারণ এটি খুব সাধারণ very যাইহোক, আমি এই অনুভূতি থেকে বাঁচতে পারি না যে এটি উদ্দেশ্যমূলকভাবে সত্যটি একটি সংশ্লেষক সমস্যা যে সত্যটি অগ্রাহ্য করে ign এটি এমন কিছু যা আমরা ইতিমধ্যে জানি ! এটি কোন সমালোচনা নয়, কেবল একটি পর্যবেক্ষণ।
আসল প্রশ্ন হিসাবে: কিভাবে এগিয়ে? ওয়েল, একটি উপায় হ'ল আমরা কম্পিউটারে যে সমস্যাটি ঘোষণা করছি তার সম্পর্কে যথাসম্ভব জ্ঞান সরবরাহ করা।
সমস্যাটির সমাধানের জন্য আমি যে সর্বোত্তম প্রচেষ্টাটি জানি তা উপস্থাপন করা হয়েছে আলেকজান্ডার স্টেপানোভের সহ-রচিত বইগুলিতে, "প্রোগ্রামিংয়ের উপাদানগুলি" এবং "গণিত থেকে জেনেরিক প্রোগ্রামিং পর্যন্ত" উপস্থাপন করা হয়েছে । দুর্ভাগ্যক্রমে আমি এই বইগুলির সমস্ত কিছু সংক্ষিপ্ত করার (বা এমনকি পুরোপুরি বোঝার) কাজটি করতে পারছি না। যাইহোক, সেখানে পদ্ধতির দক্ষ (বা এমনকি সর্বোত্তম) লাইব্রেরী অ্যালগরিদম এবং ডেটা স্ট্রাকচার সংজ্ঞায়িত করা হয়েছে, এই বিধানের আওতায় যে ইনপুটটির সমস্ত প্রাসঙ্গিক বৈশিষ্ট্য আগে থেকেই জানা ছিল। চূড়ান্ত ফলাফল:
- প্রতিটি সু-সংজ্ঞায়িত রূপান্তর হ'ল ইতিমধ্যে স্থানে থাকা সীমাবদ্ধতাগুলির সংশোধন (যে বৈশিষ্ট্যগুলি জানা রয়েছে);
- বিদ্যমান সীমাবদ্ধতার উপর নির্ভর করে কোন রূপান্তরটি সর্বোত্তম তা আমরা কম্পিউটারটিকে সিদ্ধান্ত নিতে পারি।
এখনও এটি কেন পুরোপুরি ঘটেনি, ঠিক আছে, কম্পিউটার বিজ্ঞান সত্যই একটি তরুণ ক্ষেত্র, এবং আমরা এখনও এর বেশিরভাগ অভিনবত্বের সত্যই প্রশংসা করতে পেরেছি।
দ্রষ্টব্য
"বাস্তবায়ন পরিমার্জন" দ্বারা আপনাকে আমি কী বোঝাতে চাইছি তার একটি স্বাদ দিতে: উদাহরণস্বরূপ, প্রোলোগে কোনও তালিকার শেষ উপাদান পাওয়ার সহজ সমস্যাটি ধরুন। আধ্যাত্মিক ঘোষণামূলক সমাধান বলতে হয়:
last(List, Last) :-
append(_, [Last], List).
এখানে, এর ঘোষণামূলক অর্থটি append/3
হ'ল:
List1AndList2
হয় সংযুক্তকরণের List1
এবংList2
যেহেতু দ্বিতীয় যুক্তিতে append/3
আমাদের কেবল একটি উপাদান সহ একটি তালিকা রয়েছে এবং প্রথম যুক্তি উপেক্ষা করা হয় (আন্ডারস্কোর), আমরা মূল তালিকার একটি বিভাজন পাই যা তালিকার সামনের অংশটিকে ( List1
প্রেক্ষাপটে append/3
) অস্বীকার করে এবং দাবি করে যে পিছনে ( List2
প্রসঙ্গে append/3
) প্রকৃতপক্ষে কেবলমাত্র একটি উপাদান সহ একটি তালিকা: সুতরাং, এটি শেষ উপাদান।
প্রকৃত SWI-Prolog দ্বারা উপলব্ধ বাস্তবায়ন অবশ্য বলেছেন:
last([X|Xs], Last) :-
last_(Xs, X, Last).
last_([], Last, Last).
last_([X|Xs], _, Last) :-
last_(Xs, X, Last).
এটি এখনও সুন্দরভাবে ঘোষিত। উপরে থেকে নীচে পড়ুন, এটি বলে:
একটি তালিকার সর্বশেষ উপাদানটি কমপক্ষে একটি উপাদানের তালিকার জন্য অর্থবোধ করে। একজোড়া লেজের জন্য এবং তালিকার শীর্ষের জন্য সর্বশেষ উপাদানটি হ'ল: মাথা, যখন লেজটি খালি থাকে, বা খালি নয় এমন লেজের শেষ অংশ।
এই বাস্তবায়ন কেন সরবরাহ করা হচ্ছে তার কারণ হ'ল প্রোলোগের সম্পাদন মডেলকে ঘিরে ব্যবহারিক সমস্যাগুলি নিয়ে কাজ করা । আদর্শভাবে, এটি প্রয়োগ করা হয় যা কোন পার্থক্য করা উচিত নয়। একইভাবে, আমরা বলতে পারি:
last(List, Last) :-
reverse(List, [Last|_]).
তালিকার শেষ উপাদানটি বিপরীত তালিকার প্রথম উপাদান।
আপনি যদি ভাল, ঘোষক প্রোলোলজ সম্পর্কে অনির্বাচিত আলোচনার বিষয়বস্তু পেতে চান তবে স্ট্যাক ওভারফ্লোতে প্রোলোগ ট্যাগটিতে কিছু প্রশ্ন ও উত্তর দেখুন ।