我试图用我在另一个列表中的结构填充一个列表,但是使用结构的一个参数(由用户引入,类型)过滤选择,我似乎无法获得正确的递归,帮助会非常感谢。
selectOmnibus([],_,[]).
selectOmnibus([H|T],Type,[O|R]):-
member(O,[H|T]),
O = omnibus(Type,_,_,_,_),
selectOmnibus(T,Type,R).
你很亲密。你的基本情况很好。由于您是手动进行递归,因此您不需要使用member/2
. 您还缺少另一个归纳案例,即O
与结构类型不匹配的地方。
selectOmnibus([], _, []).
selectOmnibus([O|T], Type, Result) :-
O = omnibus(Type,_,_,_,_)
-> (selectOmnibus(T,Type,R), Result = [O|R])
; selectOmnibus(T, Type, Result).
试试看。如果不正确,查看示例输入和输出会有所帮助。
编辑:您可以像这样分隔子句:
selectOmnibus([], _, []).
selectOmnibus([O|T], Type, [O|R]) :-
O = omnibus(Type,_,_,_,_),
selectOmnibus(T,Type,R).
selectOmnibus([O|T], Type, R) :-
O \= omnibus(Type,_,_,_,_),
selectOmnibus(T,Type,R).
请注意,您必须反向重复测试。您可以添加一个剪切以使其更有效,但是您必须重复逆向测试,否则您将不会有“向后正确性”,因为可以通过回溯进入第三个子句并且那里没有任何东西可以确保您不会丢弃合法的综合服务。