A+B:-findall(X,(append(X,Y,A),append(Y,X,A)),[_|Z]),length(Z,B).
এটি অনলাইন চেষ্টা করুন!
একটি প্রাকটিকে সংজ্ঞায়িত করে +/2
যা তার প্রথম যুক্তি ( A
) হিসাবে একটি অক্ষর (অক্ষর কোডের তালিকার আকারে ) নেয় এবং তার দ্বিতীয় যুক্তি ( B
)টিকে সর্বোচ্চ অর্ডারের প্রতিসম ঘূর্ণনের ক্রমে সেট করে ।
ব্যাখ্যা
এই প্রোগ্রামটি এই সত্যটি ব্যবহার করে যে কোনও স্ট্রিংয়ের প্রতিসাম্য ঘূর্ণনের সেটটি একটি চক্রীয় গোষ্ঠী এবং তাই প্রতিসম ঘূর্ণনের সেটটির ক্রমটি সর্বোচ্চ ক্রমের প্রতিসম ঘূর্ণনের ক্রমের সমান। সুতরাং প্রোগ্রামটি ইনপুট স্ট্রিংয়ে প্রতিসাম্য ঘূর্ণনের মোট সংখ্যা খুঁজে বার করে কাঙ্ক্ষিত ফলাফল গণনা করতে সক্ষম হয়।
কোড ব্যাখ্যা
ভারী উত্তোলনের সিংহভাগই findall/3
প্রিডিটকে কল করে সম্পন্ন হয় । findall/3
সম্পৃক্ত প্রথম আর্গুমেন্ট (জন্য সব বিভিন্ন সম্ভাব্য মান খুঁজে বের করে X
এই ক্ষেত্রে) যেমন যে অভিব্যক্তি দ্বিতীয় যুক্তি হিসেবে দেওয়া (সত্য (append(X,Y,A),append(Y,X,A))
, সেটিতে আরো পরে)। শেষ অবধি এটি X
চূড়ান্ত যুক্তিতে ( [_|Z]
) যুক্তি হিসাবে এই সম্ভাব্য প্রতিটি মানকে সংরক্ষণ করে ।
অভিব্যক্তি মধ্যে পাস findall/3
দ্বিতীয় arugment হিসেবে (append(X,Y,A),append(Y,X,A))
ব্যবহার append/3
করে নির্দিষ্ট করার সম্পৃক্ত X
কিছু এখনো অনির্দিষ্ট সঙ্গে ঘনিভূত Y
সমান হতে হবে A
, ইনপুট স্ট্রিং, এবং একই যে Y
সঙ্গে ঘনিভূত X
আবশ্যক এছাড়াও সমান হতে A
। এর অর্থ এটির X
কিছু উপসর্গ হতে হবে A
এটি যদি সামনে থেকে সরানো A
হয় এবং পিছনে যুক্ত করা হয় তবে ফলস্বরূপ স্ট্রিংটি সমান A
। X
এই সম্পত্তির সাথে গুলিগুলির সেটটির প্রতিসাম্যিক ঘূর্ণনের সাথে প্রায় একের সাথে চিঠিপত্র থাকে A
। ডাবল কাউন্টিংয়ের সর্বদা ঠিক একটি ক্ষেত্রে রয়েছে যা খালি স্ট্রিং এবং A
এর উপসর্গ উভয়ের কারণে ঘটেA
যা 0-ঘূর্ণনের সাথে সামঞ্জস্য করে A
। যেহেতু 0
এর -rotation A
সবসময় প্রতিসম ফলে তালিকার দৈর্ঘ্য হল X
s থেকে findall/3
উপর প্রতিসম ঘুর্ণন সংখ্যার চেয়ে এক বেশি হবে A
।
দ্বিগুণ গণনা সমস্যা সমাধানের জন্য, আমি findall/3
প্রেডিকেটের তৃতীয় যুক্তির সাথে প্যাটার্ন মিলটি ব্যবহার করি use প্রোলোগের তালিকায় তাদের মাথার জোড়া (প্রথম উপাদান) এবং তাদের লেজ (বাকি অংশ) হিসাবে উপস্থাপিত হয়। সুতরাং এমন [_|Z]
একটি তালিকা প্রতিনিধিত্ব করে যার লেজ সমান Z
। এর অর্থ Z
হ'ল দৈর্ঘ্যটি প্রিডিকেট দ্বারা পাওয়া উপসর্গের সংখ্যার চেয়ে কম findall/3
এবং এইভাবে প্রতিসাম্যের ঘূর্ণনের সংখ্যার সমান A
। অবশেষে, আমি দৈর্ঘ্যের উপর length/2
সেট B
করতে প্রিডিকেট ব্যবহার করি Z
।