Только начиная с core.logic, версия "0.8.11":core.logic объяснить, как `fresh` изменения результатов
(q/run* [q]
(q/fresh [a]
(q/membero a [2 3]))
(q/membero q [1]))
Я не понимаю, результат: (1 1)
.
Я понимаю, что я создаю еще одну переменную a
с свежей, которая может принимать значение 2 или 3. И q
может принимать значение 1. Поэтому я ожидал увидеть что-то вроде: (1)
или (1 2 1 3)
, или, может быть, ([1 2] [1 3])
или даже ({:q 1 :a 2} {:q 1 :a 3})
, но не фактический результат.
Другой пример:
(q/run* [q]
(q/fresh [a]
(q/membero a [1 2 3])
(q/membero q [3 4 5])
(q/== a q)))
;; make sense to me, returns (3)
(q/run* [q]
(q/fresh [a]
(q/membero a [1 2 3]))
(q/membero q [3 4 5]))
;; does not make sense to me, returns (3 4 3 5 4 3 5 4 5)
;; I was expecting `(3 4 5)`
Может кто-нибудь объяснить, что здесь происходит?