あなたはとても近くにいます。あなたのベースケースは大丈夫です。手動で再帰を行っているため、使用する必要はありません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).
テストを反転して繰り返す必要があることに注意してください。カットを追加してより効率的にすることもできますが、逆テストを繰り返す必要があります。そうしないと、バックトラックによって 3 番目の句に入ることが可能になり、そこに何もないため、「後方の正確性」が得られなくなります。正当なオムニバスを破棄していないことを確認してください。