我想在序言中构建费用计算器。事实onetime_expense(X).
或monthly_expense(X).
可能存在。总结一下费用,我使用以下公式:
expenses(X):-
findall(
Value,
( monthly_expense(Y),
Value is Y * 12
),
Values
),
findall(
Value1,
( onetime_expense(Z),
Value1 is Z
),
Values1
),
sum_list(Values, Sum),
sum_list(Values1, Sum1),
X is Sum + Sum1.
不幸的是,如果事实之一不在知识库中,则prolog会引发错误“未定义的过程”。该问题如何解决?
答案 0 :(得分:1)
一个简单的解决方案是声明谓词为动态:
:- dynamic(monthly_expense/1).
:- dynamic(onetime_expense/1).
对被动态声明但未定义的谓词的调用只是失败,而不是抛出谓词存在错误。
P.S。您可以使用事实上的标准谓词findall/4
来简化代码:
expenses(Sum):-
findall(
MonthlyValue,
( monthly_expense(Y),
MonthlyValue is Y * 12
),
MonthlyValues
),
findall(
OneTimeValue,
( onetime_expense(Z),
OneTimeValue is Z
),
Values,
MonthlyValues
),
sum_list(Values, Sum).