«Если == ноль» эквивалент в Прологе - PullRequest
0 голосов
/ 13 ноября 2018

Я хочу смоделировать базу знаний, в которой я могу утверждать расходы на различные онлайн-магазины как факты. Теперь одно правило должно быть в состоянии рассчитать сумму этих расходов. Подсказка в том, что у меня есть разные скидки на магазины. Мои факты:

expense(shopA, 450).
expense(shopB, 60).

Мое правило:

sumOfExpenses(X):-
   expense(shopA, A),
   expense(shopB, B),
   expense(shopC, C),
   X is A*0.05 + B*0.25 + C*0.1.

Выполнение sumOfExpenses (X) возвращает false. Я сделал некоторую отладку, и если бы я добавил, например: expense(shopC, 50). к фактам, это сработало бы.

Есть ли решение этой проблемы?

1 Ответ

0 голосов
/ 13 ноября 2018

Вы можете добавить дополнительный набор фактов для представления скидок магазина.Например,

discount(shopA, 0.05).
discount(shopB, 0.55).
discount(shopC, 0.10).

Это более удобочитаемое, поддерживаемое и масштабируемое решение, чем жесткая привязка скидок в формуле суммы затрат.Это также позволяет вам написать более гибкую версию предиката sum_of_expenses/1.Например,

sum_of_expenses(Sum) :-
    findall(
       Value,
       (   expense(Shop, Expense),
           discount(Shop, Discount),
           Value is Expense * Discount
       ),
       Values
    ),
    sum(Values, Sum).

В расчетах будут использоваться только те магазины, на которые есть расходы.Я оставлю вам писать предикат sum/2 в качестве упражнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...