Я хотел бы написать предикат, descendo, который заявляет, что первая заданная координата [y, x] опускается во вторую заданную координату (представьте себе плату с [0, 0] в верхнем левом углу).
Очень простая реализация в Prolog может выглядеть так:
descending(B, A) :-
B = [B1,B2],
A = [A1,A2],
B1 is A1 + 1,
B2 is A2 + 1.
Я не смог реализовать это в core.logic. Я уже много пробовал (==/= fd/conso/appendo и + fd/+). Одна из вещей, которые я пробовал:
(defn descendo
[b a]
(l/fresh [b1 b2 a1 a2]
(l/== b [b1 b2])
(l/== a [a1 a2])
(l/+fd b1 1 a1)
(l/+fd b2 1 a2)))
Большинство из них просто ничего не возвращают при их запуске:
(l/run* [q]
(l/fresh [a]
(l/infd a (l/domain [0 0] [1 0] [0 1] [1 1]))
(descendo a [0 0])
(l/== q a)))
=> () ; expected output: ([1 1])
У меня такое ощущение, что слишком много думать в Prolog не очень хорошо при использовании core.logic... любой намек оценивается. Спасибо заранее.
РЕДАКТИРОВАТЬ: Обнаружено временное решение, в котором descendo остается прежним, но при его запуске мы не используем домен:
(l/run* [q]
(l/fresh [a]
(l/membero a [[0 0] [1 0] [0 1] [1 1]])
(l/membero q [[0 0] [1 0] [0 1] [1 1]])
(descendo a q)))
=> ([1 1])
Я не уверен, что в любом случае domain
будет использоваться на векторах, так что это может быть не обходное решение, а фактическое решение.