0

要素が既に存在し、リストにまだ重複が含まれていないかどうかを気にせずに、要素をリストに追加する方法はありますか?

4

3 に答える 3

2

最初にアイテムがリストに含まれているかどうかを確認し、含まれていない場合にのみ追加できます。例えば:

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) をインスタンス化する必要があることに注意してください。

于 2012-07-24T13:20:04.603 に答える
2

効率を求めるなら、リストよりも優れたデータ構造があり、SWI-Prolog ですぐに使用できます。特に、ユース ケースはadd_nb_set (+Key、!Set、?New) に適合します。

引数Newは、WRT の重複の動作を制御します。don't truecare に使用する必要があります。引数Setは「割り当て」なければなりませんempty_nb_set(Set)

編集:申し訳ありませんが、ドキュメントページで明らかなように、引数は、たとえば、のようにSet、自由な変数でなければなりません....don't care behaviouradd_nb_set(Key, Set, _)

于 2012-07-24T16:58:58.340 に答える
1

基本的に、セットを実装したいと考えています。セット操作については、リストのマニュアルページを確認してください。add はないように見えますが、union/3があるため、新しい要素のセット (intersection([NewEl], OldSet, NewSet) と交差することで要素を追加できます。リストを a に変換する必要はないことに注意してください。セット (重複がない限り、リストはセットです。list_to_set/2 はそれらを削除するだけです)。

重複のあるリストがあり、あなたが述べた方法で要素を追加したい場合は、自分で何かを実装する必要があります。

于 2012-07-24T12:34:28.847 に答える