"Если == ноль" эквивалент в Прологе

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

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 ответ

Решение

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

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 Предикат в качестве упражнения.

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