Конечный домен Core.logic со значениями -ve

Я не уверен, почему приведенный ниже код не возвращает никакого результата при использовании -5 в качестве одного из значений домена.

user=> (run* [q] (infd q (domain -5 5)) (*fd q q 25))
()
user=> (run* [q] (infd q (domain 0 5)) (*fd q q 25))
(5)

ПРИМЕЧАНИЕ. Этот код относится к поведению в бета-версиях core.logic 0.8.0.


person Ankur    schedule 02.11.2012    source источник


Ответы (2)


В настоящее время в бета-версиях core.logic 0.8.0 вообще нет поддержки для доменов с отрицательными значениями. Если и работает, то совершенно случайно. Я не собираюсь лично работать над добавлением поддержки этого в ближайшем будущем, хотя всесторонний патч будет приветствоваться после того, как 0.8.0 получит надлежащий выпуск.

person dnolen    schedule 02.11.2012
comment
Нет, для этого потребуется поддержка программирования логики ограничений над вещественными числами, CLP(R). Определенно заинтересован в получении вклада в это, но я также не планирую работать над этим сам. - person dnolen; 04.11.2012

Похоже, реализация ограничения *fd работает только для доменов со всеми положительными значениями. Он вычисляет верхнюю и нижнюю границы для левого фактора на основе простого деления нижней/верхней границ области продукта на верхние/нижние границы правой области фактора, и наоборот. Вы можете видеть, как добавление негативов в микс приведет к тому, что это не сработает:

 (run* [q]
   (fresh [r]
     (infd q (domain 1 2 3 4 5))
     (infd r (domain 20 25))
     (*fd q q r)))

 Product = [20..25], RHS = [1..5] => LHS = [20/5..25/1] = [4..25]

 (run* [q]
   (fresh [r]
     (infd q (domain -1 0 1 2 3 4 5))
     (infd r (domain 20 25))
     (*fd q q r)))

 Product = [20..25], RHS = [-1..5] => LHS = [20/5..25/-1] = [4..-25]

Поскольку знаки выключены, вы получаете неудовлетворительный интервал для LHS, потому что нижняя граница больше верхней границы.

Конечные домены с отрицательными значениями работают для ограничения +fd:

 (run* [q] (fresh [a b] (infd a b (domain -1 0 1)) (+fd a b 0) (== q [a b])))
 => ([-1 1] [0 0] [1 -1])
person Alex    schedule 02.11.2012