প্রোগল দিয়ে সীমাবদ্ধতা সন্তুষ্টির সমস্যাগুলি সমাধান করা যেতে পারে?


18

প্রলোগে "পার্টি উপস্থিতি" ধরণের সমস্যাগুলি কি সমাধানযোগ্য? উদাহরণ স্বরূপ:

বারডক মুলদুন এবং কার্লোটা পিংকস্টোন দুজনেই বলেছিলেন যে আলবাস ডাম্বলডোর এলে তারা আসত। অ্যালবাস ডাম্বলডোর এবং ডেইজি ডডডেরিজ দুজনেই বলেছিলেন কার্লোটা পিঙ্কস্টোন এলে তারা আসত। অ্যালবাস ডাম্বলডোর, বারডক মুলডুন এবং কার্লোটা পিংকস্টোন সবাই বলেছিলেন এলফ্রিডা ক্ল্যাগ এলে তারা আসবে। কার্লোটা পিংকস্টোন এবং ডেইজি ডডডেরিজ দুজনেই বলেছিলেন যে ফ্যালকো এসালন এলে তারা আসবে। বারডক মুলদুন, এলফ্রিডা ক্ল্যাগ এবং ফ্যালকো এসালন সকলেই বলেছিলেন যে কার্লোটা পিংকস্টোন এবং ডেইজি ডডডেরিজ দুজনেই এলে তারা আসত। ডেইজি ডডডেরিজ বলেছিলেন যে আলবাস ডাম্বলডোর এবং বার্ডক মুলডুন দুজনেই এলে তিনি আসতেন। কারা তার সমস্ত আমন্ত্রিতগণের উপস্থিতি নিশ্চিত করতে পার্টিতে অংশ নিতে রাজি করা দরকার?

আমি জিএনইউ প্রোলগে এটি প্রকাশ করার চেষ্টা করেছি:

attend(BM) :- attend(AD).
attend(CP) :- attend(AD).
attend(AD) :- attend(CP).
attend(DD) :- attend(CP). 
attend(AD) :- attend(EC).
attend(BM) :- attend(EC).
attend(CP) :- attend(EC). 
attend(CP) :- attend(FA).
attend(DD) :- attend(FA).
attend(BM) :- attend(CP),attend(DD).
attend(EC) :- attend(CP),attend(DD).
attend(FA) :- attend(CP),attend(DD).
attend(DD) :- attend(AD),attend(BM).

attend(FA). /* try different seed invitees in order to see if all would attend*/

/* input:
write('invited:'),nl,
  attend(X),write(X),nl,
  fail.*/

আমি স্ট্যাকের ওভারফ্লো (কোনও পুণ্য নয়) ভোগ করছি, এবং প্রলোগ মূল্যায়নের কোনও জ্ঞান নেই, এ কারণেই আমি জিজ্ঞাসা করছি।

সাধারণভাবে বলতে গেলে, এই সমস্যাটি বুলিয়ান সিএনএফ সন্তুষ্টি সূত্রে ছড়িয়ে দেওয়া যেতে পারে (6 বুলিয়ান ভেরিয়েবল সহ)। সুতরাং, প্রোলোগ দৃষ্টিকোণের কোনও যোগ্যতা আছে কি?


2
আমি মনে করি আপনার সমস্যাটি হ'ল বড় হাতের শনাক্তকারীগুলি ভেরিয়েবল হয়, attend(BM) :- attend(AD).ঠিক attend(X) :- attend(Y).
তেমনটাই হ'ল

ছোট অক্ষরের (আদর্শ one.com / w622 জেড ) চেষ্টা করে এখনও একই ফলাফল।
তেগিরি নেনাশি

আমি স্পষ্টতই খুব বেশিদিনে কোনও বুধ / প্রোলজ করিনি, অবশ্যই সোভিকের বক্তব্যটি সঠিক, এবং আপনার প্রথম প্রোগ্রামটি মোটামুটি "কিছু ব্যক্তি ভর্তি হলে কিছু লোককে ভর্তি করা হয়" বলার সাথে মিলে যায়। ভেরিয়েবলগুলি কংক্রিট পদগুলির সাথে প্রতিস্থাপন করে, আপনি তখন আমার উত্তরে বর্ণিত সমস্যার দিকে চলে যান।
বেন

সহজ উত্তরটি হ্যাঁ, "হ্যাঁ," যেহেতু প্রোলোগ একটি টিউরিং-সম্পূর্ণ ভাষা।
ডেভিড রিচার্বি

উত্তর:


13

