gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 13:33:42 25 4
gpt4 key购买 nike

我正在尝试使用 Clojure core.logic 从 map 中提取数据。这段代码按照我的意愿执行:

 (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"])

但是,如果我向 map 添加一些其他元素,则它无法匹配:

(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}
])))

我明白为什么 matcho 不起作用,因为 map 不再相同。我的问题是,我该如何改变它才能再次起作用?如何让它仅匹配 map 中的某些键,或者如何让它匹配 map 可能具有的任何随机键?

编辑:

我使用patial-map让它工作(感谢https://github.com/clojure/core.logic/pull/10)

(run 10 [q] 
(fresh [?id ?type ?name]
(membero ?type [:t2 :t1])
(== q [?id ?name])
(membero (partial-map {:id ?id :type ?type :name ?name} )
[
{:id 1 :type :t1 :name "one" :other1 :o2}
{:id 2 :type :t2 :name "two" :other2 :o1}
])))

但是我发现应使用 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}
]))))

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

关于clojure - 从 Clojure core.logic 中提取映射元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14160802/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com