প্রোলোগের সাথে কোনও প্রোগ্রামিং ভাষার মতো সমস্যার সমাধানের জন্য এটি ঘোষণামূলক বা আবশ্যকীয়, সমাধানের উপস্থাপনা এবং ইনপুট সম্পর্কে আপনাকে ভাবতে হবে।
যেহেতু এটি একটি প্রোগ্রামিং প্রশ্ন, এটি স্ট্যাকওভারফ্লো ডটকমে জনপ্রিয় হয়ে উঠত যেখানে প্রোগ্রামাররা প্রোগ্রামিং সমস্যাগুলি সমাধান করে। এখানে আমি আরও বৈজ্ঞানিক হওয়ার চেষ্টা করব।
ওপিতে সমস্যা সমাধানের জন্য একটিকে ইনপুটতে বর্ণিত নির্ভরতাগুলির দ্বারা সংজ্ঞায়িত সম্পর্কটিকে বিপরীত করতে হবে। উপস্থিতি form ফর্মের ধারাগুলি বিপরীত করা সহজ। ক্লোজস পছন্দ করতেএ টি টি ই এন ডি ( এ ডি ) ∧ এ টি টি ই এন ডি ( বি এম ) → এ টি টি ই এন ডি ( ডি ডি )এ টি টি ই এন ডি( এক্স) → এ টি টি ই এন ডি( ওয়াই) ∧ এ টি টি ই এন ডি( জেড)এ টি টি ই এন ডি( এ ডি ) ∧ এ টি টি ই এন ডি( বি এম) → এ টি টি ই এন ডি( ডি ডি )
ডেইজি ডডডেরিজ বলেছেন, আলবাস ডাম্বলডোর এবং বার্ডক মুলডুন দুজনেই এলে তিনি আসতেন
চিকিত্সা করা আরও কঠিন।
প্রোলোগের সাথে প্রথম সহজ পদ্ধতির মধ্যে রয়েছে সম্পর্কের পুরোপুরি বিপর্যয় এড়ানো এবং পরিবর্তে লক্ষ্য হওয়া।
অতিথির তালিকায় অর্ডার গ্রহণ করুন এবং একটি নিয়ম ব্যবহার করুন
⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪এ ( এক্স) ∧ এ ( ওয়াই ))এ ( ডাব্লু)এ ( ডাব্লু)এক্সওয়াই→ এ ( জেড)) ,→ এ ( এক্স) ,→ এ ( ওয়াই) ,< জেড,< জেড⎫⎭⎬⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⊢এ ( ডাব্লু) → এ ( জেড ))
(আমরা ব্যবহার পরিবর্তে এটা সংক্ষিপ্ত রাখার)এ টি টি ই এন ডি ( এক্স )এ ( এক্স)এ টি টি ই এন ডি( এক্স)
এই নিয়মটি কার্যকর করা সহজ।
একটি বরং নিষ্পাপ পদ্ধতির
পঠনযোগ্যতার জন্য follows
একটি ইনপুট হিসাবে দেওয়া সম্পর্কটি হোক এবং brings
এর বিপরীত হোক।
তারপরে ইনপুট দেওয়া হয়
follows(bm,[ad]).
follows(cp,[ad]).
follows(ad,[cp]).
follows(dd,[cp]).
follows(ad,[ec]).
follows(bm,[ec]).
follows(cp,[ec]).
follows(cp,[fa]).
follows(dd,[fa]).
follows(bm,[cp,dd]).
follows(ec,[cp,dd]).
follows(fa,[cp,dd]).
follows(dd,[ad,bm]).
এবং brings
নিম্নলিখিত হিসাবে সংজ্ঞায়িত করা যেতে পারে:
brings(X,S):-brings(X,S,[]).
brings(_X,[],_S).
brings(X,[X|L],S):-brings(X,L,[X|S]).
brings(X,[Y|L],S):-follows(Y,[X]),brings(X,L,[Y|S]).
brings(X,[Y|L],S):-follows(Y,[A,B]),
member(A,S),member(B,S),brings(X,L,[Y|S]).
এখানে তৃতীয় যুক্তিটি brings/3(X,L,S)
হ'ল অতিথিদের তালিকা যা উপস্থিত থাকলে ইতিমধ্যে উপস্থিত হওয়া প্রমাণিত হয়েছিল ।এক্স
যদি আমরা সংজ্ঞায়িত করি
partymaker(X):-Guests=[ad,bm,cp,dd,ec,fa],member(X,Guests),brings(X,Guests).
আমরা নিম্নলিখিত অনন্য সমাধান পেতে:
[ad,ec]
বর্ণমালা অনুসারে ধারাটির আদেশ অনুসারে এটি সম্পূর্ণ তালিকা নয়
follows(bm,[cp,dd]).
কাজ করছে না.
মূল ধাঁধাটির পরিবর্তে জড়িত সমাধান
সমস্যাটি সম্পূর্ণরূপে সমাধান করার জন্য আপনাকে অনুসন্ধানের ট্রিটিতে অসীম লুপগুলি প্রবর্তন না করেই সিস্টেমটিকে পরবর্তী অতিথিদের উপস্থিতি প্রমাণ করার চেষ্টা করতে হবে। এই লক্ষ্যটি অর্জনের একাধিক উপায় রয়েছে। প্রত্যেকের এর সুবিধা এবং অসুবিধা রয়েছে।
একটি উপায় brings/2
নিম্নলিখিত হিসাবে নতুন সংজ্ঞা দেওয়া হয়:
brings(X,S):-brings(X,S,[],[]).
% brings(X,RemainsToBring,AlreadyTaken,AlreadyTried).
%
% Problem solved
brings(_X,[],_S,_N).
% Self
brings(X,[X|L],S,N):-brings(X,L,[X|S],N).
% Follower
brings(X,[Y|L],S,N):-follows(Y,[X]),brings(X,L,[Y|S],N).
% Y is not a follower, but X can bring 2
brings(X,[Y|L],S,N):- \+member(Y,N),\+follows(Y,[X]),
follows(Y,[A,B]),
try_bring(X,A,L,S,[Y|N]),
try_bring(X,B,L,S,[Y|N]),brings(X,L,[Y|S],N).
% Y is not a follower, but X can bring 1
brings(X,[Y|L],S,N):- \+member(Y,N),\+follows(Y,[X]),\+follows(Y,[_A,_B]),
follows(Y,[C]),
try_bring(X,C,L,S,[Y|N]),brings(X,L,[Y|S],N).
try_bring(_X,A,_L,S,_N):-member(A,S).
try_bring(X,A,L,S,N):- \+member(A,S),sort([A|L],Y),brings(X,Y,S,N).
brings/4
অসীম লুপটি এড়ানোর জন্য শেষ যুক্তিটি প্রয়োজনীয় try_bring
।
এটি নিম্নলিখিত উত্তর দেয়: অ্যালবাস, কার্লোটা, এলফ্রিডা এবং ফ্যালকো। তবে এই সমাধানটি সর্বাধিক দক্ষ নয় কারণ ব্যাকট্র্যাকিং চালু করা হয়েছে যেখানে এটি কখনও কখনও এড়ানো যায়।
একটি সাধারণ সমাধান
মূল প্রশ্নের সাথে তৃতীয় আন্তর্জাতিক নোকুগ এসকিউএল এবং নোএসকিউএল চ্যালেঞ্জের লিঙ্কটি যুক্ত হওয়ার পরে, এটি স্পষ্ট হয়ে গেল যে আমরা যা করছি অতিথিদের সেটগুলির সাবসেটের সেটগুলিতে একটি সাধারণ রিহ্যাবিলিটি চেকার, যেখানে স্থানান্তরের সম্পর্কটি সংজ্ঞায়িত করা হয় বিধি যেমন প্রয়োগ করা হয়েছে সেই নিয়মটি রক্ষিত আদেশ isr ( এক্স, এস) : ভি→ ভি'
যদি তারপর ।এস⊆ ভিভী'= ভি∪ { এক্স}
ভীইউভী
add_element(X,V,U):- ( var(V) -> % set difference that works in both modes
member(X,U),subtract(U,[X],V);
\+member(X,V),sort([X|V],U) ).
support(V,U):- guests(G), % rule application
member(X,G),
add_element(X,V,U),
follows(X,S),
subset(S,V).
set_support(U,V):- support(V1,U), % sort of a minimal set
( support(_V2,V1) ->
set_support(V1,V) ;
V = V1).
is_duplicate(X,[Y|L]):- ( subset(Y,X) ; is_duplicate(X,L) ).
% purging solutions that are not truly minimal
minimal_support(U,L):-minimal_support(U,[],L).
minimal_support([],L,L).
minimal_support([X|L],L1,L2):-( append(L,L1,U),is_duplicate(X,U) ->
minimal_support(L,L1,L2);
minimal_support(L,[X|L1],L2) ).
solution(L):- guests(G),setof(X,set_support(G,X),S),
minimal_support(S,L).
এখন উদাহরণস্বরূপ যদি ডেটাসেট # 2 দেওয়া হয়
follows(fa,[dd,ec]).
follows(cp,[ad,bm]).
guests([ad,bm,cp,dd,ec,fa]).
আমরা উত্তর পেয়েছি এল = [[বিজ্ঞাপন, বিএম, ডিডি, ইস]]। যার অর্থ কার্লোট এবং ফ্যালকো বাদে সমস্ত অতিথিকে আমন্ত্রিত করতে হবে।
এই সমাধানের উত্তরগুলি আমাকে ডাইসেট # 6 ব্যতীত উইকড উইচ নিবন্ধে প্রদত্ত সমাধানগুলির সাথে মেলে যেখানে আরও সমাধান উত্পন্ন হয়েছিল। এটি সঠিক সমাধান বলে মনে হচ্ছে।
শেষ অবধি, আমাকে প্রোলোগের সিএলপি (এফডি) লাইব্রেরির উল্লেখ করতে হবে যা এই ধরণের সমস্যার জন্য বিশেষভাবে উপযুক্ত।
attend(BM) :- attend(AD).
ঠিকattend(X) :- attend(Y).