我有这个数据库:
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)
信息,而不是这样做(在我看来效率不高)?
答案 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)]
此外,您应该遵循之前发布的所有建议,以获得更好的结构化知识库