Либо тот, либо / и тот факт в прологе - PullRequest
0 голосов
/ 14 ноября 2018

Я хочу сделать калькулятор расходов в прологе. Факты 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.

К сожалению, пролог выдает ошибку «Неопределенная процедура», если одного из фактов нет в базе знаний. Как решить эту проблему?

1 Ответ

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

Простым решением является объявление предикатов динамическими:

:- 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).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...