2015-05-18 3 views
1

У меня есть две серии ограничений S и S ', они описывают возможно бесконечно большие множества. Скажем, например, S: x <= 10 and y <= x и S': x <= 20 and y <= 20. Теперь я хочу знать, является ли S подмножеством S'?Является ли один ряд ограничений подмножеством другого?

Я думал, что могу попытаться решить что-то вроде: S' and not (S and S'), если не удалось найти решение S является подмножеством S '.

Как бы поместить это в пролог, это надежное решение? Я использую gprolog, но я могу переключиться на другую реализацию.

+1

Есть ли меньше или равны единственный тип ограничений. В общем, это неразрешимая проблема ... –

+0

Есть еще несколько типов ограничений, например: ==,! =, <=, > =. Разве это действительно неразрешимо, я надеялся, что смогу решить его с помощью решателя. – kaibakker

+0

на конечной области будет разрешимым. Вы можете использовать импликацию # ==> и перечисление домена, но не ожидайте чего-либо достаточно быстрого для использования на практических задачах ... – CapelliC

ответ

1

Комментарий по @false правильно, насколько я могу судить: даны два множества S и S «: если S является подмножеством S», то пересечение дополнения из S «и S должен быть пустым множеством (нет элементов за пределами S», которые являются элементами S).

Кажется, что constraint programming over finite domains должен делать трюк, если вы имеете дело с целыми числами. Использование SWI-Prolog 7.3, и делает свой пример вручную, я получаю:

?- use_module(library(clpfd)). 
true. 

?- \+ (X #=< 10, Y #=< X, #\ X #=< 20 #\/ #\ Y #=< 20). 
true. 

Второй запрос должен гласить:

\+ (% succeed if no solutions 
    X #=< 10, Y #=< X, % set S and... 
    #\ X #=< 20 #\/ #\ Y #=< 20 % complement of set S' (De Morgan's Law) 
). 

Я думаю, что дополнение S "мог бы также было написано как:

\# (X #=< 20 #/\ Y #=< 20) 

Если вы хотите иметь более общее решение, которое вы должны выяснить способ, чтобы найти дополнение произвольного множества ограничений s. Обратите внимание: может использовать логический код Пролога (запятая), но вы не можете использовать дизъюнкцию как ИЛИ.

+0

CLP (Q) чаще всего требуется в этой ситуации. Хотя CLP (fd) SWI на самом деле CLP (Z) является образцовым правилом (например, SICStus), он все же делает утверждения о некоторых целых числах. В Q могут быть решения, которые не существуют в Z. – false

+0

@false Вам нужно больше понять ваш комментарий: вы имеете в виду, что лучше представлять X и Y как рациональные, или это что-то еще, что делает CLP (Q) правильный выбор? –

+0

OP не указал, что означают переменные; поэтому это предполагает скорее Q, чем Z. OTOH, в CLP (Q) вам нужно сделать отрицание вручную. Поэтому вам нужно вручную перевести 'not X #> Y' в' X # = false

Смежные вопросы