के साथ पारिवारिक पेड़ से पूछताछ करते समय डुप्लिकेट परिणामों को खत्म करना मैं core.logic के साथ एक पारिवारिक पेड़ का मॉडल कर रहा हूं। मैं run*
प्रश्नों को देखना चाहूंगा और उन्हें डुप्लिकेशंस के बिना सभी परिणाम वापस कर दूंगा। को def tabled
के साथ बदलकर मुझे परिणाम मिलते हैं (अब कम से कम), और मुझे पता है कि condu
और onceo
परिणाम की संख्या को कम कर सकते हैं, लेकिन मुझे यकीन नहीं है कि इनमें से कोई भी डुप्लिकेट को खत्म करने का सबसे अच्छा तरीका है।core.logic
मैं विशेष रूप से अपने वर्तमान दृष्टिकोण के बारे में चिंतित हूं क्योंकि यह संबंधों और कार्यों दोनों को घोषित करने के लिए डुप्लिकेट काम की तरह लगता है। मुझे पता है कि मेरे कुछ संबंध 'पारस्परिक रूप से रिकर्सिव' (mothero
और womano
एक-दूसरे के संदर्भ में हैं), लेकिन मैंने ऐसा इसलिए किया क्योंकि भविष्य में मैं एक नया (defrel mother*)
जोड़ सकता हूं, जिससे यह अनुमान लगाया जा सके कि एक मां दोनों माता-पिता हैं और एक औरत।
(defrel man* person)
(defrel woman* person)
(defrel parent* child father)
(fact man* :Father)
(fact woman* :Mother)
(fact man* :Son)
(fact woman* :Daughter)
(fact parent* :Son :Father)
(fact parent* :Son :Mother)
(fact parent* :Daughter :Father)
(fact parent* :Daughter :Mother)
(defn mano [person]
(conde
[(man* person)]
[(fresh [c]
(fathero c person))]))
(defn womano [person]
(conde
[(woman* person)]
[(fresh [c]
(mothero c person))]))
(defn parento [child person]
(conde
[(parent* child person)]
[(mothero child person)]
[(fathero child person)]))
(defn fathero [child father]
(all
(mano father)
(parento child father)))
(defn mothero [child mother]
(all
(womano mother)
(parento child mother)))
(defn siblingso [c1 c2 mother father]
(all
(mothero c1 mother)
(mothero c2 mother)
(fathero c1 father)
(fathero c2 father)
(!= c1 c2)))
(run 10 [q]
(fresh [child parent]
(parento child parent)
(== q [child parent])))
(run 10 [q]
(fresh [c1 c2 p1 p2]
(siblingso c1 c2 p1 p2)
(== q [c1 c2 p1 p2])))
कारण मैंने पैरेंटो, पिताो, सिब्लिंगो इत्यादि को परिभाषित किया है, इसलिए मैं बड़े संबंधों को परिभाषित करने के लिए उन्हें ब्लॉक बनाने के रूप में उपयोग करना चाहता हूं। Cousinso की तरह siblingso और parento का उपयोग परिभाषित करना आसान होगा। इसे सिर्फ माता-पिता * पर सीमित करने के बजाय। मैं किसी भी प्रकार के रिश्ते, भाइयों, चाचा, दूसरे चचेरे भाई, पूर्वजों, वंशजों, संबंधित इत्यादि के लिए निर्माण कार्यों को समाप्त करना चाहता हूं। मुझे नहीं पता कि इन्हें कैसे परिभाषित किया जाए ताकि वे नए संबंधों को स्वीकार कर सकें। बहन * रन * के साथ दौड़ते समय भी समाप्त हो रही है। – WuHoUnited
मैंने 'भाई' के उदाहरण (सरलीकृत संस्करण) का एक उदाहरण शामिल करने के लिए अपना उत्तर अपडेट किया है, उम्मीद है कि इससे आपको अपने लक्ष्यों को प्राप्त करने में मदद मिलेगी! ;-) –
मैंने पिछले उदाहरण में एक और छोटा बदलाव किया है, क्योंकि इस मामले में 'defne' का उपयोग करने की आवश्यकता नहीं थी। –