提取' speso(A,Y,Z)'从数据库行进行进一步处理

时间:2015-09-02 11:56:31

标签: list prolog

我有这个数据库:

g([data(30, agosto, domenica),
   iniziato(16.45, audi, garage),
   s(17.45, pzzaDelGesu47, cpo, clienteA, pOnline),
   speso(81, gasolio, audi),
   s(19.45, fco, rexHotel, clientB, 40),
   s(21.25, fco, ripettaRelais, clienteC, 40),
   speso(4, parcheggio, adr),
   speso(11, lavaggio, viano),
   finito(23.00, audi, garage)]).

我想提取行speso(X, Y, Z)以进一步处理其中的数据。

speseG(Date, Month, ListOfSpese) :- 
   g([data(Date, Month, _)|Tail]),
   speseGAcc(Tail, [], ListOfSpese).

speseGAcc([H|T], Acc, Res) :- 
   H = speso(Amount, What, WhichCar),
   speseGAcc(T, [H|Acc], Res).
speseGAcc([H|T], Acc, Res) :-
   speseGAcc(T, Acc, Res).
speseGAcc([], Res, Res).

有没有办法在成员的帮助下提取speso(X, Y, Z)信息,而不是这样做(在我看来效率不高)?

1 个答案:

答案 0 :(得分:2)

您需要找到具有仿函数g的事实speso中的所有成员。 您可以使用元谓词findall/3

来执行此操作
?- findall(P, (g(List), member(P, List), P=..[speso|_] ), Result).

对于您当前的数据库示例,结果如下所示:

Result = [speso(81, gasolio, audi), speso(4, parcheggio, adr), speso(11, lavaggio, viano)]

此外,您应该遵循之前发布的所有建议,以获得更好的结构化知识库