2013-02-28 123 views
0

我想填充一个列表,其中包含我在另一个列表中的结构,但是使用结构中的一个参数(由用户,类型引入)过滤选择,而且我不能似乎得到了递归的权利,帮助将非常感激。从序言中选择一个列表

selectOmnibus([],_,[]). 
selectOmnibus([H|T],Type,[O|R]):- 
     member(O,[H|T]), 
    O = omnibus(Type,_,_,_,_), 
    selectOmnibus(T,Type,R). 

回答

0

你非常接近。你的基本情况很好。由于您正在手动执行递归,因此不需要使用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). 

请注意,您必须重复倒置的测试。你可以添加一个剪切来提高效率,但是你必须重复逆向测试,否则你将不会有“向后的正确性”,因为通过回溯可以输入第三个子句,并且不会有任何确保你没有丢弃合法的综合体。

+0

帮助真实,真正好,非常感谢! – jmiguel 2013-02-28 05:47:36

+0

还有一件事,是否可以替换 - >为,?? – jmiguel 2013-02-28 05:53:33

+0

只有当我以两种方式分开条款时,一种是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