প্রোলোগের সাথে কোনও প্রোগ্রামিং ভাষার মতো সমস্যার সমাধানের জন্য এটি ঘোষণামূলক বা আবশ্যকীয়, সমাধানের উপস্থাপনা এবং ইনপুট সম্পর্কে আপনাকে ভাবতে হবে।

যেহেতু এটি একটি প্রোগ্রামিং প্রশ্ন, এটি স্ট্যাকওভারফ্লো ডটকমে জনপ্রিয় হয়ে উঠত যেখানে প্রোগ্রামাররা প্রোগ্রামিং সমস্যাগুলি সমাধান করে। এখানে আমি আরও বৈজ্ঞানিক হওয়ার চেষ্টা করব।

ওপিতে সমস্যা সমাধানের জন্য একটিকে ইনপুটতে বর্ণিত নির্ভরতাগুলির দ্বারা সংজ্ঞায়িত সম্পর্কটিকে বিপরীত করতে হবে। উপস্থিতি 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 ব্যতীত উইকড উইচ নিবন্ধে প্রদত্ত সমাধানগুলির সাথে মেলে যেখানে আরও সমাধান উত্পন্ন হয়েছিল। এটি সঠিক সমাধান বলে মনে হচ্ছে।

শেষ অবধি, আমাকে প্রোলোগের সিএলপি (এফডি) লাইব্রেরির উল্লেখ করতে হবে যা এই ধরণের সমস্যার জন্য বিশেষভাবে উপযুক্ত।


সঠিক উত্তরে এফ (যেমন, এ, সি, ই, এফ) অন্তর্ভুক্ত রয়েছে। আপনার হয় হয় নিয়ম টাইপ, বা প্রোগ্রামে আরও গুরুতর সমস্যা।
তেগিরি নেনাশি

নিশ্চিত করা হয়েছে: ideone.com/Q3pqU
তেগিরি নেনাশি

সাইটটি থেকে ডেটা্যাসেট # 2 আইডিয়নে লিঙ্ক করা হয়েছে 2121AmX এটি কাজ করছে বলে মনে হচ্ছে না ...
তেগিরি নেনাশি

