Два связанных вопроса в одном:
Может ли модуль 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)
В этом примере ни логическое сравнение (
(+ xy)
не работают. Я предполагаю, что это потому, что я Я работаю с 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/ ?
Я не затаив дыхание, но это было бы круто!