Ответ в теме: Constraint Logic Programming: Ученики организовали экскурсию в горы

#1859

Не знаю что хочет преподаватель, но я думаю что правильное решение должно использовать технику логического вывода в ограничениях (Constraint Logic Programming). Такое расширение машины логического вывода используется, например, для решения систем уравнений — это очень удобно. Вне пролога существуют специальные языки, производящие вычисления в ограничениях, но внутри пролога все обычно реализуется в рамках библиотеки.

В SWI Prolog библиотека Constraint Logic Programming называется clpr. Ограничения в SWI записываются внутри фигурных скобок. Подключаете и записываете ваше выражение.

Решение задачи и пример использования Constraint Logic Programming:

:-[library(clpr)].
решение(Женщин, Мужчин, Детей):-
    {Женщин = Мужчин + 7},
    {Детей = Женщин + 45},
    {Женщин + Мужчин + Детей = 89}.

Ограничение задается в фигурных скобках, оно может содержать переменные и знаки сравнения.
?- решение(Женщин, Мужчин, Детей).
Женщин = 17.0,
Мужчин = 10.0,
Детей = 62.0.

Есть несколько вариантов реализации логического программирования в ограничениях:

  • clpr, выполняет поиск решения в дробных (Reals) числах;
  • clpq, ищет решение в рациональных числах;
  • clpb, программирование в ограничениях над логическими (Boolean) переменными;
  • clpfd, решает задачу над переменными целого типа, принимающими значения в заданном диапазоне

Это очень мощные механизмы, в каждой библиотеке содержится множество вспомогательных функций и синтаксических конструкций.