Finite Domain Solver fd_minimize/2
Мне нужно минимизировать предикат в Прологе. В настоящее время я использую GNU Prolog Java. У меня есть этот факт
army( Territory,X ).
Это говорит о том, что у данной территории есть Х армия. Теперь я хочу найти минимальное количество армий, которыми владеет данный игрок. Итак, я пишу:
place_army( Player, Territory ):-
fd_maximize( army(Territory, X), X ),
owner( Player, Territory ).
Переводчик говорит:
java.lang.IllegalArgumentException: цель в настоящее время не активна
Через некоторое время я обнаружил проблему: http://www.gprolog.org/manual/gprolog.html Я предполагаю, что проблема в том, что реализация интерпретатора Java не имеет решателя FD. Любой намек / обходной путь?
2 ответа
Есть две разные системы с очень похожим названием:
GNU Prolog (см. Gnu-prolog), система ISO Prolog с новаторской реализацией CLP(FD), которая получила это название 1999-04-19 и которая активно развивается - самая последняя версия была выпущена час назад. fd_minimize/2
и такие являются частью GNU Prolog.
Кроме того, существует последняя система под названием GNU Prolog for Java, последняя версия которой - 2010-08-15.
Возможно, эта путаница с именами может быть решена.
Вы могли бы достичь того же результата, что fd_minimize/2
обеспечивает с findall/3
а также keysort/2
предикаты.
findall(X-T,army(T,X),B),keysort(B,[MinX-Territory|Cs]),
может заменить
fd_minimize(army(Territory,X),X),
обеспечивая одинаковое значение для Territory
,