For Development HEAD DRAFTSearch (procedure/syntax/module):

11.54 srfi.217 - 整数集合

Module: srfi.217

このsrfiは要素がfixnumに限定されたセットを定義します。

汎用のセットはscheme.setで提供されています(scheme.set - R7RSセット参照)が、 このモジュールは要素が限定されていることを利用してコンパクトにセットを保持します。

また、汎用のセットにはない、キーの範囲を使った操作も提供しています。

Constructors

Function: iset element …

[SRFI-217]{srfi.217} element … を要素とする新たなisetを作って返します。 各elementはfixnumでなければなりません。

Function: iset-unfold p f g seed

[SRFI-217]{srfi.217} 手続的に要素を計算して整数集合を作ります。

pは現在の状態値を引数に取り、それが#tを返せば繰り返しを終了します。

fは現在の状態値を引数に取り、集合に含めるべきfixnumを返します。

gは現在の状態値を引数に取り、次の状態値を返します。

seedは状態値の初期値を指定します。

(iset->list
 (iset-unfold (cut > <> 10) (cut * <> 2) (cut + <> 1) 0))
 ⇒ (0 2 4 6 8 10 12 14 16 18 20)
Function: make-range-iset start end :optional step

[SRFI-217]{srfi.217} (numeric-range start end step)で生成されるレンジ に含まれるfixnumを要素とする整数集合を作って返します。 レンジについてはdata.range - レンジを参照してください。

(iset->list (make-range-iset 0 5))
 ⇒ (0 1 2 3 4)

述語

Function: iset? obj

[SRFI-217]{srfi.217} objが整数集合なら#tを、そうでなければ#fを返します。

Function: iset-contains? iset element

[SRFI-217]{srfi.217} isetelementを要素に持っていれば#tを、 そうでなければ#fを返します。

Function: iset-empty? iset

[SRFI-217]{srfi.217} isetが空なら#tを、そうでなければ#fを返します。

Function: iset-disjoint? iset1 iset2

[SRFI-217]{srfi.217} 引数はともに整数集合でなければなりません。 両方に共通する要素が無ければ#tを、あれば#fを返します。

アクセサ

Function: iset-member iset element default

[SRFI-217]{srfi.217} elementisetの要素であればそれを、 でなければdefaultを返します。

Function: iset-min iset
Function: iset-max iset

[SRFI-217]{srfi.217} isetの最小または最大の要素を返します。 isetが空の場合は#fを返します。

更新

Function: iset-adjoin iset elt1 elt2 …
Function: iset-adjoin! iset elt1 elt2 …

[SRFI-217]{srfi.217} isetの要素に、elt1 elt2 …を加えたものを要素として持つ 整数集合を返します。elt1 elt2 … にfixnum以外のものが 含まれていたらエラーが投げられます。

線形更新版iset-adjoin!は結果を作るのにisetを再利用するかもしれません。 ただしそれは保証されていないので、呼び出し側は常に返り値を利用してください。

Function: iset-delete iset elt1 elt2 …
Function: iset-delete! iset elt1 elt2 …

[SRFI-217]{srfi.217} isetの要素から、elt1 elt2 …を除いたものを含む 整数集合を返します。

線形更新版iset-delete!は結果を作るのにisetを再利用するかもしれません。 ただしそれは保証されていないので、呼び出し側は常に返り値を利用してください。

Function: iset-delete-all iset elt-list
Function: iset-delete-all! iset elt-list

[SRFI-217]{srfi.217} elt-list引数はfixnumのリストでなければなりません。 isetの要素から、elt-listに含まれるfixnumを取り除いたものを要素とする 整数集合を返します。

線形更新版iset-delete-all!は結果を作るのにisetを再利用するかもしれません。 ただしそれは保証されていないので、呼び出し側は常に返り値を利用してください。

Function: iset-delete-min iset
Function: iset-delete-min! iset
Function: iset-delete-max iset
Function: iset-delete-max! iset

[SRFI-217]{srfi.217} 二つの値を返します。isetの最小もしくは最大の要素と、 その要素を取り除いた整数集合です。isetが空の場合はエラーが投げられます。

線形更新版iset-delete-min!/iset-delete-mac!は結果を作るのに isetを再利用するかもしれません。 ただしそれは保証されていないので、呼び出し側は常に返り値を利用してください。

Function: iset-search iset element failure success
Function: iset-search! iset element failure success

[SRFI-217]{srfi.217} isetの要素のうちelementと一致するものを下から順に探します。 戻り値は二つで、一つ目は整数集合、二つ目は以下に説明する補助値です。 failuresuccessはともに手続きです。

elementが見つかった場合、successが3つの引数で呼び出されます: マッチした要素、手続きupdate、そいて手続きremoveです。 success手続きはそのまま戻るか、updateremoveのどちらかを 末尾呼び出しすることができます。

update手続きは二つの引数new-elementobjを取ります。 呼ばれると、この手続きはisetの要素elementnew-element で置き換えた整数集合およびobjを戻り値として返します。 remove手続きは一つの引数objを取り、isetからelement を除いた整数集合およびobjを戻り値として返します。 success手続きからこれらの手続きが末尾呼び出しされていれば、 この整数集合とobjがそのままiset-searchの戻り値となります。

elementが見つからなかった場合、failure手続きが二つの引数、 insertignoreを伴って呼ばれます。これらはそれぞれが手続きで、 failureはどちらかを末尾呼び出ししなければなりません。

insert手続きはひとつの引数objを取り、 elementisetに追加した整数集合とobjを戻り値とします。 ignore手続きはひとつの引数objを取り、 isetそのものとobjを戻り値とします。

線形更新版のiset-search!では、結果の整数集合を作るために isetが破壊的に変更されるかもしれません。

集合全体への操作

Function: iset-size iset

[SRFI-217]{srfi.217} isetの要素数を返します。

Function: iset-find pred iset failure

[SRFI-217]{srfi.217} isetの要素のうち、述語predを満たす最小の要素を返します。 もしpredを満たす要素が見つからなかったら、手続きfailureを引数無しで 呼び出しその結果を返します。

Function: iset-count pred iset

[SRFI-217]{srfi.217} isetの要素のうち、述語predを満たすものの個数を返します。

Function: iset-any? pred iset

[SRFI-217]{srfi.217} isetの要素のうちpredを満たすものがひとつでもあれば#tを、 そうでなければ#fを返します。

Function: iset-every? pred iset

[SRFI-217]{srfi.217} isetの要素が全てpredを満たしたら#tを、そうでなければ#fを 返します。

マップとfold

Function: iset-map proc iset

[SRFI-217]{srfi.217} isetの各要素にprocを適用し、その結果を集めたisetを作って返します。 procの戻り値がfixnumでなければエラーが投げられます。

procが単射でなければ、返される整数集合は元のisetより小さくなります。

procが適用される順序は不定です。

Function: iset-for-each proc iset

[SRFI-217]{srfi.217} procisetの各要素に、要素の昇順に適用します。 procの結果は捨てられます。戻り値は指定されません。

Function: iset-fold kons knil iset
Function: iset-fold-right kons knil iset

[SRFI-217]{srfi.217} fold/fold-rightと同じように、konsisetの各要素と 直前のkonsの結果を引数にして呼び出してゆきます。最初のkonsの呼び出しには knilが使われます。要素はそれぞれ昇順/降順に呼び出されます。 最後のkonsの結果が戻り値になります。 isetが空なら、konsは呼ばれずknilがそのまま返されます。

(iset-fold cons '() (iset 2 3 5 7 11))
  ⇒ (11 7 5 3 2)
(iset-fold-right cons '() (iset 2 3 5 7 11))
  ⇒ (2 3 5 7 11)
Function: iset-filter pred iset
Function: iset-filter! pred iset

[SRFI-217]{srfi.217} isetの要素のうち、述語predを満たすものだけを集めた整数集合を作って返します。 線形更新版iset-filter!は結果を作るためにisetを再利用するかもしれません。

Function: iset-remove pred iset
Function: iset-remove! pred iset

[SRFI-217]{srfi.217} isetの要素のうち、述語predを満たさないものだけを集めた整数集合を作って返します。 線形更新版iset-remove!は結果を作るためにisetを再利用するかもしれません。

Function: iset-partition pred iset
Function: iset-partition! pred iset

[SRFI-217]{srfi.217} ふたつの整数集合を返します。一つ目は、isetの要素のうち述語predを満たすもの、 二つ目は満たさないものを集めた集合です。 線形更新版iset-partition!は結果を作るためにisetを再利用するかもしれません。

コピーと変換

Function: iset-copy iset

[SRFI-217]{srfi.217} isetのコピーを返します。

Function: iset->list iset

[SRFI-217]{srfi.217} isetの要素を昇順に並べたリストを返します。

Function: list->iset list

[SRFI-217]{srfi.217} listはfixnumのリストでなければなりません。 それらを要素として持つ整数集合を作って返します。重複する要素はひとつにまとめられます。

Function: list->iset! iset list

[SRFI-217]{srfi.217} isetに、fixnumのリストlistを要素として足した整数集合を返します。 引数isetは結果を作るために破壊的に再利用されるかもしれません。

部分集合

Function: iset=? iset1 iset2 iset3 …

[SRFI-217]{srfi.217} 与えられた整数集合すべてが同じ要素を含んでいれば#tを、 そうでなければ#fを返します。

Function: iset<? iset1 iset2 iset3 …
Function: iset<=? iset1 iset2 iset3 …
Function: iset>? iset1 iset2 iset3 …
Function: iset>=? iset1 iset2 iset3 …

[SRFI-217]{srfi.217} 整数集合間の包含関係を比較します。 例えば(iset<=? iset1 iset2)は、iset1の全ての要素がiset2に 含まれている場合(iset1iset2の部分集合である場合)に#t、 そうでなければ#fとなります。

集合演算

Function: iset-union iset1 iset2 iset3 …
Function: iset-union! iset1 iset2 iset3 …

[SRFI-217]{srfi.217} 与えられた整数集合の和集合を返します。 iset-unionは関数的で、常に新たな整数集合を作って返します。 線形更新版のiset-union!は、結果を作るためにiset1を破壊的に再利用する かもしれません。

Function: iset-intersection iset1 iset2 iset3 …
Function: iset-intersection! iset1 iset2 iset3 …

[SRFI-217]{srfi.217} 与えられた整数集合全てに共通する要素を含む整数集合を返します。 iset-intersectionは関数的で、常に新たな整数集合を作って返します。 線形更新版のiset-intersection!は、結果を作るためにiset1を破壊的に再利用する かもしれません。

Function: iset-difference iset1 iset2 iset3 …
Function: iset-difference! iset1 iset2 iset3 …

[SRFI-217]{srfi.217} iset1の要素のうち、iset2, iset3 …に含まれないものを 集めた整数集合を返します。 iset-differenceは関数的で、常に新たな整数集合を作って返します。 線形更新版のiset-difference!は、結果を作るためにiset1を破壊的に再利用する かもしれません。

Function: iset-xor iset1 iset2
Function: iset-xor! iset1 iset2

[SRFI-217]{srfi.217} iset1iset2のどちらか一方のみに含まれている要素を集めた整数集合を 返します。 iset-xorは関数的で、常に新たな整数集合を作って返します。 線形更新版のiset-xor!は、結果を作るためにiset1を破壊的に再利用する かもしれません。

区間

Function: iset-open-interval iset low high
Function: iset-closed-interval iset low high
Function: iset-open-closed-interval iset low high
Function: iset-closed-open-interval iset low high

[SRFI-217]{srfi.217} isetの要素のうち、実数lowhighで指定される区間内の 要素のみを含むisetを返します。下限low、上限highそれぞれを 区間に含むか含まないかで4種類のバリエーションがあります。 iset-open-intervalは共に含まず、 iset-close-intervalは共に含み、 iset-open-closed-intervallowを含まずhighは含み、 iset-closed-open-intervallowを含みhighは含みません。

(iset->list (iset-open-interval (iset 2 3 5 7 11) 2 7))
  ⇒ (3 5)
(iset->list (iset-closed-interval (iset 2 3 5 7 11) 2 7))
  ⇒ (2 3 5 7)
(iset->list (iset-open-closed-interval (iset 2 3 5 7 11) 2 7))
  ⇒ (3 5 7)
(iset->list (iset-closed-open-interval (iset 2 3 5 7 11) 2 7))
  ⇒ (2 3 5)
Function: isubset= iset k
Function: isubset< iset k
Function: isubset<= iset k
Function: isubset> iset k
Function: isubset>= iset k

[SRFI-217]{srfi.217} isetの要素のうち、それぞれ、 実数kと等しい要素のみを含む部分集合、 k未満の要素のみを含む部分集合、 k以下の要素のみを含む部分集合、 k超過の要素のみを含む部分集合、 k以上の要素のみを含む部分集合を返します。



For Development HEAD DRAFTSearch (procedure/syntax/module):
DRAFT