你非常接近。你的基本情況很好。由於您正在手動執行遞歸,因此不需要使用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