繁体   English   中英

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

[英]Arithmetic and clojure functions on core.logic lvars

两个相关问题合二为一:

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)

在此示例中,逻辑比较(< xy)和q与(+ xy)的尝试绑定都(+ xy) 我想这是因为我正在使用LVar ,而不是整数,我不能进行这些比较,因为符号尚未绑定。 但它适用于prolog:

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

=> Result = 5.

在类似的情况下,我可以以某种方式使用Clojure函数(返回布尔值或其他“truthy”值)作为逻辑谓词吗? 换句话说,使用函数告诉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")

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

最后,如果有人读过这篇文章,我不妨问:是否有计划将概率逻辑纳入core.logic,其方式如下:

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

我不是屏住呼吸,但它会很棒!

通过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:屏住呼吸,让Constraint Logic Programming来到core.logic!

我相信你必须先为它的绑定“项目”(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)))))

请注意,原始片段中存在fresh的替代,以及事实声明的附加参数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM