Ненужная переменная в результате минимизации при программировании логики ограничений с помощью swi-prolog
Я следую за Иваном Браткосом "Пролог программирования для искусственного интеллекта, четвертое издание", и сейчас я читаю о программировании логики ограничений.
В книге приведен небольшой пример оптимизации для планирования задач, который выглядит следующим образом:
{Ta >= 0,
Ta + 2 =< Tb,
Ta + 2 =< Tc,
Tb + 3 =< Td,
Tc + 5 =< Tf,
Td + 4 =< Tf},
minimize(Tf).
что в Swi-пролог приводит к
Ta = 0,
Tb = 2,
Td = 5,
Tf = 9,
{_G371>=0, _G377=2-_G371, _G371=<2, Tc=4-_G371}.
Результат хороший (хотя он был бы красивее, если бы он просто написал {Tc =< 4} {Tc >= 2}, как в книге), но я не понимаю, почему он добавляет '_G377=2-_G371'часть, - кажется очень ненужным...
почему эта дополнительная переменная (_G377) добавлена к результату?
в случае, если кто-то еще читает книгу: я изменил "Та =< 0" на "Та>= 0", так как я считаю, что "Та =< 0" - ошибка в книге.
1 ответ
Ответ, который вы показываете, предполагает, что вы используете library(clpq)
и не library(clpr)
, В оригинальной реализации этой библиотеки в SICStus Prolog я получаю:
| ?- {Ta >= 0,
Ta + 2 =< Tb,
Ta + 2 =< Tc,
Tb + 3 =< Td,
Tc + 5 =< Tf,
Td + 4 =< Tf},
minimize(Tf).
Ta = 0,
Tb = 2,
Td = 5,
Tf = 9,
{Tc=<4},
{Tc>=2} ?
yes
Так что это похоже на ошибку в SWI. Вероятно, некоторые переменные не были спроецированы.