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
के साथ, आप जितनी जल्दी हो सके खोज अंतरिक्ष को कम करना चाहते:
'(सदस्यो q x)' में यह वास्तव में क्या खोज रहा है? क्या एक्स वास्तव में सभी संभावित संग्रहों में पुनरावृत्ति कर रहा है? यह लटकते समय क्या गणना हो रही है? – MRocklin
@MRocklin, बिल्कुल। वास्तव में, यदि आप 'सदस्यो' के लिए कोड की कल्पना करते हैं, तो यह उस तत्व के साथ तत्व के साथ तत्व को एकजुट करने का प्रयास करेगा, और उसके बाद रिकॉर्ड्स को उन सूचियों का निर्माण करेगा जिनमें तत्व को अनंत तक किसी भी स्थिति में शामिल किया गया हो। सिद्धांत रूप में, तथ्यों के क्रम की आवश्यकता नहीं है, लेकिन खोज पेड़ को सीमित करना सुविधाजनक है। –