序言中的这个或/和那个事实

时间:2018-11-14 12:11:45

标签: prolog

我想在序言中构建费用计算器。事实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会引发错误“未定义的过程”。该问题如何解决?

1 个答案:

答案 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).