【问题标题】:Clojure core.logic generating parentsClojure core.logic 生成父母
【发布时间】:2013-01-07 23:12:18
【问题描述】:

我有这个代码,它可以按我的意愿做,它递归地拉出给定人的父母:

(defn anc [child]
  (run* [q]
    (conde
     [(fresh [?p]
             (parento child ?p)
             (?== q [child ?p]))]
     [(fresh [?p ?gp]
             (parento child ?p)
             (parento ?p ?gp)
             (?== q [ ?p ?gp]))]
     [(fresh [?p ?gp ?ggp]
             (parento child ?p)
             (parento ?p ?gp)
             (parento ?gp ?ggp)
             (?== q [ ?gp ?ggp]))]
     )))

问题是,对于我回去的每一代,我都必须添加一个新的测试。

有没有办法在 core.logic 中概括这一点?

【问题讨论】:

    标签: clojure clojure-core.logic


    【解决方案1】:

    我尝试了一些方法,希望对您有所帮助:

    user=> (defrel parent c p)
    user=> (fact parent :b :a)
    nil
    user=> (fact parent :c :b)
    nil
    user=> (fact parent :d :c)
    nil
    
    user=> (defn anso [c a] 
                 (conde  
                     [(fresh [p x] 
                         (parent c p) 
                         (anso p x) 
                         (appendo [p] x a))] 
                     [(fresh [x] 
                         (parent c x) 
                         (== a [x]))])) 
    #'user/anso
    
    user=> (last (run* [q] (anso :c q)))
    (:b :a)
    user=> (last (run* [q] (anso :b q)))
    [:a]
    user=> (last (run* [q] (anso :d q)))
    (:c :b :a)
    

    【讨论】:

    • 我尝试了类似的东西,但你看起来比我尝试的要简单。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-02
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-21
    相关资源
    最近更新 更多