A+B:-findall(X,(append(X,Y,A),append(Y,X,A)),[_|Z]),length(Z,B).
इसे ऑनलाइन आज़माएं!
एक विधेय को परिभाषित करता है +/2
जो अपने पहले तर्क ( A
) के रूप में एक स्ट्रिंग (चरित्र कोड की सूची के रूप में) लेता है और B
उच्चतम क्रम सममित रोटेशन के क्रम में अपना दूसरा तर्क ( ) सेट करता है ।
व्याख्या
यह कार्यक्रम इस तथ्य का उपयोग करता है कि एक स्ट्रिंग पर सममित रोटेशन का सेट एक चक्रीय समूह है और इसलिए सममित रोटेशन के सेट का क्रम उच्चतम क्रम सममित रोटेशन के क्रम के बराबर है। इस प्रकार यह प्रोग्राम इनपुट स्ट्रिंग पर सममित घुमावों की कुल संख्या का पता लगाकर वांछित परिणाम की गणना करने में सक्षम है।
कोड स्पष्टीकरण
भारी उठाने का बहुमत findall/3
विधेय के लिए एक कॉल द्वारा किया जाता है । findall/3
विधेय पहला तर्क (के लिए सभी विभिन्न संभावित मान पाता है X
इस मामले में) ऐसी है कि अभिव्यक्ति दूसरा तर्क के रूप में दिया (सच है (append(X,Y,A),append(Y,X,A))
, कि के बारे में अधिक बाद में)। अंत में यह X
अंतिम तर्क ( [_|Z]
) में सूची के रूप में इनमें से प्रत्येक संभावित मूल्यों को संग्रहीत करता है ।
अभिव्यक्ति findall/3
को दूसरे तर्क के रूप में पारित किया गया है, (append(X,Y,A),append(Y,X,A))
यह append/3
निर्दिष्ट करने के लिए विधेय का उपयोग करता है कि X
कुछ अभी तक अपरिभाषित के साथ Y
समान होना चाहिए A
, इनपुट स्ट्रिंग के बराबर होना चाहिए , और उसी के Y
साथ समरूप X
होना भी समान होना चाहिए A
। इसका मतलब यह है किX
कुछ उपसर्ग A
ऐसे होने चाहिए कि यदि इसे सामने से हटाकर A
पीछे जोड़ा जाए तो परिणामी स्ट्रिंग समान है A
। X
इस संपत्ति के साथ एस के सेट में लगभग एक-से-एक पत्राचार है, जिसके सममित घुमावों के साथ A
। हमेशा डबल काउंटिंग का एक मामला होता है जो इस तथ्य के कारण होता है कि दोनों खाली स्ट्रिंग और A
उपसर्ग हैंA
कि 0 के रोटेशन के अनुरूप है A
। चूंकि 0
-rotation की A
हमेशा सममिति होती है, जिससे X
s की परिणामी सूची की लंबाई findall/3
सममित रोटेशन की संख्या से अधिक होगी A
।
डबल काउंटिंग समस्या को हल करने के लिए, मैं findall/3
विधेय के तीसरे तर्क पर मेल खाते पैटर्न का उपयोग करता हूं । प्रोलॉग सूचियों में उनके सिर (पहले तत्व) और उनकी पूंछ (बाकी) के जोड़े के रूप में दर्शाया गया है। इस प्रकार [_|Z]
एक सूची का प्रतिनिधित्व करता है जिसकी पूंछ बराबर होती है Z
। इसका मतलब यह है कि लंबाई की लंबाई विधेय Z
द्वारा पाए जाने वाले उपसर्गों की संख्या से कम है findall/3
और इस प्रकार सममितिक घूर्णन की संख्या के बराबर है A
। अंत में, मैं लंबाई तक length/2
सेट B
करने के लिए विधेय का उपयोग करता हूं Z
।