2012-10-05 19 views
5

मैं core.logiccore.logic का आउटपुट वही मान दोहराया क्यों देता है?

 
(require [clojure.core.logic :as l]) 

(l/run* [q] 
    (l/fresh [a b c] 
    (l/membero a [1]) 
    (l/membero b [4 5]) 
    (l/membero c [1 2]) 
    (l/== q [a b]))) 

में यह करने की कोशिश की परिणाम की उम्मीद कर [1 4] [1 5]

होने के लिए, लेकिन यह [1 4] [1 4] [1 5] [1 5]

तो मैं इसके साथ खेलना शुरू कर दिया था और इस पाया:

 
(require [clojure.core.logic :as l]) 

(l/run* [q] 
    (l/fresh [a b c] 
    (l/membero a [1]) 
    (l/membero b [4 5]) 
    (l/membero c [1 1 1 1 1 1 1 1]) 
    (l/== q [a b]))) 
;; => ([1 4] [1 4] [1 4] [1 5] [1 4] [1 4] [1 5] [1 4] [1 5] [1 4] [1 5] [1 5] [1 5] [1 5]) 

जहां वहां [1 5][1 4]

के साथ छेड़छाड़ की गई है? क्या यह पुनरावृत्ति चीज एक फीचर या बग माना जाता है?

उत्तर

4

इसका कारण यह है तर्क चर c जो के रूप में यह q के साथ एकीकृत नहीं किया जा रहा है की आवश्यकता नहीं है का उपयोग। यदि आप c हटाते हैं तो आपको वांछित परिणाम मिलेंगे। मूल रूप से आपको यह समझने की आवश्यकता है कि प्रतिस्थापन कोर.लॉगिक में कैसे काम करता है यह समझने के लिए कि आपको c की वजह से इन डुप्लिकेट परिणाम क्यों मिल रहे हैं।

उच्च स्तर पर प्रक्रिया समाधान के लिए एक पेड़ खोजना है, इस मामले में वेक्टर में प्रत्येक तत्व memberoc के साथ खोज पेड़ में एक नोड की ओर जाता है और इससे डुप्लिकेट परिणाम होते हैं क्योंकि प्रत्येक नोड द्वारा प्रस्तुत किया जाता है c संभावित मान सही परिणाम की ओर जाता है क्योंकि c का उपयोग (l/== q [a b])

+0

में किया गया है यह उत्तर सही है। सी अधिक संभावनाओं का योगदान करता है, लेकिन हम इसका मूल्य पुनः नहीं कर रहे हैं, इसलिए ऐसा लगता है कि हमें बार-बार परिणाम मिल रहा है। – dnolen

संबंधित मुद्दे