Настольные режимы и возврат в B-Prolog

Рассмотрим программу:

:- table cost(+, min).
cost(1, 0).
cost(1, 1).
cost(2, 1).

Я ожидал, что результат cost(I, C). будет I = 1, C = 0; I = 2, C = 1 - все возможные входные аргументы с соответствующими минимальными результатами.

Но я получаю только одно:

cost(I, C).
I = 1
C = 0 ?;
no

Но если я явно указываю на все возможности для входного аргумента, я получаю то, что хочу:

( I = 1 ; I = 2 ), cost(I, C).
I = 1
C = 0 ?;
I = 2
C = 1 ?;
no

Можно ли получить все комбинации входных аргументов с соответствующими минимальными результатами без явного перечисления всех возможных входных данных?

2 ответа

Решение

Некоторое время назад я нашел ответ прямо в руководстве B-Prolog: "Обратите внимание, что, если режимы таблиц не соблюдаются, или если нет предела для оптимизированного аргумента, программа может дать неожиданные ответы".

Код в вопросе не соответствует "стоимости стола (+, мин)". режимы и пытается использовать первый параметр cost/2 в качестве вывода.

Объявление таблицы с режимом оптимизации (мин. Или макс.) Предписывает системе составлять таблицу по одному ответу для каждой комбинации входных аргументов. Вы можете указать предел мощности, чтобы система могла хранить несколько оптимальных ответов. Например, вы можете дать объявление как:

:- table cost(+, min):3.

Затем система представит до 3 лучших ответов, упорядоченных по оптимальности, для каждого входа. Предполагается, что предел равен 1, если не указано явно.

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

Нэн-Фа Чжоу

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