"Если == ноль" эквивалент в Прологе
Я хочу смоделировать базу знаний, где я могу утверждать расходы на различные интернет-магазины как факты. Одно правило теперь должно быть в состоянии рассчитать сумму этих расходов. Подсказка в том, что у меня есть разные скидки на магазины. Мои факты:
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
Предикат в качестве упражнения.