2013-01-13 10 views
6

The following Clojure code में लक्ष्य आदेश दो अलग-अलग आदेशों में समान लक्ष्यों के साथ समान तर्क समस्या को हल करने के लिए core.logic का उपयोग करता है। ऑर्डर करने का यह विकल्प एक को जल्दी खत्म करने का कारण बनता है और दूसरा लटकता है।क्लोजर के `core.logic`

(use `clojure.core.logic) 

;; Runs quickly. Prints (1 2 3). 
(clojure.pprint/pprint (run* [q] (fresh [x] (== x [1,2,3]) 
              (membero q x)))) 

;; Hangs 
(clojure.pprint/pprint (run* [q] (fresh [x] (membero q x) 
              (== x [1,2,3])))) 

क्या इस समस्या से बचने के लिए कोई सामान्य समाधान या सामान्य अभ्यास है?

core.logic के साथ, आप जितनी जल्दी हो सके खोज अंतरिक्ष को कम करना चाहते:

उत्तर

3

यदि आप membero का उपयोग करने जा रहे हैं तो इस समस्या का कोई सामान्य समाधान नहीं है। ताजा वर्र्स के साथ membero पर कॉल करने से यह सभी (पढ़ने, अनंत) संभावित सूचियां उत्पन्न कर सकता है जिसके लिए q सदस्य है। बेशक 3 से बड़े सूचियां लागू नहीं होती हैं - लेकिन चूंकि आपने run* का उपयोग किया है, इसलिए यह गिनती से 3 की तुलना में बड़ी सूचियों की कोशिश कर रहा है, भले ही प्रत्येक विफल हो जाए।

बाधा बुनियादी ढांचे का उपयोग करके core.logic के नए संस्करणों में membero का बेहतर संस्करण लिखना संभव है, लेकिन आने वाले महीनों में यह कैसे हो सकता है इसका विवरण बदल सकता है। बाधाओं को परिभाषित करने के लिए एक ठोस सार्वजनिक एपीआई होने तक आप प्रोलॉग को परेशान करने वाले सूक्ष्म क्रम और गैर-समाप्ति के मुद्दों से फंस गए हैं।

7

यहाँ मेरी समझ है। यदि आप पहले membero बाधा डालते हैं, तो रन membero स्थान, और == बाधा द्वारा उत्पादित विफलता पर बैकट्रैक खोजकर शुरू होगा। लेकिन membero स्थान बहुत बड़ा है, क्योंकि न तो q और न ही x एकीकृत या कम से कम बाध्य है।

लेकिन अगर आप == बाधा पहले डाल दिया, तो आप सीधे [1 2 3] साथ x को एकजुट, और खोज membero के लिए जगह अब स्पष्ट रूप से x के तत्वों को घिरा है।

+0

'(सदस्यो q x)' में यह वास्तव में क्या खोज रहा है? क्या एक्स वास्तव में सभी संभावित संग्रहों में पुनरावृत्ति कर रहा है? यह लटकते समय क्या गणना हो रही है? – MRocklin

+1

@MRocklin, बिल्कुल। वास्तव में, यदि आप 'सदस्यो' के लिए कोड की कल्पना करते हैं, तो यह उस तत्व के साथ तत्व के साथ तत्व को एकजुट करने का प्रयास करेगा, और उसके बाद रिकॉर्ड्स को उन सूचियों का निर्माण करेगा जिनमें तत्व को अनंत तक किसी भी स्थिति में शामिल किया गया हो। सिद्धांत रूप में, तथ्यों के क्रम की आवश्यकता नहीं है, लेकिन खोज पेड़ को सीमित करना सुविधाजनक है। –