List 提取';斯佩索(A,Y,Z)和#x27;用于进一步处理的数据库行

List 提取';斯佩索(A,Y,Z)和#x27;用于进一步处理的数据库行,list,prolog,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), spes

我有这个数据库:

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)
信息?

您需要从facts
g
中找到所有具有functor
speso
的成员。 您可以使用元谓词来实现这一点

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

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

此外,您应该遵循之前发布的所有建议,以实现更好的结构化知识数据库。至少,试着在你的问题中使用正确的语法。
member(exponed(Amount,R,C),g(TheListOfDataBase))
的问题在于
g(TheListOfDataBase)
不会像返回函数一样返回值。您必须查询它:
g(列表数据库)、成员(花费(金额、R、C)、列表数据库),…
。另外,您的数据库示例(您两次发布它)中至少有一个语法错误。请继续阅读,并了解a是什么。如果您正在寻找更好的方法来提取
花费的
信息,我认为您应该重新构造数据,使其不是列表格式。相反,为每个花费的
项目定义一个事实。如果您希望只提取给定日期的数据,那么该日期(或日期)应该是该事实的参数之一,以便可以通过查询正确地选择它。但是,如果您希望数据按您现有的方式进行结构化,那么您可能不会使用比使用
member/2
(或
memberchk/2
)更有效的方法。谢谢Yasel。您的建议对我帮助很大。太好了@vincent,我很高兴听到。如果您认为答案是正确的,并且可以帮助其他人,请将其标记为已接受。
Result = [speso(81, gasolio, audi), speso(4, parcheggio, adr), speso(11, lavaggio, viano)]