ASP / Prolog / SAT प्रवाह सॉल्वर लिखें


9

फ़्लो फ़्री एक नशे की लत एंड्रॉइड गेम है जहां आपको तत्वों के जोड़े को गैर-अतिव्यापी सांपों के माध्यम से एक साथ जोड़ना होगा और पूरे ग्रिड को भरना होगा। विवरण के लिए, यहां देखें:

https://play.google.com/store/apps/details?id=com.bigduckgames.flow&hl=en

मेरे पास एक ASP (उत्तर सेट प्रोग्रामिंग) समाधान है जो केवल एक युगल नियम है और मुझे नहीं लगता कि यह एक ही समाधान को लगभग संक्षिप्त रूप में SAT उदाहरण के रूप में वाक्यांश करना संभव है, लेकिन मैं गलत साबित होने में दिलचस्पी लेता हूं।

कोई भी भाषा ठीक है, लेकिन मुझे संदेह है कि यह किसी प्रकार के सॉल्वर को चलाए बिना संक्षिप्त रूप से किया जा सकता है, यही कारण है कि मैंने इसे एएसपी / स्लॉग / सैट लेबल किया है।

विजेता सबसे कम अक्षर हैं।

आप यह मान सकते हैं कि समस्या का उपयोग विधेय का उपयोग करके परिभाषित किया गया है:

v(V). % A vertex

a(V,W). % V and W are adjacent

c(C). % A color

s(V,C). % V is an endpoint of color C

इसके अलावा, इनपुट संतुष्ट करता है

a(W,V) :- a(V,W) % Adjacencies are bidirectional

2{s(V,C) : v(V)}2 :- c(C). % Every color has exactly two endpoints

समाधान विधेय प्रपत्र का होगा

e(V,W,C).

यह कहते हुए कि रंग C के V और W के बीच एक किनारा है

किनारों को द्विदिश (एक ही रंग का) होना चाहिए। प्रत्येक शीर्ष पर एक ही रंग के किनारों और उसमें से होना चाहिए। एंडपॉइंट में एक किनारे होता है, अन्य सभी कोने में बिल्कुल दो किनारे होते हैं। कोई लूप नहीं हैं, हर सांप को दो एंडपॉइंट्स पर वापस जाना चाहिए।

यहां इसे (5x5 लेवल 2 में रेगुलर पैक में) जांचने के लिए एक नमूना इनपुट दिया गया है:

v(v11; v12; v13; v14; v15).
v(v21; v22; v23; v24; v25).
v(v31; v32; v33; v34; v35).
v(v41; v42; v43; v44; v45).
v(v51; v52; v53; v54; v55).

a(v11, v12).
a(v12, v13).
a(v13, v14).
a(v14, v15).
a(v12, v11).
a(v13, v12).
a(v14, v13).
a(v15, v14).
a(v11, v21).
a(v12, v22).
a(v13, v23).
a(v14, v24).
a(v15, v25).

a(v21, v22).
a(v22, v23).
a(v23, v24).
a(v24, v25).
a(v22, v21).
a(v23, v22).
a(v24, v23).
a(v25, v24).
a(v21, v31).
a(v22, v32).
a(v23, v33).
a(v24, v34).
a(v25, v35).
a(v21, v11).
a(v22, v12).
a(v23, v13).
a(v24, v14).
a(v25, v15).

a(v31, v32).
a(v32, v33).
a(v33, v34).
a(v34, v35).
a(v32, v31).
a(v33, v32).
a(v34, v33).
a(v35, v34).
a(v31, v41).
a(v32, v42).
a(v33, v43).
a(v34, v44).
a(v35, v45).
a(v31, v21).
a(v32, v22).
a(v33, v23).
a(v34, v24).
a(v35, v25).

a(v41, v42).
a(v42, v43).
a(v43, v44).
a(v44, v45).
a(v42, v41).
a(v43, v42).
a(v44, v43).
a(v45, v44).
a(v41, v51).
a(v42, v52).
a(v43, v53).
a(v44, v54).
a(v45, v55).
a(v41, v31).
a(v42, v32).
a(v43, v33).
a(v44, v34).
a(v45, v35).

a(v51, v52).
a(v52, v53).
a(v53, v54).
a(v54, v55).
a(v52, v51).
a(v53, v52).
a(v54, v53).
a(v55, v54).
a(v51, v41).
a(v52, v42).
a(v53, v43).
a(v54, v44).
a(v55, v45).

s(v11, yellow).
s(v45, yellow).
s(v41, blue).
s(v55, blue).
s(v51, red).
s(v43, red).
s(v42, green).
s(v33, green).

c(red; green; blue; yellow).

और आउटपुट का परीक्षण करने के लिए

