prolog - तर्क प्रोग्रामिंग का उपयोग करके टाइल आकार के साथ अलग टाइल पहेली फिसलने



xsb (1)

आपको पहेली के राज्यों के बीच संबंधों के संबंध में कार्य को व्यक्त करने की आवश्यकता है। आपकी मौजूदा धाराएं एक एकल चाल की वैधता का निर्धारण करती हैं, और संभव चालें भी उत्पन्न कर सकती हैं।

हालांकि, यह पर्याप्त नहीं है: आपको एक सिंगल टाइल पर केवल एक ही कदम और इसके प्रभाव से अधिक व्यक्त करने की आवश्यकता है। आपको किसी भी तरह, पूरे पहेली की स्थिति को सांकेतिक शब्दों में बदलना होगा, और यह भी एन्कोड करना होगा कि एक भी कदम पूरे कार्य की स्थिति में कैसे बदलता है।

एक शुरुआत के लिए, मैं सुझाव देता हूं कि आप इस तरह के संबंध के बारे में सोचें:

world0_move_world(W0, M, W) :- ...

और किसी दिए गए "विश्व" W W0 , एक संभव कदम M , और परिणामस्वरूप विश्व W बीच संबंध को व्यक्त करते हैं। इस रिश्ते को सामान्य रूप में उत्पन्न करना चाहिए, बैक ट्रैकिंग पर, प्रत्येक कदम M जो W0 में संभव है। आदर्श रूप में, अगर W0 एक फ्री वेरिएबल है, तो यह भी काम करना चाहिए, और इसके लिए आपको सीपीएफडीडी उपयोगी हो सकता है: बाधाएं आपको वर्तमान में उपयोग किए जाने की तुलना में अधिक सामान्य तरीके से अंकगणित संबंधों को व्यक्त करने की अनुमति देती हैं।

एक बार आपके पास इस तरह का संबंध है, तो पूरे काम को क्रम की Ms मिलना है, ताकि किसी भी प्रारंभिक दुनिया W0 को वांछित राज्य W बदल दिया जाए।

यह मानते हुए कि आपने world0_move_world/3 को एक बिल्डिंग ब्लॉक के रूप में कार्यान्वित किया है, आप इसे आसानी से चाल के सूचियों के रूप में उठा सकते हैं ( डीसीजी का प्रयोग करके ):

moves(W0) --> { desired_world(W0) }.
moves(W0) --> [M], { world0_move_world(W0, M, W) }, moves(W).

इसके बाद आप पहेली को हल करने वाली चालों का सबसे छोटा क्रम ढूंढने के लिए पुनरावृत्त गहराई का उपयोग कर सकते हैं:

?- length(Ms, _), initial_world(W0), phrase(moves(W0), Ms).

इसलिए मैं इस बूथ व्यवस्था की समस्या को हल करने की कोशिश कर रहा हूं। यह मूल रूप से एक स्लाइडिंग टाइल पहेली है जहां एक (बूथ) टाइल को एक लक्ष्य स्थान पर पहुंचा है और अंत में अन्य सभी (बूथ) टाइल अपने मूल स्थान में होने चाहिए। प्रत्येक टाइल / बूथ में एक आयाम होता है और निम्नलिखित इनपुट तथ्य और संबंध विवरण होते हैं:

  • प्रपत्र कक्ष (डब्ल्यू, एच) का एक तथ्य, जो चौड़ाई डब्ल्यू निर्दिष्ट करता है और
    कमरे की ऊंचाई एच (3 ≤ डब्ल्यू, एच ≤ 20)।
  • एक तथ्य बूथ (बी), जो कि
    बूथों की संख्या निर्दिष्ट करता है (1 ≤ बी ≤ 20)।
  • एक संबंध जिसमें फार्म आयाम (बी, डब्लू, एच) के तथ्यों के होते हैं, जो चौड़ाई डब्ल्यू और बूथ बी की ऊंचाई एच निर्दिष्ट करती है।
  • प्रपत्र के तथ्यों से मिलकर संबंध
    स्थिति (बी, डब्ल्यू, एच), बूथ बी की प्रारंभिक स्थिति (डब्ल्यू, एच) निर्दिष्ट करते हुए।

  • एक तथ्य लक्ष्य (बी, डब्ल्यू, एच), गंतव्य (डब्ल्यू, एच) को निर्दिष्ट करते हुए
    लक्ष्य बूथ बी

  • एक अतिरिक्त तथ्य क्षितिज (एच) प्रदर्शन की जाने वाली चाल की संख्या पर ऊपरी सीमा देता है।

कार्यक्रम को एक फ़ाइल से इनपुट तथ्यों को पढ़ने के लिए माना जाता है, लेकिन मैं अभी हल करने की कोशिश कर रहा हूं इसलिए मैंने अभी एक संभव इनपुट पेस्ट कर लिया है, और मैंने कुछ बुनियादी खंड लिखे हैं:

room(3, 3).
booths(3).
dimension(1, 2, 1).
dimension(2, 2, 1).
dimension(3, 1, 1).
position(1, 0, 1).
position(2, 1, 2).
position(3, 0, 0).
target(3, 0, 2).
horizon(10).

xlim(X) :- room(X,_).
ylim(X) :- room(_,X).

sum(X,Y,Z) :- Z is X+Y .

do(position(B,X,Y),movedown,position(B,X,Z)) :- Y > 0 , sum(Y,-1,Z) .
do(position(B,X,Y),moveup,position(B,X,Z)) :- ylim(L), Y < L , sum(Y,1,Z) .
do(position(B,X,Y),moveleft,position(B,Z,Y)) :- X > 0 , sum(X,-1,Z) .
do(position(B,X,Y),moveright,position(B,Z,Y)) :- xlim(L), X < L, sum(X,1,Z) .

noverlap(B1,B2) :- 
    position(B1,X1,Y1), 
    position(B2,X2,Y2), 
    ends(Xe1,Ye1,B1), 
    ends(Xe2,Ye2,B2), 
    ( Xe1 < X2 ; 
      Xe2 < X1 ; 
      Ye1 < Y2 ; 
      Ye2 < Y1 ).

ends(Xe,Ye,B) :- 
    dimension(B,W,H), 
    position(B,X,Y), 
    Xe is X+W-1, 
    Ye is Y+H-1.

between(X,Y,Z) :- 
    X > Y , 
    X < Z .

validMove(M,B) :- do(position(B,X,Y),M,position(B,Xn,Yn)) .

मैं प्रोलॉग के लिए नया हूँ और मैं यहां से कैसे जाना है, इसके बारे में अटक गया हूं, मेरे पास कोई ओवरवरलैप नियम है, इसलिए मैं जांच सकता हूं कि कोई चाल मान्य है या नहीं, लेकिन मुझे यकीन नहीं है कि मेरे पास मौजूदा धाराओं के साथ कैसे। चाल के लिए मेरी मौजूदा धाराएं / 3 शायद कुछ संशोधन की आवश्यकता है कोई संकेत?