6

के साथ अद्वितीय डीएजी माता-पिता को सूचीबद्ध करना यहां एक (उम्मीद है) सरल लॉजिकल प्रोग्राम है जिसे मैं थोड़ी देर के लिए अटक गया हूं।core.logic

मेरे पास कोर.लॉगिक में किनारे के संबंध में प्रतिनिधित्व किया गया है, जब मूल नोड्स की सूची उत्पन्न करते हैं, तो मुझे ग्राफ में "हीरा आकार" होने पर डुप्लिकेट मिलते हैं (मैं यहां चक्रों के बारे में बात नहीं कर रहा हूं)।

क्या इस मामले में माता-पिता की एक अलग सूची उत्पन्न करने का कोई तरीका है (माता-पिता को फिर से लिखकर) या? (: ख: सी: एक)

(defrel edge a b) 
(fact edge :a :b) 
(fact edge :a :c) 
(fact edge :b :d) 
(fact edge :c :d) 

(defne parento [x y] 
    ([x y] (edge y x)) 
    ([x y] (fresh [z] 
      (edge z x) 
      (parento z y)))) 

(run* [q] (parento :d q)) 
;; => (:b :c :a :a) 

मैं प्राप्त करना चाहते हैं और मैं रन * बयान के अंदर करना चाहते हैं (अर्थात एक सेट में परिणाम लपेटकर नहीं है कि मैं क्या कर रहा हूँ के लिए लक्ष्य है)।

इसके अलावा, पेरेंटो को "^: tabled" जोड़ना चाल चल रहा है, लेकिन मैं नहीं चाहता कि ज्ञापन पेश किया जाए।

उत्तर

1

यदि आप किनारों के लिए अलग-अलग तथ्यों को परिभाषित करते हैं तो आप संबंधपरक प्रोग्रामिंग को छोड़ दिए बिना ऐसा करने का कोई तरीका नहीं है। एक समाधान क्लोजर के सेट कन्स्ट्रक्टर को परिणामों की पूरी सूची को पास करना है। दूसरा विकल्प आपके तर्क कार्यक्रम में एक पास में सभी नोड्स पर काम करना है।

इस समस्या के मौजूदा प्रोलॉग समाधानों को देखने और आपको जो भी मिल रहा है उसका अनुवाद करना उपयोगी हो सकता है।

+0

उत्तर के लिए धन्यवाद, मैं ब्रेटको पढ़ रहा हूं और थोड़ा गुगल रहा हूं और कुछ भी उपयोगी नहीं पाया। क्या आप उल्लेख किए गए 'एक पास' समाधान की रूपरेखा कर सकते हैं? चीयर्स ... –

+0

क्या आपने इसे देखा है: http://sites.google.com/site/prologsite/prolog-problems/6? – dnolen