gil*_*esc 8 logic clojure prolog
两个相关问题合二为一:
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)
Run Code Online (Sandbox Code Playgroud)
在此示例中,逻辑比较(< x y)
和q的尝试绑定都不起作用(+ x y)
.我想这是因为我正在使用LVar
s,而不是整数,我不能进行这些比较,因为符号尚未绑定.但它适用于prolog:
points(bob, 2).
points(charlie, 3).
?- points(bob, X), points(charlie, Y), Result is X + Y.
=> Result = 5.
Run Code Online (Sandbox Code Playgroud)
在类似的情况下,我可以以某种方式使用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")
Run Code Online (Sandbox Code Playgroud)
如果我尝试这样的事情,我会得到错误,也抱怨LVars没有绑定.有没有办法做到这一点?
最后,如果有人读过这篇文章,我不妨问:是否有计划将概率逻辑纳入core.logic,其方式如下:
http://dtai.cs.kuleuven.be/problog/ ?
我不是屏住呼吸,但它会很棒!
Amb*_*ose 10
非关系算术可以通过project
.
(run 1 [q]
(fresh [x y]
(== x 1)
(== y 2)
(project [x y]
(== q (+ x y)))))
(3)
Run Code Online (Sandbox Code Playgroud)
我相信给出的Prolog示例也是非关系型的.
您的问题的后半部分也可以通过project
,但您必须小心,您始终输入基础值.
(defn startwith [x]
(project [x]
(== true (.startsWith x "hi"))))
Run Code Online (Sandbox Code Playgroud)
PS:屏住呼吸,让Constraint Logic Programming来到core.logic!