0

別のリストにある構造でリストを埋めようとしていますが、構造の引数 (ユーザーによって導入されたタイプ) の 1 つを使用して選択をフィルタリングしていますが、再帰を正しく取得できないようです。非常に高く評価されます。

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

1 に答える 1

0

あなたはとても近くにいます。あなたのベースケースは大丈夫です。手動で再帰を行っているため、使用する必要はありませんmember/2Oまた、構造型と一致しない他の帰納的なケースも見逃しています。

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 番目の句に入ることが可能になり、そこに何もないため、「後方の正確性」が得られなくなります。正当なオムニバスを破棄していないことを確認してください。

于 2013-02-28T05:28:29.737 に答える