このノートでいうところの「関係のうす切り」とは、 関係を各組ごとに切り離し、それらを個別に入れ子の関係で 包み込むことを意味します。たとえば、つぎのような判断集合
|-- P /a 10 /b 40
|-- P /a 10 /b 50
に対して、演算子 slice
を使って計算します。
この演算子は、関係の各組をバラして包み込んだ小さな関係に対して関係写像を適用し、
その関係写像が出力した関係を、入れ子の関係として、もとの組に追加します。
ここでは関係写像として、恒等写像 id
を使うので、
入力の関係が、そのまま出力されます。
|== SLICE -fore /a /b :
source P /a /b | slice /r id
そうすると、関係のうす切りが得られます。
|-- SLICE /a 10 /b 40 /r {| /a : /b | 10 : 40 |}
|-- SLICE /a 10 /b 50 /r {| /a : /b | 10 : 50 |}
このような関係のうす切りを応用すると、
演算子の group
を簡単に実装できます。
まず、group
の機能を確認しましょう。
この演算子は、入力関係で別の関係を分割した、
交わり部分関係を計算します。たとえば、
|== GROUP -fore /a /b :
p | group /g q
によって、計算した結果は、p
と q
の共有項目 /b
の内容 40
か 50
で分割した、つぎのような判断集合になります。
|-- GROUP /a 10 /b 40 /g {| /b : /c | 40 : 80 | 40 : 70 |}
|-- GROUP /a 10 /b 50 /g {| /b : /c | 50 : 90 |}
slice
でうす切りにした個々の関係に対して
meet q
した上で q
の項目に射影することで、
group
と同等の計算ができます。
|== GROUP2 -fore /a /b :
p | slice /r ( meet q | pick-term q )
この計算結果は、|-- GROUP
の場合とちょうど同じになります。
|-- GROUP2 /a 10 /b 40 /r {| /b : /c | 40 : 80 | 40 : 70 |}
|-- GROUP2 /a 10 /b 50 /r {| /b : /c | 50 : 90 |}