2013-02-28 53 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

相關問題