你非常接近。你的基本情况很好。由于您正在手动执行递归,因此不需要使用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).
请注意,您必须重复倒置的测试。你可以添加一个剪切来提高效率,但是你必须重复逆向测试,否则你将不会有“向后的正确性”,因为通过回溯可以输入第三个子句,并且不会有任何确保你没有丢弃合法的综合体。
帮助真实,真正好,非常感谢! – jmiguel 2013-02-28 05:47:36
还有一件事,是否可以替换 - >为,?? – jmiguel 2013-02-28 05:53:33
只有当我以两种方式分开条款时,一种是O统一,另一种是其他。 selectOmnibus([],_,[])。 selectOmnibus([O | T],Type,Result): - O = omnibus(Type,_,_,_,_) ,(selectOmnibus(T,Type,R),Result = [O | R]) 。 selectOmnibus(〔O | T],类型,结果): - \t \tø\ =总括(类型,_,_,_,_) \t \t,selectOmnibus(T,类型,结果)。 – jmiguel 2013-02-28 05:54:51