shouldbe(v33,v32,green).
shouldbe(v42,v32,green).
shouldbe(v43,v53,red).
shouldbe(v51,v52,red).
shouldbe(v55,v54,blue).
shouldbe(v41,v31,blue).
shouldbe(v45,v35,yellow).
shouldbe(v11,v12,yellow).
shouldbe(v12,v11,yellow).
shouldbe(v35,v45,yellow).
shouldbe(v31,v41,blue).
shouldbe(v54,v55,blue).
shouldbe(v52,v51,red).
shouldbe(v53,v43,red).
shouldbe(v32,v42,green).
shouldbe(v32,v33,green).
shouldbe(v53,v52,red).
shouldbe(v52,v53,red).
shouldbe(v54,v44,blue).
shouldbe(v31,v21,blue).
shouldbe(v35,v25,yellow).
shouldbe(v12,v13,yellow).
shouldbe(v13,v12,yellow).
shouldbe(v25,v35,yellow).
shouldbe(v21,v31,blue).
shouldbe(v44,v54,blue).
shouldbe(v44,v34,blue).
shouldbe(v21,v22,blue).
shouldbe(v25,v15,yellow).
shouldbe(v13,v14,yellow).
shouldbe(v14,v13,yellow).
shouldbe(v15,v25,yellow).
shouldbe(v22,v21,blue).
shouldbe(v34,v44,blue).
shouldbe(v34,v24,blue).
shouldbe(v22,v23,blue).
shouldbe(v15,v14,yellow).
shouldbe(v14,v15,yellow).
shouldbe(v23,v22,blue).
shouldbe(v24,v34,blue).
shouldbe(v24,v23,blue).
shouldbe(v23,v24,blue).

:-not e(V,W,C),shouldbe(V,W,C).
:-e(V,W,C),not shouldbe(V,W,C).

इसके अलावा लेवल 21 5x5 में 1 से अधिक सॉल्यूशन वाली पहली पजल होनी चाहिए (विशेष रूप से, 9 सॉल्यूशंस हैं, 40 नहीं) लेवल 21 सेट करने के लिए, इनपुट की आखिरी कुछ लाइनों को सेट करें

s(v55, yellow).
s(v44, yellow).
s(v15, blue).
s(v45, blue).
s(v51, red).
s(v53, red).
s(v22, green).
s(v14, green).
s(v23, orange).
s(v43, orange).

c(red; green; blue; yellow; orange).

जवाबों:


4

एएसपी (बिंगो), 180 बाइट्स

{e(V,W,C):a(V,W),c(C)}.r(V):-s(V,_).r(V):-r(W),e(W,V,_).o(V):-r(V),{e(V,W,_):v(W);s(V,_)}=2.:-e(V,_,C),e(V,_,D),C!=D.:-e(V,W,C),not e(W,V,C).:-v(V),not o(V).:-s(V,C),e(V,_,D),C!=D.

मैं एएसपी के लिए नया हूं, इसलिए मैं इस कार्य को खोजने के लिए उत्साहित था, भले ही यह कुछ पुराना हो। यह देखना अच्छा था कि विविधताओं के लिए स्थान और गोल्फ के लिए एक अवसर था जो मेरी समझ की सीमा की ओर अग्रसर था (मुझे आशा है कि यह अभी भी सही है, ऐसा लगता है)।

यहाँ एक टिप्पणी संस्करण है:

% Select some edges e(V,W,C) s.t. V and W are adjacent and C is a color.
{e(V,W,C):a(V,W),c(C)}.

% Auxilary predicates:

% A vertex is reachable from an endpoint if
% it is an endpoint ...
r(V):-s(V,_).
% ... or it has an edge to it from a reachable vertex.
r(V):-r(W),e(W,V,_).

% A vertex is okay if it is reachable and either
% is an endpoint with one edge or is not an endpoint and has two edges.
% This is golfed to: the set of edges from V and endpoints V has
% cardinality 2.
o(V):-r(V),{e(V,W,_):v(W);s(V,_)}=2.

% Constraints:  We do not want ...

% edges from the same vertex with different colors:
:-e(V,_,C),e(V,_,D),C!=D.

% edges without their inverses:
:-e(V,W,C),not e(W,V,C).

% vertices that are not okay:
:-v(V),not o(V).

% edges from endpoints with the wrong color
:-s(V,C),e(V,_,D),C!=D.

% We're only interested in the e predicate:
#show e/3.

मैं अलग-अलग एएसपी सॉल्वरों के बारे में नहीं जानता, लेकिन मैंने क्लिंगो का इस्तेमाल किया, जो कि ग्रिंगो पैकेज में डेबियन निहित है।

यदि आपको फ़ाइल में कोई समस्या है probऔर फ़ाइल में मेरा कोड है solve, तो कॉल करें clingo 0 prob solve। प्रत्येक समाधान के लिए, आपको रंगीन किनारों की सूची प्राप्त होगी जो इसका उपयोग करता है (और यदि आप पंक्तिबद्ध संस्करण का उपयोग करते हैं तो #showलाइन की कमी है )। यदि आप केवल समाधानों की संख्या चाहते हैं, तो विकल्प जोड़ें -q। यदि आप केवल जानना चाहते हैं कि क्या कम से कम एक समाधान है, तो बिना कॉल करें 0

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.