Пока ответ на Прологе, который является языком логического программирования, решение легче понять как функциональную задачу, которая фильтрует факты в список, а затем складывается список в одно значение.
Чтобы отфильтровать факты в список
salary_to_list(L) :-
findall(S,salary(_,S),L).
Пример:
?- salary_to_list(L).
L = [0, 40000, 500, 0, 10000].
Чтобы сложить список в значение
sum(L,S) :-
foldl(plus,L,0,S).
Пример:
?- foldl(plus,[2,3,4],0,S).
S = 9.
Соединение двух для вашего вопроса.
entire_family(Income) :-
salary_to_list(L),
sum(L,Income).
Пример:
?- entire_family(Income).
Income = 50500.
Весь источник
:- use_module(library(apply)).
salary([bartholomew, simpson], 0).
salary([homer, simpson], 40000).
salary([lisa, simpson], 500).
salary([maggie, simpson], 0).
salary([marge, simpson], 10000).
salary_to_list(L) :-
findall(S,salary(_,S),L).
sum(L,S) :-
foldl(plus,L,0,S).
entire_family(Income) :-
salary_to_list(L),
sum(L,Income).
Ссылки:
SWI-Prolog:
Поиск всех решений для цели - findall / 3
библиотека (применить): применять предикаты в списке -foldl / 4
Целочисленная арифметика специального назначения - плюс / 3
Сила пролога:
Предикаты высшего порядка