প্রথমে, আপনার সূক্ষ্ম pw0n1e আইকনটিতে আমাকে আপনার প্রশংসা করার অনুমতি দিন।
উত্তর দেওয়ার জন্য এটি একটি জটিল প্রশ্ন, মূলত কারণ মিনিকেনরেন এবং প্রোলোগ উভয়েরই অনেকগুলি রূপ রয়েছে। মিনিকেনরেন এবং প্রোলোগ হ'ল ভাষাগুলির পরিবার, যা তাদের বৈশিষ্ট্যগুলির তুলনা করা বা এমনকি বাস্তবে কীভাবে তারা ব্যবহার করা হয় তা তুলনা করা শক্ত করে তোলে। এর কারণে, দয়া করে আমি যা বলার বিষয়ে যাচ্ছি তার সাথে সাবধানতার সাথে বলুন: যদি আমি বলি যে প্রোলোগ গভীরতা-প্রথম অনুসন্ধান ব্যবহার করে তবে সচেতন থাকুন যে অনেক প্রোলোগ বাস্তবায়ন অন্যান্য অনুসন্ধান কৌশলকে সমর্থন করে এবং বিকল্প অনুসন্ধান কৌশলগুলিও মেটাতে এনকোড করা যেতে পারে - ইন্টারেটারেটর স্তর। তবুও, মিনিকেনরেন এবং প্রোলোগের বিভিন্ন ডিজাইনের দর্শন রয়েছে এবং তারা বিভিন্ন ট্রেড অফ করে।
প্রোলোগ হ'ল প্রতীকী কৃত্রিম বুদ্ধিমত্তা প্রোগ্রামিংয়ের জন্য দুটি ক্লাসিক ভাষার একটি (অন্য ক্লাসিক ভাষা লিস্প)। প্রোলজ প্রতীকী বিধি-ভিত্তিক সিস্টেমগুলি প্রয়োগ করতে পেরে ওঠে, যেখানে ঘোষণামূলক জ্ঞান প্রথম-আদেশের যুক্তিতে এনকোড থাকে। ভাষা এই ধরণের অ্যাপ্লিকেশনগুলির জন্য ভাব এবং দক্ষতার জন্য অনুকূলিত হয়, কখনও কখনও যৌক্তিক বিশুদ্ধতার ব্যয়ে। উদাহরণস্বরূপ, ডিফল্টরূপে প্রোলোগ একীকরণে "ঘটে যাওয়া চেক" ব্যবহার করে না। গণিত / যুক্তির দিক থেকে, একীকরণের এই সংস্করণটি ভুল। যাইহোক, দেখা চেক ব্যয়বহুল, এবং বেশিরভাগ ক্ষেত্রে দেখা চেকের অভাব কোনও সমস্যা নয়। প্রোলোগের গভীরতা-প্রথম অনুসন্ধানের ব্যবহার এবং কাটা ব্যবহারের মতোই এটি একটি খুব ব্যবহারিক নকশার সিদ্ধান্ত (!
) ব্যাকট্র্যাকিং নিয়ন্ত্রণ করতে। আমি নিশ্চিত যে ১৯ decisions০ এর দশকে হার্ডওয়্যার চালানোর সময় এই সিদ্ধান্তগুলি একেবারে প্রয়োজনীয় ছিল এবং বড় সমস্যাগুলির সাথে কাজ করার সময় এবং বিশাল (প্রায়শই অসীম!) অনুসন্ধানের জায়গাগুলি নিয়ে কাজ করার সময় আজ খুব দরকারী।
প্রোলোগ অনেকগুলি "অতিরিক্ত-লজিকাল" বা "অ-লজিকাল" বৈশিষ্ট্যগুলিকে সমর্থন করে, কাটা সহ, assert
এবং retract
, পাটিগণিত ব্যবহার করে ভেরিয়েবলের অভিক্ষেপis
, এবং আরও। এই বৈশিষ্ট্যগুলির মধ্যে অনেকগুলি জটিল নিয়ন্ত্রণ প্রবাহকে প্রকাশ করা সহজ করে তোলে এবং প্রোলোগের বিশ্বব্যাপী তথ্যগুলির ডেটাবেসগুলি ম্যানিপুলেট করে। প্রোলোগের একটি খুব আকর্ষণীয় বৈশিষ্ট্য হ'ল প্রোলগ কোডটি স্বয়ং তথ্যগুলির বিশ্বব্যাপী ডাটাবেসে সংরক্ষিত থাকে এবং রান সময় এটির বিরুদ্ধে অনুসন্ধান করা যেতে পারে। এটি মেটা-দোভাষীকে লিখতে তুচ্ছ করে তোলে যা ব্যাখ্যার অধীনে প্রোলোগ কোডের আচরণকে পরিবর্তন করে। উদাহরণস্বরূপ, মেগা-দোভাষী যা অনুসন্ধানের ক্রম পরিবর্তন করে ব্যবহার করে প্রোলগের প্রস্থে প্রথম প্রস্থের এনকোড করা সম্ভব। এটি একটি অত্যন্ত শক্তিশালী কৌশল যা প্রোলগ বিশ্বের বাইরে সুপরিচিত নয়। 'আর্ট অফ প্রোলজ' এই কৌশলটি বিশদভাবে বর্ণনা করে।
গুরুতর প্রচেষ্টা প্রোলোগ বাস্তবায়নের উন্নতিতে চলে গেছে, যার বেশিরভাগ ওয়ারেন অ্যাবস্ট্রাক্ট মেশিন (ডাব্লুএএম) এর উপর ভিত্তি করে। ডাব্লুএইএম একটি পার্শ্ব-প্রভাবকারী মডেল ব্যবহার করে যেখানে মানগুলি ধ্বংসাত্মকভাবে লজিক ভেরিয়েবলগুলিতে বরাদ্দ করা হয়, ব্যাকট্র্যাকিংয়ের পরে এই পার্শ্ব-প্রতিক্রিয়াগুলি পূর্বাবস্থায় ফিরে আসে। ডাব্লুএএমএর নির্দেশাবলী বাড়িয়ে প্রোগলগুলিতে অনেকগুলি বৈশিষ্ট্য যুক্ত করা যেতে পারে। এই পদ্ধতির একটি অসুবিধা হ'ল ডাব্লুএইচএএম সম্পর্কে দৃ of় বোঝা ছাড়াই প্রোলোগ বাস্তবায়ন কাগজপত্র পড়া কঠিন হতে পারে। অন্যদিকে, প্রোলগ বাস্তবায়নকারী বাস্তবায়নের বিষয়গুলি নিয়ে আলোচনার জন্য একটি সাধারণ মডেল রয়েছে। সমান্তরাল প্রোলোগ নিয়ে অনেক গবেষণা হয়েছে, যার সমাপ্তি ১৯৯০ এর দশকে আন্দোরার প্রোলোগে। কমপক্ষে এই ধারণাগুলির কয়েকটি সিও প্রোগলগে লাইভ রয়েছে। (সিওও প্রোলোগ আকর্ষণীয় ধারণাগুলিতে পূর্ণ, যার মধ্যে বেশিরভাগ প্রোলগ স্ট্যান্ডার্ড ছাড়িয়ে যায় go)
প্রোলোগের একটি সুন্দর একীকরণ-ভিত্তিক "প্যাটার্ন-ম্যাচিং"-স্টাইল সিনট্যাক্স রয়েছে যা খুব সংক্ষিপ্ত প্রোগ্রামগুলির ফলাফল। প্রচারকারীরা তাদের বাক্যবিন্যাসকে পছন্দ করেন ঠিক যেমন লিস্পাররা তাদের এস-এক্সপ্রেশনকে পছন্দ করে। প্রোলগের কাছে স্ট্যান্ডার্ড পূর্বাভাসের একটি বৃহত লাইব্রেরি রয়েছে। ডাব্লুএমএইএম দ্রুত তৈরি করার ক্ষেত্রে যে সমস্ত ইঞ্জিনিয়ারিং চলছে সেগুলির কারণে খুব দক্ষ এবং পরিপক্ক প্রোলোগ বাস্তবায়ন রয়েছে। ফলস্বরূপ, অনেক বড় জ্ঞান-ভিত্তিক সিস্টেম সম্পূর্ণরূপে সম্পূর্ণ লেখা হয়েছে।
miniKanren একটি ছোট, সহজেই বোধগম্য এবং সহজেই হ্যাকযোগ্য প্রয়োগকরণ সহ একটি ন্যূনতম যুক্তিযুক্ত প্রোগ্রামিং ভাষা হিসাবে ডিজাইন করা হয়েছিল। miniKanren মূলত স্কিমে এম্বেড করা ছিল এবং গত দশকে ধরে কয়েক ডজন অন্যান্য হোস্ট ভাষায় পোর্ট করা হয়েছে। সর্বাধিক জনপ্রিয় মিনিক্যানরেন বাস্তবায়ন হ'ল ক্লোজারে 'কোর.লগিক', যার এখন অনেকগুলি প্রোলোগুলির মতো এক্সটেনশন এবং বেশ কয়েকটি অপ্টিমাইজেশন রয়েছে। সম্প্রতি মিনিকেনরেন বাস্তবায়নের মূলটিকে আরও আরও সরল করা হয়েছে, যার ফলে "মাইক্রো ক্যানরেন" নামে একটি ক্ষুদ্র "মাইক্রো কার্নেল" তৈরি হয়েছে। miniKanren এর পরে এই মাইক্রো ক্যানরেন কোরের শীর্ষে প্রয়োগ করা যেতে পারে। মাইক্রো ক্যানরেন বা মিনি ক্যানেনেনকে একটি নতুন হোস্ট ভাষায় পোর্টিং করা প্রোগ্রামারদের miniKanren শেখার জন্য একটি আদর্শ অনুশীলনে পরিণত হয়েছে। ফলস্বরূপ,
মিনিক্যানরেন এবং মাইক্রো ক্যানরেনের স্ট্যান্ডার্ড বাস্তবায়নে কোনও একক ব্যতিক্রম ছাড়া কোনও রূপান্তর বা অন্যান্য পার্শ্ব-প্রতিক্রিয়া নেই: মিনিক্যানরেনের কিছু সংস্করণ যুক্তিযুক্ত ভেরিয়েবলের তুলনায় পয়েন্টার সমতা ব্যবহার করে। আমি এটিকে একটি "সৌম্য প্রভাব" হিসাবে বিবেচনা করি, যদিও বাস্তবায়নের মাধ্যমে কাউন্টার পেরিয়ে অনেক বাস্তবায়ন এমনকি এই প্রভাবকে এড়িয়ে চলে। কোনও গ্লোবাল ফ্যাক্ট ডাটাবেসও নেই। miniKanren এর বাস্তবায়ন দর্শন কার্যকরী প্রোগ্রামিং দ্বারা অনুপ্রাণিত: মিউটেশন এবং প্রভাবগুলি এড়ানো উচিত এবং সমস্ত ভাষা নির্মাতাকে লেক্সিকাল স্কোপকে সম্মান করা উচিত। আপনি যদি বাস্তবায়নের দিকে মনোযোগ সহকারে তাকান তবে আপনি এমনকি বেশ কয়েকটি মনডও দেখতে পাবেন। অনুসন্ধানের প্রয়োগটি মিউটেশনটি ব্যবহার না করে আবার অলস প্রবাহগুলির সংমিশ্রণ এবং হেরফেরের উপর ভিত্তি করে। এই প্রয়োগের পছন্দগুলি প্রোলোগের তুলনায় খুব আলাদা বাণিজ্য-বাণিজ্য করে to প্রোগলগুলিতে, ভেরিয়েবল লুকের জন্য ধ্রুবক সময় হয় তবে ব্যাকট্র্যাকিংয়ের জন্য পার্শ্ব-প্রতিক্রিয়াগুলি পূর্বাবস্থায় ফেরানো দরকার। মিনিক্যানারে ভেরিয়েবলের চেহারা আরও ব্যয়বহুল, তবে ব্যাকট্র্যাকিং "ফ্রি"। আসলে, কীভাবে স্ট্রিমগুলি পরিচালনা করা হয় তার কারণে মিনিক্যানারে কোনও ব্যাকট্র্যাকিং নেই।
মিনিকেনরেন বাস্তবায়নের একটি আকর্ষণীয় দিক হ'ল কোডটি সহজাতভাবে থ্রেড-নিরাপদ এবং --- কমপক্ষে তত্ত্বে --- তুচ্ছভাবে সমান্তরাল। অবশ্যই, কোডটিকে ধীর না করে সমান্তরাল করা তুচ্ছ নয়, তবে প্রতিটি থ্রেড বা প্রক্রিয়াটিকে সমান্তরালনের ওভারহেডের জন্য যথেষ্ট পরিমাণ কাজ দিতে হবে। তবুও, এটি মিনিকেনরেন বাস্তবায়নের একটি ক্ষেত্র যা আমি আশা করি আরও মনোযোগ এবং পরীক্ষা গ্রহণ করব।
miniKanren একীকরণের জন্য ঘটে যাওয়া চেকটি ব্যবহার করে এবং গভীরতা-প্রথম অনুসন্ধানের পরিবর্তে একটি সম্পূর্ণ ইন্টারলেভেভিং অনুসন্ধান ব্যবহার করে। ইন্টারলেভিং অনুসন্ধান গভীরতা-প্রথম অনুসন্ধানের চেয়ে বেশি মেমরি ব্যবহার করে তবে কিছু ক্ষেত্রে উত্তর পেতে পারে যে ক্ষেত্রে গভীরতা-প্রথম অনুসন্ধান চিরতরে ডাইভারেজ / লুপ ডাইর করবে। miniKanren করে কিছু অতিরিক্ত-লজিক্যাল অপারেটর --- সমর্থন conda
, condu
এবং project
, জন্য উদাহরণ। conda
এবং condu
প্রোলোগুলের কাটা অনুকরণ করতে ব্যবহার করা project
যেতে পারে এবং লজিক ভেরিয়েবলের সাথে মান যুক্ত করতে ব্যবহার করা যেতে পারে।
উপস্থিতি conda
, condu
এবংproject
--- এবং সহজেই অনুসন্ধান কৌশলটি সংশোধন করার ক্ষমতা --- প্রোগ্রামারদের এম্বেড থাকা প্রোলোগ-জাতীয় ভাষা হিসাবে মিনিকেনরেন ব্যবহার করতে দেয়। এটি ক্লোজুরের 'কোর.লগিক' ব্যবহারকারীদের জন্য বিশেষত সত্য, যার মধ্যে অনেকগুলি প্রোলোগ-এর মতো এক্সটেনশন রয়েছে। মিনিক্যানরেনের এই "ব্যবহারিক" ব্যবহারটি শিল্পে মিনি ক্যানরেনের বেশিরভাগ ব্যবহারের জন্য দায়ী বলে মনে হয়। প্রোগ্রামাররা যারা ক্লোজার বা পাইথন বা জাভাস্ক্রিপ্টে লিখিত একটি বিদ্যমান অ্যাপ্লিকেশনটিতে একটি জ্ঞান-ভিত্তিক যুক্তি ব্যবস্থা যুক্ত করতে চান তারা সাধারণত তাদের পুরো অ্যাপ্লিকেশন প্রোগলে পুনর্লিখন করতে আগ্রহী নন। ক্লোজার বা পাইথনে একটি ছোট লজিক প্রোগ্রামিং ভাষা এম্বেড করা আরও বেশি আবেদনময়ী। একটি এম্বেড থাকা প্রোলোগ বাস্তবায়ন সম্ভবত এই উদ্দেশ্যে, ঠিক পাশাপাশি কাজ করবে।
প্রোলোগের সাথে একইভাবে ব্যবহারিক এমবেডেড লজিক প্রোগ্রামিং ল্যাঙ্গুয়েজ হিসাবে মিনিক্যানরেনকে ব্যবহার করার পাশাপাশি, "রিলেশনাল" প্রোগ্রামিংয়ের গবেষণার জন্য miniKanren ব্যবহার করা হচ্ছে। এটি হ'ল প্রোগ্রামগুলিতে লিখিত যেগুলি গাণিতিক ফাংশনের চেয়ে গাণিতিক সম্পর্ক হিসাবে আচরণ করে। উদাহরণস্বরূপ, স্কিম মধ্যে append
ফাংশন দুটি তালিকা সংযুক্ত করতে পারবেন, একটি নতুন তালিকা ফেরার: ফাংশন কল (append '(a b c) '(d e))
তালিকা ফেরৎ (a b c d e)
। আমরা যাইহোক, append
দ্বি-আর্গুমেন্ট ফাংশন না করে তিন স্থানের সম্পর্ক হিসাবেও আচরণ করতে পারি । কলটি (appendo '(a b c) '(d e) Z)
তখন যুক্তির সাথে চলকের Z
তালিকার সাথে যুক্ত হবে (a b c d e)
। অবশ্যই যখন আমরা অন্যান্য অবস্থানে লজিক ভেরিয়েবল রাখি তখন জিনিসগুলি আরও আকর্ষণীয় হয়। কল (appendo X '(d e) '(a b c d e))
সহযোগীদের X
সঙ্গে (a b c)
, যখন কল(appendo X Y '(a b c d e))
সহযোগী X
এবং Y
তালিকার জোড়গুলির সাথে যা যুক্ত করা হলে সমান (a b c d e)
। উদাহরণস্বরূপ X
= (a b)
এবং Y
= (c d e)
মানগুলির মধ্যে এমন একটি জোড়া। আমরা লিখতে পারি (appendo X Y Z)
, যা তালিকার অসীম অনেক triples উত্পাদন করা হবে X
, Y
এবং Z
এই ধরনের সংযোজন যে X
করতে Y
উৎপন্ন Z
।
এই সম্পর্কিত সংস্করণটি append
সহজেই প্রোলগে প্রকাশ করা যায় এবং প্রকৃতপক্ষে অনেক প্রোলোগ টিউটোরিয়ালে প্রদর্শিত হয়। অনুশীলনে, আরও জটিল প্রোলোগ প্রোগ্রামগুলি কমপক্ষে কয়েকটি অতিরিক্ত-লজিক্যাল বৈশিষ্ট্যগুলি ব্যবহার করে, যেমন কাটা, যা ফলস্বরূপ প্রোগ্রামটিকে একটি সম্পর্ক হিসাবে গণ্য করার ক্ষমতাকে বাধা দেয়। বিপরীতে, miniKanren স্পষ্টতই এই স্টাইলটি রিলেশনাল প্রোগ্রামিং সমর্থন করার জন্য ডিজাইন করা হয়েছে। MiniKanren এর আরো সাম্প্রতিক সংস্করণে (প্রতীকী বাধ্যতা সমাধানের জন্য সমর্থন আছে symbolo
, numbero
,absento
, বৈষম্য সীমাবদ্ধতা, নামমাত্র লজিক প্রোগ্রামিং) সম্পর্ক হিসাবে তুচ্ছ-তুচ্ছ প্রোগ্রাম লিখতে আরও সহজ করে তোলে। অনুশীলনে আমি কখনই মিনিকেনরেনের অতিরিক্ত-লজিকাল বৈশিষ্ট্যগুলি ব্যবহার করি না এবং আমি আমার মিনি ক্যানারেনের সমস্ত প্রোগ্রামকে সম্পর্ক হিসাবে লিখি। সবচেয়ে আকর্ষণীয় রিলেশনাল প্রোগ্রামগুলি হ'ল স্কিমের একটি উপসেটের জন্য সম্পর্কযুক্ত দোভাষী। এই দোভাষীদের অনেক আকর্ষণীয় ক্ষমতা রয়েছে যেমন তালিকার মূল্যায়ন করে এমন এক মিলিয়ন স্কিম প্রোগ্রাম তৈরি করা (I love you)
বা তুচ্ছভাবে কুইন উত্পন্ন করা (যে প্রোগ্রামগুলি নিজেরাই মূল্যায়ন করে)।
miniKanren প্রোগ্রামিংয়ের এই সম্পর্কিত স্টাইলকে সক্ষম করতে বেশ কয়েকটি ট্রেড-অফ করে, যা ট্রেড-অফ প্রোলোগের তুলনায় খুব আলাদা। সময়ের সাথে সাথে মিনিকেনরে আরও প্রতীকী প্রতিবন্ধকতা যুক্ত করেছে, যা সত্যই প্রতীকীমুখী প্রতিবন্ধী লজিক প্রোগ্রামিং ভাষা হয়ে উঠেছে। অনেক ক্ষেত্রে এই প্রতীকী বাধাগুলি অতিরিক্ত-লজিকাল অপারেটরগুলি পছন্দ করতে condu
এবং এড়াতে ব্যবহারিক করে তোলে project
। অন্যান্য ক্ষেত্রে, এই প্রতীকী বাধাগুলি পর্যাপ্ত নয়। প্রতীকী সীমাবদ্ধতার জন্য আরও ভাল সমর্থন হ'ল মিনিকেনরেন গবেষণার একটি সক্রিয় ক্ষেত্র, সেইসাথে আরও বৃহত্তর এবং আরও জটিল প্রোগ্রামগুলি কীভাবে সম্পর্ক হিসাবে লিখতে হবে তার বিস্তৃত প্রশ্নের পাশাপাশি।
সংক্ষেপে, মিনিকেনরেন এবং প্রোলোগ উভয়েরই আকর্ষণীয় বৈশিষ্ট্য, বাস্তবায়ন এবং ব্যবহার রয়েছে এবং আমি মনে করি এটি উভয় ভাষা থেকে ধারণাগুলি শেখার পক্ষে উপযুক্ত। অন্যান্য খুব আকর্ষণীয় লজিক প্রোগ্রামিং ভাষা রয়েছে যেমন বুধ, কারি এবং গডেল, যার প্রত্যেকটির নিজস্ব যুক্তিযুক্ত প্রোগ্রামিং রয়েছে।
আমি কয়েক মিনি ক্যানারেন সংস্থান দিয়ে শেষ করব:
মূল মিনিকেনরেন ওয়েবসাইট:
http://minikanren.org/
এক সাক্ষাৎকারে আমি রিলেশনাল প্রোগ্রামিং এবং miniKanren, Prolog সঙ্গে একটি তুলনামূলক সহ দিয়েছেন:
http://www.infoq.com/interviews/byrd-relational-programming-minikanren
চিয়ার্স,
--ইচ্ছাশক্তি