要素が既に存在し、リストにまだ重複が含まれていないかどうかを気にせずに、要素をリストに追加する方法はありますか?
3 に答える
最初にアイテムがリストに含まれているかどうかを確認し、含まれていない場合にのみ追加できます。例えば:
add_no_duplicates(List, Item, NList):-
member(Item, List) -> NList=List ; NList=[Item|List].
テスト:
?- add_no_duplicates([a,b,c],d,L).
L = [d, a, b, c].
?- add_no_duplicates([a,b,c,d],d,L).
L = [a, b, c, d].
add_no_duplicates/3 が記述されているように、入力リスト (List) をインスタンス化する必要があることに注意してください。
効率を求めるなら、リストよりも優れたデータ構造があり、SWI-Prolog ですぐに使用できます。特に、ユース ケースはadd_nb_set (+Key、!Set、?New) に適合します。
引数New
は、WRT の重複の動作を制御します。don't true
care に使用する必要があります。引数Set
は「割り当て」なければなりませんempty_nb_set(Set)
編集:申し訳ありませんが、ドキュメントページで明らかなように、引数は、たとえば、のようにSet
、自由な変数でなければなりません....don't care behaviour
add_nb_set(Key, Set, _)
基本的に、セットを実装したいと考えています。セット操作については、リストのマニュアルページを確認してください。add はないように見えますが、union/3があるため、新しい要素のセット (intersection([NewEl], OldSet, NewSet) と交差することで要素を追加できます。リストを a に変換する必要はないことに注意してください。セット (重複がない限り、リストはセットです。list_to_set/2 はそれらを削除するだけです)。
重複のあるリストがあり、あなたが述べた方法で要素を追加したい場合は、自分で何かを実装する必要があります。