Два связанных вопроса в одном:
Может ли модуль Clojure core.logic выполнять арифметику, логическое сравнение и т. Д., Как обычный пролог?Я предполагаю что-то вроде следующего:
(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
s, а не с целыми числами, и я не могу сделать эти сравнения, потому что символы еще не связаны.Но это работает в прологе:
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")
Если я пытаюсь сделать что-то подобное, я получаю ошибки, также жалуюсь, что LVars не связаны.Есть ли способ сделать это?
И наконец, если кто-нибудь прочитал это далеко, я мог бы также спросить: есть ли планы по включению вероятностной логики в core.logic, например:
http://dtai.cs.kuleuven.be/problog/?
Я не задерживаю дыхание, но это было бы здорово!