টিপল কনস্ট্রাক্টর এবং কনস পেয়ার হিসাবে পাটিগণিত অপারেটরগুলি ব্যবহার করুন
যদি আপনার দুটি বা ততোধিক মান সমন্বিত একটি একক কাঠামো পাস করতে হয় তবে সর্বাধিক সুস্পষ্ট জিনিসটি হল একটি তালিকা is [A,B]
। যদিও এটি সত্যই ভার্জোজ।
একটি বিকল্প আছে। প্রোলোগ মানগুলি একটি বেশ অনেকগুলি স্বেচ্ছাচারিত নেস্টেড কাঠামো সংরক্ষণ করতে পারে, যা মূল্যায়ন করা হয় না। এটি কীভাবে কাজ করে তা দেখানোর একটি উদাহরণ এখানে:
| ?- member(member(A,B),C).
C = [member(A,B)|_] ? ;
C = [_,member(A,B)|_] ? ;
(etc.)
member(A,B)
এই পরিস্থিতিতে একটি নামমাত্র tuple, এবং বাইরের member
(যা একটি ফাংশন কল) এটি এটিকে আচরণ করে।
যদিও নামযুক্ত টিপলগুলি নন-গল্ফড প্রোলোগ প্রোগ্রামিংয়ে মোটামুটি কার্যকর, তারা তালিকার পদ্ধতির চেয়ে আরও ভার্জিক মনে হতে পারে। তবে, আমরা টিউপল কনস্ট্রাক্টরের নামে যথেষ্ট পরিমাণে স্বেচ্ছাচারিত অক্ষর ব্যবহার করতে পারি (ধরে নিচ্ছি তারা সঠিকভাবে উদ্ধৃত হয়েছে); মত সুন্দর কিছু member
বা একক চরিত্রের পরিবর্তে a
আমরা এরকম কিছু করতে পারি:
| ?- A = '-'('/'(1,2), '/'(3,4)).
A = 1/2-3/4
এখানে, আমাদের টুপল কনস্ট্রাক্টররা হলেন '-'
এবং '/'
। এবং চমত্কারভাবে মুদ্রকযন্ত্রগুলি তাদের সাথে কী করেছে তা লক্ষ্য করা আকর্ষণীয়; এটি টিপলসগুলির জন্য ইনফিক্স স্বরলিপি ব্যবহার করছে। এটি সত্যই সংক্ষিপ্ত এবং তুলনামূলক পাটিগণিত ক্রিয়াকলাপটি একইভাবে পার্স করে। (এই এছাড়াও ব্যাখ্যা দিয়েছে কেন গাণিতিক ব্যবহারসমূহ is
না =
; A = 1+2
ঐক্যসাধন হবে A
সঙ্গে tuple '+'(1,2)
, তাই পৃথক সিনট্যাক্স আসলে unevaluated গাণিতিক এক্সপ্রেশন নির্ণয় করা প্রয়োজন হয়।) কারণ একটি tuple কন্সট্রাকটর নামক করা হয়েছে কিছু , আপনি ভাল হিসাবে একটি অক্ষর একটি বাহুল্যবর্জিত আছে ব্যবহার করতে পারেন বাক্য গঠন (এবং একটি বোনাস হিসাবে, -
এবং/
নন-গল্ফ কোডগুলিতে খুব সাধারণ পছন্দগুলি হ'ল তারা যখন অর্থবোধক কিছু না করে দ্রুত নিক্ষেপকারী টুপল কনস্ট্রাক্টর চান, প্রায় একইভাবেi
একটি লুপ ভেরিয়েবল হিসাবে প্রায়শই ব্যবহৃত হয়, তাই যদি কোনও কারণে আপনি সেখানে টুপল চান তবে এটি আপনার ইনপুট এবং আউটপুটটিতে ব্যবহার করা সম্পূর্ণ যুক্তিসঙ্গত)
'-'
এবং '/'
টিউপল কনস্ট্রাক্টরদের জন্য ভাল পছন্দ কারণ তাদের ভাল আচরণ এবং কার্যকর নজির রয়েছে, আপনাকে টিপল লিটারেলগুলি অল্পরকমভাবে লিখতে দেয়। যাইহোক, নোট করুন যে প্রোগ্রামের মধ্যে অন্তর্বর্তী মানগুলি উত্পাদিত হওয়ার পরে আপনার অগ্রাধিকার সম্পর্কে চিন্তা করার দরকার নেই। প্রোলোগ সোর্স কোডের পরিবর্তে গাছ হিসাবে সংরক্ষণ করা টিপলগুলিকে রাখে এবং চমত্কার-মুদ্রকগুলি এটিকে দ্ব্যর্থহীনভাবে আউটপুট দিতে পারে:
| ?- A = '-'('-'(1,2), '-'(3,4)).
A = 1-2-(3-4)
কারণ টিপল সিনট্যাক্সটি এত সংক্ষিপ্ত (এর f(A,B)
চেয়ে কম নয়)f(A-B)
), আপনি বিনা ব্যয়ে টুপলসের সাথে একাধিক পূর্বাভাস যুক্তিগুলি প্রতিস্থাপন করতে পারেন, অর্থাত্ যদি কোনও প্রাক্টিকেট তার দুটি বা ততোধিক যুক্তি অন্য একটি শিকারীর কাছে প্রেরণের প্রয়োজন হয় তবে আপনি প্রায়শই সেগুলিতে তৈরি করতে পারেন একটি টিউপল এবং কেবলমাত্র টিউপলটি পাস করুন (যদিও এটি টিপল কন্সট্রাক্টর এবং কমাগুলির উপযুক্ত মিশ্রণ ব্যবহার করার জন্য, প্রিডিকেট ছাড়াও প্রিকিকেটে সমস্ত কল পরিবর্তন করতে হবে)।
এই বাক্য গঠনটির আর একটি সুবিধা হ'ল যদি আপনাকে অভ্যন্তরীণভাবে তালিকাগুলি ব্যবহারের প্রয়োজন হয় (স্ট্যান্ডার্ড পূর্বাভাসের সাথে ইন্টারঅ্যাক্টের চেয়ে); একটি তালিকা মূলত নেস্টেড কনস সেলগুলির একটি সেট, এবং একটি কনস কনস কনস্ট্রাক্টরের সাথে একটি কোষ কেবল '.'
এখানে দেখা যায়:
| ?- Q = '.'('.'(A,B),'.'(C,D)).
Q = [[A|B],C|D]
যদি আপনার কোডগুলি "ম্যানুয়ালি" তালিকাগুলি ব্যবহার করে, তবে এর চেয়ে কম ভারী টুপল কনস্ট্রাক্টরটি ব্যবহার করা অনেক অর্থবোধ করতে পারে '.'
। আমার পক্ষে একটি সাধারণ পছন্দটি হ'ল কনস কনসকে প্রতিনিধিত্ব করা '/'(Tail,Head)
(কারণ এটি অক্ষর নষ্ট না করে আপনি ডিবাগ আউটপুটে পেতে পারেন এমন সর্বাধিক পঠনযোগ্য)। মনে রাখবেন আপনি সম্ভবত নিজের []
সমতুল্যও চাইবেন ; আপনি ব্যবহার করতে পারে[]
তবে এটি দুটি বাইট দীর্ঘ, এবং এর পরিবর্তে আপনি ব্যবহার করতে পারেন এমন প্রচুর পরিমাণে একটি বাইট পরমাণু (সমস্ত ছোট হাতের অক্ষর) রয়েছে।
সুতরাং উদাহরণস্বরূপ, নিম্নলিখিত তালিকা:
[1,2,3]
একই সংখ্যক অক্ষরগুলিতে ম্যানুয়াল উপস্থাপনায় রূপান্তরিত হতে পারে:
x/3/2/1
[H|T]
স্টাইলের প্যাটার্ন ম্যাচগুলি এখন আরও নিখুঁতভাবে লেখা যেতে পারে T/H
এবং এই খালি তালিকার বিরুদ্ধে একটি পরীক্ষার x
চেয়ে আরও দীর্ঘায়িত হওয়ার সুবিধাটি অর্জন করে []
। (অবশ্যই, এই সুস্পষ্ট অসুবিধা হল যে দিয়ে আসে member
, append
ইত্যাদি এই প্রতিনিধিত্ব কাজ করবে না।)
prolog
ট্যাগ ধরণ অনর্থক। আমাদের কাছে ইন্টারপ্লেট প্রোলজ চ্যালেঞ্জ না থাকলে আমাদের এটির দরকার নেই।