core.logic lvars 上的算术和 clojure 函数

Posted

技术标签:

【中文标题】core.logic lvars 上的算术和 clojure 函数【英文标题】:Arithmetic and clojure functions on core.logic lvars 【发布时间】:2011-12-01 21:48:03 【问题描述】:

两个相关问题合二为一:

Clojure 的 core.logic 模块可以像普通 Prolog 一样进行算术、逻辑比较等操作吗?我的设想如下:

(defrel points person n) 
(fact :bob 2)
(fact :charlie 3)
(run* [q] (fresh [x y] 
   (points :bob x) 
   (points :charlie y) 
   (< x y) 
   (== q (+ x y))))

=> (5)

在此示例中,逻辑比较 (&lt; x y) 和尝试将 q 绑定到 (+ x y) 均无效。我想这是因为我现在使用的是LVars,而不是整数,我无法进行这些比较,因为符号尚未绑定。但它适用于序言:

points(bob, 2).
points(charlie, 3).
?- points(bob, X), points(charlie, Y), Result is X + Y.

=> Result = 5.

以类似的方式,我能否以某种方式使用 Clojure 函数(返回布尔值或其他“真实”值)作为逻辑谓词?换句话说,使用函数来告诉 Minikanren 哪些术语统一或不统一。大致如下:

(defmagic startswithhi-o [v]
  (.startsWith v "hi"))
(defrel person n)
(fact person "bob")
(fact person "hillary")
(run* [q] 
   (fresh [n]
     (person n)
     (startswithhi-o n)
     (== q n)))

=> ("hillary")

如果我尝试这样的事情,我也会收到错误,抱怨 LVar 未绑定。有没有办法做到这一点?

最后,如果有人读到这里,我不妨问一下:是否有计划将概率逻辑合并到 core.logic 中,大致如下:

http://dtai.cs.kuleuven.be/problog/?

我没有屏住呼吸,但它会很棒!

【问题讨论】:

非常感谢你们两位——迫不及待地想看看才华横溢的 core.logic 团队接下来会想出什么! 【参考方案1】:

可以通过project 进行非关系运算。

(run 1 [q]
   (fresh [x y]
        (== x 1)
        (== y 2)
        (project [x y]
                 (== q (+ x y)))))
(3)

我相信给出的 Prolog 示例也是非关系型的。

你的问题后半部分也可以通过project解决,但是一定要注意始终输入接地值。

(defn startwith [x]
    (project [x]
         (== true (.startsWith x "hi"))))

PS:请屏住呼吸,让约束逻辑编程来到 core.logic!

【讨论】:

【参考方案2】:

我相信您必须先将一个逻辑变量“投影”(nonrel/project)到其绑定,然后才能对其应用函数:

(defrel points person n) 
(fact points :bob 2)
(fact points :charlie 3)
(run* [q] 
  (exist [x y] 
    (points :bob x) 
    (points :charlie y) 
    (project [x y]
      (== true (< x y)) 
      (== q (+ x y)))))

请注意,在原始 sn-p 和事实声明的附加参数中,存在替代fresh。

【讨论】:

以上是关于core.logic lvars 上的算术和 clojure 函数的主要内容,如果未能解决你的问题,请参考以下文章

如何在 core.logic 中模拟“外部连接”?

Core.logic的简明解释

为啥 core.logic 的输出重复给出相同的值?

Clojure core.logic 中的阶乘

SAP ABAP 时间戳处理类 CL_ABAP_TSTMP 时间戳的算术和转换

如何匹配包含 lvar 的地图?