SWI-Пролог и ограничения, библиотека CLP (FD)
Я играю с ограничениями в (swi) прологе, используя библиотеку clpfd.
Я пытаюсь определить, когда один набор ограничений инкапсулирует или объединяет другой, например, X <4 инкапсулирует X <7, так как всякий раз, когда первое верно, последнее верно. Это можно легко представить с помощью логического подтекста. Однако я не смог заставить оператор # ==> дать мне нужный результат, поэтому я прибегнул к использованию not (Co1 # / \ # \ Co2), где Co1 и Co2 - ограничения. Это хорошо для отдельных ограничений, но затем я хотел передать соединения ограничений в Co1 и Co2.
Теперь вот руб. Когда я пытаюсь
X#<7 #/\ #\X#<4.
Я вернусь
X in 4..6,
X+1#=_G822,
X+1#=_G834,
_G822 in 5..7,
_G834 in 5..7.
(как ни странно, выполнение этого в Sicstus приводит к ошибке сегментации)
Когда я прохожу
X#<7,X#<4
Я получаю желаемое
X in inf..3.
Очевидно, я не могу передать последнее в not (Co1 # / \ # \ Co2), но первое не дает мне желаемого результата. Кто-нибудь может объяснить, почему два подхода дают разные результаты, и как я могу заставить первый действовать как второй?