আপনার সমাধানটি কি একাধিক বিকল্প (ডেটাসেট # 8) পরিচালনা করে
আদর্শিক.com/

@ টেগিরিণেশি লিঙ্কিত সাইটটিতে 6 "অনুমান করবেন না" অনুমান রয়েছে। আমার সমাধানটি № 2 এবং № 5 পূরণ করে না doesn't 5 ফিক্স করা সহজ বলে মনে হচ্ছে: দুটি "% অনুসরণকারী নয়" বিধি সাধারণীকরণ করুন ize যদি এটি স্থির হয় তবে এটি ডেটাসেট # 8 এর প্রথম উত্তরটি পাওয়া উচিত। অনুমান Until 2 ততক্ষণ সন্তুষ্ট না হওয়া পর্যন্ত উদাহরণস্বরূপ ডেটাসেটগুলির কোনওটিই সঠিকভাবে সমাধান করা যায় না।
দিমিত্রি চুবারভ

10

যেমন সাইক দ্বারা চিহ্নিত, ওপিতে কোডটি সহ প্রথম ইস্যুটি হ'ল বড় হাতের অক্ষরের সাথে শুরু হওয়া নামগুলি প্রোলগের পরিবর্তনশীল। এর admit(CP) :- admit(AD)সমতুল্য attend(X) :- attend(Y), যার ফলস্বরূপ অবিলম্বে একটি অসীম লুপ প্রবেশ করে যা প্রমাণ করার চেষ্টা করে attendযা কিছু মেয়াদ attendধারণ করে যার জন্য এটি একটি মেয়াদ সন্ধান করে ।

তবে, আপনি যদি প্রতিটি আদ্যক্ষরকে বোঝাতে চেয়েছিলেন তবে এটি একটি কংক্রিটের স্বতন্ত্র শব্দ, তবে আপনি এখনও স্ট্যাকের ওভারফ্লোতে চলে যাবেন কারণ আপনার চক্র রয়েছে eg

attend(cp) :- attend(ad).
attend(ad) :- attend(cp).

সুতরাং attend(cp)প্রোলোগ হোল্ড রয়েছে কি না তা নির্ধারণের চেষ্টা করবে attend(ad), যা attend(cp)স্ট্যাক ওভারফ্লো না হওয়া পর্যন্ত এটি যাচাই করবে এবং কী করবে তা নির্ধারণের চেষ্টা করবে ।

আমি বিশ্বাস করি না যে ভ্যানিলা প্রোলোগ এই জাতীয় চক্র রয়েছে কিনা তা নির্ধারণের জন্য কোনও প্রচেষ্টা করেন এবং অসীম লুপে আটকে যাওয়ার পরিবর্তে সেগুলির একটি বা সত্য করার জন্য অন্যান্য উপায়গুলি পরীক্ষা করেন ।attend(cp)attend(ad)

প্রোলগের এমন সংস্করণ থাকতে পারে বা নাও থাকতে পারে যা এ জাতীয় বৈশিষ্ট্য সমর্থন করে। আমি বুধের সাথে আরও পরিচিত, এবং আমি মনে করি বুধের "ন্যূনতম মডেল টেবিলিং" এই ক্ষেত্রে আপনার যা প্রয়োজন তা হ'ল। আমি আসলে এটি কখনও ব্যবহার করি নি, তবে আমার বোধগম্যতা হ'ল আরও কম-বেশি এমন একটি পদ দেয় যা নিজেকে অসীম লুপে আটকে না রেখে প্রমাণ করার মতো অন্য কোনও উপায় থাকে বা মিথ্যা বলে প্রমাণিত হলে তা নিজেকে সত্য বলে বিবেচিত করে। বুধ ডকগুলির প্রাসঙ্গিক বিভাগটি দেখুন , এবং যদি আপনি আগ্রহী হন তবে কোনও কাগজ প্রয়োগের বর্ণনা দেয়।

বুধ একটি প্রবর্তিত-বিশুদ্ধতা লজিক্যাল প্রোগ্রামিং ভাষা, প্রোলগের মতো একই শক্তিশালী সহ তবে শক্তিশালী টাইপ এবং মোড সিস্টেমগুলির সাথে সংশ্লেষিত হয় এবং এটি ব্যাখ্যা করার পরিবর্তে সংকলিত হয়।

আমি কেবলমাত্র কাগজের সাথে পরিচিতির পুনরায় স্কিমেড করেছি (যা আমি কিছুক্ষণ পড়িনি) এবং এতে প্রোলোগুলির বেশ কয়েকটি সংস্করণে টেবিলিং প্রয়োগ করা হয়েছে উল্লেখ করা হয়েছে, তাই আপনি টেবিলের জন্য গুগল করে আরও পেতে পারেন প্রোলগে।


4

প্রোলজ ব্যবহার করে স্যাট সমাধানের জন্য আমি নিম্নলিখিত কাগজটি পেয়েছি:

সলভার একটি বাস্তবায়ন এখানে পাওয়া যাবে

কোড এবং এটি কীভাবে ব্যবহার করবেন সে সম্পর্কে বিশদ জানতে এই স্ট্যাকওভারফ্লো উত্তরটি দেখুন ।


0

ছোট হাতের অক্ষর / বড় হাতের বিষয়টিকে একপাশে রেখে, ধারাগুলিতে একটি চক্র রয়েছে:

attend(cp) :- attend(ad).
attend(ad) :- attend(cp).

সুতরাং যখন আপনি একটি শীর্ষ-ডাউন দোভাষীকে কল করবেন তখন এটি লুপ হয়ে যাবে। উত্তর সেট প্রোগ্রামিং (এএসপি) এর সাথে আপনার আরও ভাগ্য হতে পারে , যা নীচে কাজ করে। এখানে লাইব্রেরির মাধ্যমে একটি কোডিং দেওয়া হয়েছে ( সর্বনিম্ন / এসপি ):

:- use_module(library(minimal/asp)).

choose([admit(bm)]) <= posted(admit(ad)).
choose([admit(cp)]) <= posted(admit(ad)).
choose([admit(ad)]) <= posted(admit(cp)).
choose([admit(dd)]) <= posted(admit(cp)).
choose([admit(ad)]) <= posted(admit(ec)).
choose([admit(bm)]) <= posted(admit(ec)).
choose([admit(cp)]) <= posted(admit(ec)).
choose([admit(cp)]) <= posted(admit(fa)).
choose([admit(dd)]) <= posted(admit(fa)).
choose([admit(bm)]) <= posted(admit(cp)),posted(admit(dd)).
choose([admit(ec)]) <= posted(admit(cp)),posted(admit(dd)).
choose([admit(fa)]) <= posted(admit(cp)),posted(admit(dd)).
choose([admit(dd)]) <= posted(admit(ad)),posted(admit(bm)).

choose([admit(fa)]) <= posted(init).

এখানে একটি উদাহরণ রান করুন:

Jekejeke Prolog 3, Runtime Library 1.3.8 (23 May 2019)

?- post(init), listing(admit/1).
admit(fa).
admit(cp).
admit(ad).
admit(bm).
admit(dd).
admit(ec).
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.