Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Clojure core.logic中提取映射元素_Clojure_Clojure Core.logic - Fatal编程技术网

从Clojure core.logic中提取映射元素

从Clojure core.logic中提取映射元素,clojure,clojure-core.logic,Clojure,Clojure Core.logic,我正在尝试使用Clojure core.logic从地图中提取数据。此代码按照我的要求执行: (run 10 [q] (fresh [?id ?type ?name] (membero ?type [:t2 :t1]) (== q [?id ?name]) (membero {:id ?id :type ?type :name ?name} [ {:id 1 :type :t1 :name "one"

我正在尝试使用Clojure core.logic从地图中提取数据。此代码按照我的要求执行:

 (run 10 [q] 
   (fresh [?id ?type ?name] 
      (membero ?type [:t2 :t1])
      (== q [?id ?name])
      (membero {:id ?id :type ?type :name ?name}  
           [
           {:id 1 :type :t1 :name "one"}
           {:id 2 :type :t2 :name "two"}
           ])))
=> ([2 "two"] [1 "one"])
但是,如果我在地图中添加了一些其他元素,那么它将无法匹配:

(run 10 [q] 
   (fresh [?id ?type ?name] 
      (membero ?type [:t2 :t1])
      (== q [?id ?name])
      (membero {:id ?id :type ?type :name ?name}  
           [
           {:id 1 :type :t1 :name "one" :other1 :o1}
           {:id 2 :type :t2 :name "two" :other2 :o2}
           ])))
我理解为什么
matche
不起作用,因为地图已经不一样了。我的问题是,我怎样才能改变它,使它再次工作?如何使其仅与地图中的某些关键点匹配,或者如何使其与地图中的任意随机关键点匹配

编辑:

我使用
空间地图
(感谢)


但是我发现应该使用
featurec
而不是
partial map
。我的新问题:如何将其更改为使用
featurec

回答我自己的问题:

以下是工作代码:

(run 10 [q] 
   (fresh [?id ?type ?name ?pm] 
          (membero ?type [:t2 :t1])
          (== q [?id ?name])
          (featurec ?pm  {:id ?id :type ?type :name ?name} )
          (membero ?pm
                   [
                    {:id 1 :type :t1 :name "one" :other1 :o2}
                    {:id 2 :type :t2 :name "two" :other2 :o1 :another :ao2}
                    {:id 3 :type :t3 :name "three" :other2 :o1 :another :ao1}
                    ]))))

这段代码允许我从映射中提取值,但只关注真正重要的键。其余的键值对将被忽略。

我添加了我使用的测试代码要点:
(run 10 [q] 
   (fresh [?id ?type ?name ?pm] 
          (membero ?type [:t2 :t1])
          (== q [?id ?name])
          (featurec ?pm  {:id ?id :type ?type :name ?name} )
          (membero ?pm
                   [
                    {:id 1 :type :t1 :name "one" :other1 :o2}
                    {:id 2 :type :t2 :name "two" :other2 :o1 :another :ao2}
                    {:id 3 :type :t3 :name "three" :other2 :o1 :another :ao1}
                    ]))))