В некоторых системах программирования логики ограничений вы можете легко увидеть, является ли набор решений бесконечным или нет. Например, в некоторых реализациях CLP (FD) (например, SWI-Prolog, Jekejeke Minlog, других реализациях, таких как GNU Prolog и B-Prolog нет, поскольку они предполагают конечную верхнюю / нижнюю границу), определенная степень рассуждения с бесконечными целочисленными наборами равна таким образом поддерживается. Это видно по интервальным обозначениям, таким как (SWI-Prolog):
?- use_module(library(clpfd)).
true.
?- X #\= 2.
X in inf..1\/3..sup.
Но у этих наборов есть недостаток: они не могут быть использованы при маркировке CLP (FD), где перечисляются элементы набора и делается дальнейшая попытка решения созданных экземпляров уравнений. Это также будет противоречить следующему результату, если что-то можно будет сделать вообще для решения запросов CLP (FD):
«В 1900 году, признавая их глубину, Дэвид Гильберт предложил
разрешимость всех диофантовых задач как десятая часть его
Отмеченные проблемы. В 1970 году появился новый результат в математической логике
известная как теорема Матиясевича, проблема решена отрицательно:
общие диофантовы проблемы неразрешимы ».
(Из Википедии о Диофантовых уравнениях )
Другим логическим ограничивающим программированием, которое обычно может также работать с бесконечными наборами решений, является CLP (R). Рассуждения среди уравнений там немного сильнее. Например, CLP (FD) не обнаруживает следующее несоответствие (зависит от системы, это результат для SWI-Prolog, в Jekejeke Minlog вы сразу увидите No для второго запроса, а GNU Prolog будет зацикливаться в течение примерно 4 секунд. а затем сказать нет):
?- X #> Y.
Y#=<X+ -1.
?- X #> Y, Y #> X.
X#=<Y+ -1,
Y#=<X+ -1.
С другой стороны, CLP (R) найдет:
?- use_module(library(clpr)).
?- {X > Y}.
{Y=X-_G5542, _G5542 > 0.0}.
?- {X > Y, Y > X}.
false.
Системы ограничений работают, реализуя алгоритмы из теории чисел, линейной алгебры, анализа и т. Д. В зависимости от области, которую они моделируют, т.е. что * обозначает в обозначении CLP (*). Эти алгоритмы могут доходить до исключения квантификатора .
Bye