Skip to content

Latest commit

 

History

History

equivalent-for-both

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 

両結びの等価定義

関係写像 both R は、入力関係と写像 R の出力との両結びを計算します。 両結びは、SQL の用語でいうところの完全外部結合 (full outer join) のことです。 このノートでは、両結びと等価な計算を、 より基礎的な演算子を使って実行する方法を説明します。

このノートの内容は甲州計算機のバージョン 0.50 に対応します。 ここで説明している甲州スクリプトの実行結果は script ディレクトリにあります。

データ

両結びの計算をつぎのデータ DATA.k を使って例示します。 判断 P は項目 /a /b をもち、

p : source P /a /b

|-- P  /a 10  /b 40
|-- P  /a 10  /b 50
|-- P  /a 20  /b 50

判断 Q は項目 /b /c をもち、 ふたつの判断の共有項目は /b です。

q : source Q /b /c

|-- Q  /b 50  /c 80
|-- Q  /b 60  /c 90

両結び

両結びは、基本的には、ふたつの関係の交わりを計算しますが、 交わり不可能な組も計算結果に残すところが異なります。 この計算は、ふたつの判断 PQ を つぎの 3 つに分類することに対応します。

  1. P (/a /b) が成り立ち、Q (/b /c) も成り立つ。
  2. P (/a /b) は成り立つが、Q (/b /c) は成り立たない。
  3. Q (/b /c) は成り立つが、P (/a /b) は成り立たない。

Q (/b /c) は成り立たないというのは、 P (/a /b) で固定されたある /b に関していうと、 どのような /c をもっても Q が成り立たないということです。 もしどこかの /cQ が成立すれば、それは、1 番目に分類されます。

maybe

両結びを計算する素朴な方法は、pq の片結びを左右とも計算し、 その結果を join で結び合わせることです。 この方法は、maybe.k の計算式に対応します。

pq : p | maybe q
qp : q | maybe p

|== MAYBE : pq | join qp

この計算式でデータを組み合わせると、つぎの判断集合が出力されます。 P (/a 10 /b 40) に対して、 Q (/b 40 /c ?) となる /c はないため、 値がないことをあらわす () を内容にもちます。

|-- MAYBE  /a 10  /b 40  /c ()
|-- MAYBE  /a 10  /b 50  /c 80
|-- MAYBE  /a 20  /b 50  /c 80
|-- MAYBE  /a ()  /b 60  /c 90

maybe-liner

上の計算式から pggp の定義を除いて、 1 本の式に直すと、maybe-liner.k のように書けます。 これも同じ計算をします。

|== MAYBE-LINER : ( p | maybe q ) | join ( q | maybe p )

copy-maybe

maybe-liner.kp が 2 回か出現するので、 p が 1 回だけ出現するように書き換えます。 この copy-maybe.k も同じ計算をします。

|== COPY-MAYBE : p | copy i ( maybe q | join ( q | maybe i ))

少し技巧的ですが、同様にして、q も 1 回だけ出現するように書き換えると once.k のようになります。

both

これで pq を分離できたので、 copy i ( maybe q | join ( q | maybe i ))both q と書けるようになります。

|== BOTH : p | both q