エントリ集合演算について†アリス「ねぇ、ボブ。」 目次†エントリ集合演算の基礎†まず、以下のような置換子を含まないエントリ定義が存在するとします。 野菜: きゅうり, なす, スイカ, トマト 果物: りんご, みかん, なし, スイカ, トマト 和集合演算'+'†和集合演算'+'では、演算子'+'の左辺のエントリに登録されている文の集合と右辺のエントリに登録されている文の集合のいずれかに含まれる文の集合からランダムに一つの文が選ばれます。 左辺=「野菜」エントリに登録されている「きゅうり」、「なす」、「スイカ」、「トマト」 右辺=「果物」エントリに登録されている「りんご」、「みかん」、「なし」、「スイカ」、「トマト」 なので、${野菜 + 果物}の結果は、「野菜」エントリと「果物」エントリのいずれかに含まれる文の集合、すなわち、 きゅうり, なす, スイカ, トマト, りんご, みかん、なし の7つの文からなる集合から一つの文が等確率なランダムに選ばれます。「果物」と「野菜」の両方のエントリに含まれているからといって「スイカ」や「トマト」が選択される確率が2倍になったりはしないことに注意してください。
ちなみに、出てくる文の候補は同じことであっても、 野菜か果物: ${野菜}, ${果物} のエントリ呼び出しを実施したときと、${野菜 + 果物}のエントリ呼び出しを実施したときでは個々の文の出てくる確率が変わることに注意してください。
差集合演算'-'†差集合演算'-'では、演算子'-'の左辺のエントリに登録されている文の集合のうち、右辺の登録されている文の集合には含まれていない文の集合からランダムに一つの文が選ばれます。 左辺=「野菜」エントリに登録されている「きゅうり」、「なす」、「スイカ」、「トマト」 右辺=「果物」エントリに登録されている「りんご」、「みかん」、「なし」、「スイカ」、「トマト」 なので、${野菜 - 果物}の結果は、「野菜」エントリに登録されていて、かつ、「果物」エントリには登録されていない文の集合、すなわち、 きゅうり, なす の2つの文から一つが等確率なランダムに選ばれます。実際に3万回実施してみた結果は下記の通り。「きゅうり」と「なす」がほぼ50%ずつの確率で選ばれます。
積集合演算'&'†積集合演算'&'では、演算子'&'の左辺のエントリに登録されている文の集合と右辺のエントリに登録されている文の集合の両方に含まれる文の集合からランダムに一つの文が選ばれます。 左辺=「野菜」エントリに登録されている「きゅうり」、「なす」、「スイカ」、「トマト」 右辺=「果物」エントリに登録されている「りんご」、「みかん」、「なし」、「スイカ」、「トマト」 なので、${野菜 & 果物}の結果は、「野菜」エントリと「果物」エントリの両方に含まれる文の集合、すなわち、 スイカ、トマト の2つの文から一つが等確率なランダムに選ばれます。実際に3万回実施してみた結果は下記の通り。「スイカ」と「トマト」がほぼ50%ずつの確率で選ばれます。
複数のエントリ集合演算子からなる式†エントリ集合演算の演算子の左辺や右辺にはエントリ名だけでなく、エントリ集合演算の式を記述することができます。たとえば、 野菜: きゅうり, なす, スイカ, トマト 果物: りんご, みかん, なし, スイカ, トマト ナス属: なす, トマト というエントリが存在する場合、${野菜 - 果物 & ナス属}というようなエントリ集合演算の式を記述することができます。 1.「果物 & ナス属」を実施する。†エントリ集合演算子"&"の左辺と右辺に登録されている文はそれぞれ以下の通り。 左辺=「果物」エントリに登録されている「りんご」、「みかん」、「なし」、「スイカ」、「トマト」 右辺=「ナス属」エントリに登録されている「なす」、「トマト」 したがって、このエントリ集合演算の結果できる文の集合は左辺と右辺の両方の文の集合に含まれている トマト になります。 2. 「野菜 - 「果物 & ナス属」の結果」を実施する。†次に、「野菜」エントリに登録されている文の集合と「果物 & ナス属」の結果の文の集合の差集合演算"-"を実施します。 左辺=「野菜」エントリに登録されている「きゅうり」、「なす」、「スイカ」、「トマト」 右辺=「果物 & ナス属」のエントリ集合演算結果である「トマト」 したがって、このエントリ集合演算の結果できる集合は、左辺の文の集合の中で右辺の文の集合に含まれていない きゅうり、なす、スイカ の集合になります。3万回実施してみた結果は以下の通り。
置換子を含むエントリに対するエントリ集合演算†エントリに登録されている文が置換子(${ほげ}などのエントリ呼び出しのこと)を含む場合には以下の規則が適用されます。
というわけで、たとえば、 うにゅう族: うにゅう, ${うにゅう以外}, ${カラー}うにゅう カラー: 黒, どどめ色, レインボー, 白 うにゅう以外: ただきち, うにゃん というエントリが存在していて、これがエントリ集合演算の左辺や右辺に出てくる場合、「${うにゅう以外}」はエントリが展開されて「ただきち」、「うにゃん」という2つの文として扱われ、「${カラー}うにゅう」は「${カラー}うにゅう」として解釈され、結果、 うにゅう, ただきち, うにゃん, ${カラー}うにゅう という文の集合として扱われます。 文の出現確率に関する事象†うにゅう族: うにゅう, ${うにゅう以外}, ${カラー}うにゅう カラー: 黒, どどめ色, レインボー, 白 うにゅう以外: ただきち, うにゃん さくら側: さくら, 双葉, エミリ というエントリ群が存在したとき、${さくら側 + うにゅう族}というエントリ集合演算を実施した場合、その実施結果として、 うにゅう, ただきち, うにゃん, ${カラー}うにゅう, さくら, 双葉, エミリ という7つの文の集合となります。
というわけで、同じ置換子を含む文でも、ただ一つの置換子から成り立っている文かそうでないかによって扱われ方が異なるのです。 演算対象に関する事象†うにゅう族: うにゅう, ${うにゅう以外}, ${カラー}うにゅう カラー: 黒, どどめ色, レインボー, 白 うにゅう以外: ただきち, うにゃん 特別なうにゅう: 白うにゅう, 黒うにゅう というエントリ群が存在したとき、${うにゅう族 - 特別なうにゅう}というエントリ集合演算を実施した場合を考えます。 左辺=うにゅう, ただきち, うにゃん, ${カラー}うにゅう 右辺=白うにゅう, 黒うにゅう これらの文の集合に対する差集合演算の結果は、 うにゅう, ただきち, うにゃん, ${カラー}うにゅう となります。この中で、「${カラー}うにゅう」という文は、その展開結果に「特別なうにゅう」エントリに含まれる「黒うにゅう」や「白うにゅう」といった文が含まれます。
とまあ、この通り。 同じことは、積集合演算でも言えるので、${うにゅう族 & 特別なうにゅう}とやっても、左辺と右辺の展開結果に共通するものはない、ということになり、${うにゅう族 & 特別なうにゅう}というエントリ集合演算はその結果として何も返してはきません。 ところで3万回とかってどうやって試したんだよ!†こうやりました。 テスト実施: $(呼出回数テスト テスト 30000) テスト: ${野菜 + 果物} 野菜: きゅうり, なす, スイカ, トマト 果物: りんご, みかん, なし, スイカ, トマト =kis function 呼出回数テスト $( .cleartree テスト結果; loop $@arg[2] $( .setstr @tmp ${$@arg[1]}; .inc テスト結果.${@tmp}; ); .clear @テスト結果表示; .listtree @テスト結果表示 テスト結果; foreach @i @テスト結果表示 $( .echo ${@i}":"${${@i}}"回\n"; ); ); =end コメント† |