Решение системы (более двух) линейных неравенств
Если я использую
diophantine(2*x+3*y-5*z-77)
Я получаю этот результат.
{(t_0, -9*t_0 - 5*t_1 + 154, -5*t_0 - 3*t_1 + 77)}
Хорошо пока. Однако иногда можно ограничить x, y и z, чтобы они были (скажем) неотрицательными. Когда я использую такой подход<
reduce_inequalities([0<=t_0, 0<=-9*t_0 - 5*t_1 + 154, 0<=-5*t_0 - 3*t_1 + 77],[t_0, t_1])
Я получил:
NotImplementedError:
inequality has more than one symbol of interest
Имеются ли у sympy, sage, prolog, haskell или какого-либо другого свободно доступного продукта средства для решения систем линейных неравенств, возникающих таким образом.
Спасибо!
1 ответ
Чтобы рассуждать о целых числах в Prolog, вы можете использовать ограничения CLP(FD) вашей системы Prolog.
Точные детали немного отличаются в разных системах Prolog. Пожалуйста, смотрите руководство к вашей системе для получения дополнительной информации, а также clpfd для связанных вопросов.
В вашем случае мы можем начать с простого размещения ограничения:
? - 2 * X + 3* Y - 5 * Z # = 77.2 * Х + 3* y #=5*Z+, 77.
В этом случае, как и для всех чистых программ Prolog, ответ системы декларативно эквивалентен исходному запросу. Здесь это не очень помогает: система лишь слегка переписала исходное ограничение.
Вы можете ограничить это далее, например, с помощью:
? - 2 * X + 3* Y - 5 * Z # = 77, [X, Y,Z] ins 0..суп. X в 0..., 2*X+3*Y#=5*Z+77, Y в 0...,Z в 0...
В соответствии с запросом эта дополнительная цель ограничивает переменные неотрицательными целыми числами. Ответ системы по-прежнему не очень помогает.
Ты можешь использовать label/1
искать конкретные решения. Однако эта так называемая маркировка требует, чтобы все домены были конечными, и поэтому мы в настоящее время получаем:
? - 2 * X + 3* Y - 5 * Z # = 77, Vs = [X, Y,Z], Vs ins 0..sup, ярлык (против).ОШИБКА: Аргументы недостаточно проработаны
Хорошая новость (в некотором смысле) в том, что у нас нет времени, чтобы попробовать все возможности в любом случае. Таким образом, мы могли бы также ограничиться некоторой конечной частью пространства поиска. Например:
? - 2 * X + 3* Y - 5 * Z # = 77, Vs = [X, Y,Z], По сравнению с 0,10 000 000 000 000 000 000, этикетки (Vs).
С помощью этого запроса вы получаете конкретные целые числа в качестве решений:
Х = 0, Y = 29, Z = 2, Vs = [0, 29, 2]; Х = 0, Y = 34, Z = 5, Vs = [0, 34, 5]; Х = 0, Y = 39, Z = 8, Vs = [0, 39, 8]; Х = 0, Y = 44, Z = 11, Vs = [0, 44, 11]; и т.п.
Поскольку вы рассуждаете о линейных ограничениях, CLP(Q) также стоит попробовать.