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हमेशा सममिति होती है, जिससे Xs की परिणामी सूची की लंबाई findall/3सममित रोटेशन की संख्या से अधिक होगी A।
डबल काउंटिंग समस्या को हल करने के लिए, मैं findall/3विधेय के तीसरे तर्क पर मेल खाते पैटर्न का उपयोग करता हूं । प्रोलॉग सूचियों में उनके सिर (पहले तत्व) और उनकी पूंछ (बाकी) के जोड़े के रूप में दर्शाया गया है। इस प्रकार [_|Z]एक सूची का प्रतिनिधित्व करता है जिसकी पूंछ बराबर होती है Z। इसका मतलब यह है कि लंबाई की लंबाई विधेय Zद्वारा पाए जाने वाले उपसर्गों की संख्या से कम है findall/3और इस प्रकार सममितिक घूर्णन की संख्या के बराबर है A। अंत में, मैं लंबाई तक length/2सेट Bकरने के लिए विधेय का उपयोग करता हूं Z।