Как накапливать факты в ценность в Прологе - PullRequest
0 голосов
/ 15 декабря 2018

Вот факты:

% structure: salary([Name, Last Name], salary_amount).

salary([bartholomew, simpson], 0).    
salary([homer, simpson], 40000).    
salary([lisa, simpson], 500).    
salary([maggie, simpson], 0).    
salary([marge, simpson], 10000).

Вот мой предикат для распечатки всех зарплат

entire_family(X,Income) :-
    bagof(_,salary([_, X],Income), _).

, который выдает

Income = 0 ;    
Income = 40000 ;    
Income = 500 ;    
Income = 0 ;    
Income = 10000.

Мне нужновывести его

Income: 50500 (total salaries of the Simpson family)

Если у кого-нибудь есть намеки на меня, пожалуйста, дайте мне знать!

1 Ответ

0 голосов
/ 15 декабря 2018

Пока ответ на Прологе, который является языком логического программирования, решение легче понять как функциональную задачу, которая фильтрует факты в список, а затем складывается список в одно значение.

Чтобы отфильтровать факты в список

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

Сила пролога:
Предикаты высшего порядка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...