এই উত্তরটি আমার এবং 0 'এর মধ্যে একটি সহযোগিতার অংশ। আমরা দুজনেই এটি নিয়ে একসাথে কাজ করেছি, আমি এটি পোস্ট করার একমাত্র কারণ হ'ল আমি রক, পেপার, কাঁচি জিতেছি।
\Q-->{Q=1};"(",\N,")",\B,{findnsols(N,I,(between(2,inf,I),\+ (between(3,I,U),0=:=I mod(U-1))),L)->append(_,[Y],L),Q is Y*B}.
এটি অনলাইন চেষ্টা করুন!
ব্যাখ্যা
এই উত্তরটি প্রলজ মজার ক্ষেত্রে গল্ফিংকে কী করে তোলে তার একটি নিখুঁত অনুকরণীয়।
এই উত্তরটি নির্দিষ্ট ক্লজ ব্যাকরণগুলির জন্য প্রোলোগুলি শক্তিশালী সিস্টেম ব্যবহার করে। এখানে আমাদের ব্যাকরণটি কিছুটা অবলম্বিত।
head(1)-->[].
head(Q)-->"(",head(N),")",head(B),{prime(N,Y),Q is Y*B}.
isprime(I):- \+ (between(3,I,U),0 =:= I mod(U-1)).
prime(N,Y):-
findnsols(N,I,(
between(2,inf,I),
isprime(I)
),L),
append(_,[Y],L),!.
প্রথম নির্মাণের নিয়মটি হ'ল:
head(1)-->[].
এটি প্রোলগকে বলে যে খালি স্ট্রিংটি 1 এর সাথে মিলে যায়।
আমাদের নির্মাণের দ্বিতীয় নিয়ম একটি সামান্য বিট আরও জটিল।
head(Q)-->"(",head(N),")",head(B),{prime(N,Y),Q is Y*B}.
এটি আমাদের জানায় যে কোনও অ শূন্য স্ট্রিংয়ে একই বিধিগুলির সাথে একটি ধারাটির চারপাশে এই একই বিধিগুলির সাথে একটি ধারাটির ডানদিকে বন্ধনী রয়েছে।
এটি আমাদের এও বলে যে এই ধারা ( Q
) এর মানটি বিধি অনুসরণ করে:
{prime(N,Y),Q is Y*B}
এটিকে ভঙ্গ করা, Q
2 সংখ্যা Y
এবং এর গুণফল B
। B
বাম দিকে কেবল ক্লজের মান এবং Y
এটি প্রথম N
স্তরের যেখানে N
প্রথম বন্ধনের অভ্যন্তরে ক্লজের মান।
এই নিয়মটি ফ্যাক্টর গাছের গঠনের উভয় নিয়মকে অন্তর্ভুক্ত করে
- সংঘটন বহুগুণ
- বেষ্টনী নবম প্রধান লাগে
ভবিষ্যদ্বাণীপূর্ণ সংজ্ঞা জন্য। অবারিত সংস্করণে খেলতে দুটি পূর্বাভাস রয়েছে (আমার আসল কোডে আমি ভবিষ্যদ্বাণীগুলি দূরে সরিয়ে রেখেছি)। এখানে দুটি প্রাসঙ্গিক পূর্বাভাস হ'ল , যা isprime/1
কোন মৌলিক সংখ্যার সাথে মেলে এবং prime/2
কোনটি প্রদত্ত N
এবং Y
যদি মিলিত Y
হয় তবে যদি N
প্রধানতম হয়। প্রথম আমাদের আছে
isprime(I):- \+ (between(3,I,U),0 =:= I mod(U-1)).
এটি আদিমতার একটি সুন্দর মান সংজ্ঞা কাজ করে, আমরা জোর দিয়ে বলছি যে 2 I
সহ 2 এর মধ্যে কোনও সংখ্যা নেই তবে I
বিভাজন নয় I
।
পরবর্তী শিকারীটিও বেশ সহজ
prime(N,Y):-
findnsols(N,I,(
between(2,inf,I),
isprime(I)
),L),
append(_,[Y],L),!.
আমরা findnsols
প্রথম N
সংখ্যাগুলি খুঁজে পেতে ব্যবহার করি যা প্রধান, আমরা তারপরে সর্বশেষটি ফিরে আসি। এখানে কৌশলটি হ'ল যদিও ক্ষুদ্রতম প্রাইমগুলি findnsols
খুঁজে পাওয়ার গ্যারান্টি নেই তবে এসডাব্লুআই যেভাবে পরিচালনা করে তা এর ফলে সবসময়ই ছোট ছোট প্রাইমগুলি খুঁজে পাওয়া যায় find এর অর্থ এই যে আরও প্রাইম সন্ধান করা থেকে বিরত রাখতে আমাদের কাটাতে হবে। N
between
গল্ফস
আমরা আমাদের কোডে দু'বার যুক্তি ফরোয়ার্ড করতে পারি। যেহেতু isprime
শুধুমাত্র একবার ব্যবহৃত হয় তখন এর সংজ্ঞাটি ভিতরে স্থানান্তরিত হতে পারে prime
। পরের এক সরানো হয় prime
DCG ভেতরে সরাসরি অবশ্য যেহেতু আমরা একটি কাটা ব্যবহার prime
রোধ করার জন্য findnsols
অনেকগুলি মৌলিক আমরা একটি বিষয় একটি বিট আছে উত্পাদক থেকে। কাটটি, আমরা চাই কেবলমাত্র বিটের পরিবর্তে পুরো ডিসিজি কেটে দেয়। কিছুটা ডকুমেন্টেশন খননের পরে আমরা দেখতে পেলাম যে once/1
কেবল এই অংশটি কাটতে ব্যবহার করা যেতে পারে তবে পুরো ডিসিজি না। তবে আরও ডকুমেন্টেশন খননের মাধ্যমে জানা গেছে যে ->
অপারেটরটিও একই ধরণের কাজ সম্পাদন করতে ব্যবহৃত হতে পারে। ->
অপারেটর মোটামুটিভাবে সমতূল্য ,!,
তাই আমরা অন্য দিকে আমাদের কাটা সরানো append/3
এবং এটি প্রতিস্থাপিত ->
।
এসডাব্লুআই-প্রোলগে পূর্বাভাস (এবং নিয়মগুলি) অপারেটরদের নাম হিসাবে দেওয়া যেতে পারে যা আমাদের সাধারণত প্রয়োজনীয় বন্ধনীগুলি ফেলে দিতে দেয়। এর মাধ্যমে আমরা নিয়মটি কল করে 6 বাইট সংরক্ষণ করতে পারি \
।