Lisp-set
LISP-セット
Common Lispは、セットデータ型を提供しません。 ただし、リストに対してセット操作を実行できる多くの機能を提供します。
さまざまな基準に基づいて、リスト内のアイテムを追加、削除、および検索できます。 ユニオン、インターセクション、セット差分などのさまざまなセット操作を実行することもできます。
LISPでのセットの実装
リストのようなセットは通常、コンスセルの観点から実装されます。 ただし、このまさに理由で、集合が大きくなるほど集合演算の効率は低下します。
adjoin関数は元のリストを変更しないため、リスト自体に変更を加えるには、adjoinによって返される値を元のリストに割り当てるか、マクロ pushnew を使用してアイテムを追加する必要がありますセット。
例
main.lispという名前の新しいソースコードファイルを作成し、次のコードを入力します。
あなたがコードを実行すると、それは次の結果を返します-
メンバーシップの確認
関数のメンバーグループを使用すると、要素がセットのメンバーであるかどうかを確認できます。
以下は、これらの関数の構文です-
これらの関数は、テストを満たす特定のアイテムの特定のリストを検索します。 そのような項目が見つからない場合、関数は* nil。*を返します。それ以外の場合、最初の要素として要素を持つリストの末尾が返されます。
検索はトップレベルでのみ行われます。
これらの関数は、述部として使用できます。
例
main.lispという名前の新しいソースコードファイルを作成し、次のコードを入力します。
あなたがコードを実行すると、それは次の結果を返します-
ユニオンを設定
ユニオン関数グループを使用すると、テストに基づいてこれらの関数の引数として提供された2つのリストで集合ユニオンを実行できます。
以下は、これらの関数の構文です-
例
main.lispという名前の新しいソースコードファイルを作成し、次のコードを入力します。
あなたがコードを実行すると、それは次の結果を返します-
ご注意ください
ユニオン関数は、3つのベクトルのリストに対して*:test-not# 'mismatch 引数がないと期待どおりに機能しません。 これは、リストがコンスセルで構成されており、値が一見同じように見えても、セルの *cdr 部分が一致しないため、LISPインタープリター/コンパイラーとまったく同じではないためです。 という訳だ;リストを使用して大きなセットを実装することはお勧めしません。 ただし、小さなセットには問題ありません。
交差点を設定
関数の共通部分グループを使用すると、テストに基づいてこれらの関数の引数として提供される2つのリストで共通部分を実行できます。
以下は、これらの関数の構文です-
これらの関数は2つのリストを取り、両方の引数リストにあるすべての要素を含む新しいリストを返します。 いずれかのリストに重複エントリがある場合、冗長エントリが結果に表示される場合と表示されない場合があります。
例
main.lispという名前の新しいソースコードファイルを作成し、次のコードを入力します。
あなたがコードを実行すると、それは次の結果を返します-
交差機能は、交差の破壊的なバージョンです。つまり、元のリストを破壊する可能性があります。
差を設定
関数のset-differenceグループを使用すると、テストに基づいてこれらの関数への引数として提供される2つのリストに対してset-differenceを実行できます。
以下は、これらの関数の構文です-
set-difference関数は、2番目のリストに表示されない最初のリストの要素のリストを返します。
例
main.lispという名前の新しいソースコードファイルを作成し、次のコードを入力します。
あなたがコードを実行すると、それは次の結果を返します-