Арифметические функции и функции закрытия в core.logic lvars

Два связанных вопроса в одном:

Может ли модуль 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)

В этом примере ни логическое сравнение (, ни попытка привязки q к (+ 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/ ?

Я не затаив дыхание, но это было бы круто!

8
задан gilesc 5 October 2011 в 23:32
поделиться