Ненужная переменная в результате минимизации при программировании логики ограничений с помощью 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. Вероятно, некоторые переменные не были спроецированы.

Другие вопросы по тегам