首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >core.logic lvar上的算术和闭包函数

core.logic lvar上的算术和闭包函数
EN

Stack Overflow用户
提问于 2011-10-06 07:32:13
回答 2查看 1.2K关注 0票数 8

两个相关问题合而为一:

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

代码语言:javascript
复制
(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)

在此示例中,无论是逻辑比较(< x y)还是尝试将Q绑定到(+ x y)都不起作用。我猜想这是因为我使用的是LVar,而不是整数,而且我不能进行这些比较,因为符号还没有绑定。但它在prolog中是有效的:

代码语言:javascript
复制
points(bob, 2).
points(charlie, 3).
?- points(bob, X), points(charlie, Y), Result is X + Y.

=> Result = 5.

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

代码语言:javascript
复制
(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/

我不会屏住呼吸,但这将是很棒的!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-06 16:33:59

通过project可以实现非关系运算。

代码语言:javascript
复制
(run 1 [q]
   (fresh [x y]
        (== x 1)
        (== y 2)
        (project [x y]
                 (== q (+ x y)))))
(3)

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

您的问题的后半部分也可以通过project解决,但您必须注意始终输入一个基本值。

代码语言:javascript
复制
(defn startwith [x]
    (project [x]
         (== true (.startsWith x "hi"))))

另注:屏住呼吸,期待约束逻辑编程来到core.logic!

票数 11
EN

Stack Overflow用户

发布于 2011-10-06 16:43:13

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

代码语言:javascript
复制
(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)))))

请注意,exist替换了原始代码片段中的fresh和事实声明的附加参数。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7668956

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档