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)
信息?您需要从factsg
中找到所有具有functorspeso
的成员。
您可以使用元谓词来实现这一点
对于当前数据库示例,结果如下所示:
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)]