Описание тега clpfd
CLP(FD) означает программирование логики ограничений в конечных областях. Ограничения конечной области - это отношения над целочисленными выражениями, которые можно использовать для моделирования и решения большого количества комбинаторных задач, таких как планирование, планирование и задачи распределения. Они также используются для получения общей и чистой целочисленной арифметики в Прологе.
Почти все современные реализации Prolog включают решатель CLP(FD), который либо уже является неотъемлемой частью системы (примеры: GNU Prolog и B-Prolog), либо доступен в виде библиотеки (примеры: SICStus Prolog, SWI-Prolog, YAP)..
Основное использование ограничений CLP(FD) - вычисление целочисленных выражений. Например:
?- X #= 3+5.
X = 8.
В отличие от предикатов более низкого уровня, ограничения CLP(FD) могут использоваться во всех направлениях. Например:
?- 8 #= 3+X.
X = 5.
Ограничения CLP(FD) также могут использоваться, если конкретное значение еще не может быть выведено. Вот пример использования ограничений конечной области в SWI-Prolog после загрузкиlibrary(clpfd)
(введя use_module(library(clpfd)).
на интерактивном верхнем уровне). Мы просим положительные целые числаX
а также Y
сумма которых равна 15:
?- X + Y #= 15, X #> 0, Y #> 0.
Решатель ограничений отвечает следующим образом:
X in 1..14,
X+Y#=15,
Y in 1..14.
В этом случае решающая программа CLP(FD) пришла к выводу, что обе переменные должны быть целыми числами от 1 до 14.
При привязке одной из переменных к конкретным целым числам с помощью встроенного предиката indomain/1
, решатель ограничений автоматически выводит привязку для другой переменной, чтобы все ограничения были выполнены:
?- X + Y #= 15, X #> 0, Y #> 0, indomain(X).
X = 1, Y = 14 ;
X = 2, Y = 13 ;
X = 3, Y = 12 ;
etc.
Чтобы использовать его, вам необходимо импортировать эту библиотеку (в SWI Prolog):
:- use_module(library(clpfd)).
Реализации
library(clpfd)
из sicstus-прологеlibrary(clpfd)
из SWI-Prolog- gnu-prolog
-
clpfd/clpz
для sicstus-prolog