関係には、キーとよばれる項目があります。 キーは、その関係の主語のようなもので、 関係のなかに、キー項目が同じで、キー以外の項目が異なる組は ないことになっています。 もし、キーが同じで、キー以外が異なる組があるときは、 「キーが重複している」ことになり、 データを解釈する上で矛盾が生じることになります。
たとえば、気象観測の結果をまとめている場面で、 ある日の最高気温が 23 ℃ という情報があり、 同じ日の同じ場所の最高気温が 28 ℃ という情報もでてきたら、 どちらかが間違っていると思うでしょう。 これは、日付と観測地点がキー項目であることを、 わたしたちが、暗黙に、前提することで、 そのような判断が導かれているといえます。
コンピュータは、通常、常識をもっていないので、
そのような判断はできません。
自分で学習するコンピュータでなければ、
どれがキー項目かを指示する必要があります。
このノートでは、そのような重複するキーを求める
演算子 duplicate
をとりあげます。
まず、簡単のため、つぎのような人工的な判断集合を考えましょう。
/x
と /y
がキー項目であるとします。
|-- A /x 'X1 /y 'Y1 /text "aaa"
|-- A /x 'X1 /y 'Y2 /text "bbb"
|-- A /x 'X2 /y 'Y1 /text "ccc" ** キー項目の重複
|-- A /x 'X2 /y 'Y1 /text "ddd" ** キー項目の重複
|-- A /x 'X3 /y 'Y3 /text "eee"
|-- A /x 'X4 /y 'Y4 /text "fff" ** 判断の重複
|-- A /x 'X4 /y 'Y4 /text "fff" ** 判断の重複
まず、判断 A
を読み込み、それを duplicate
に通します。
duplicate
の引数にキーとなる項目を与えます。
この演算子は、与えられた項目をキーとみなしたときに、
キーが重複する組のみを通過させます。
a : source A /x /y /text
dup : a | duplicate /x /y
さらに、この dup
を項目 /x
/y
だけの関係にしましょう。
key : dup | pick /x /y
これらを判断種 DUP
と KEY
の判断集合として書き出します。
|== DUP : dup
|== KEY : key
これを dup.k
に保存し、甲州計算機で実行すると、つぎの出力が得られます。
** -*- koshu -*-
**
** INPUT
** dup.k
**
|-- DUP /x 'X2 /y 'Y1 /text 'ddd
|-- DUP /x 'X2 /y 'Y1 /text 'ccc
|-- KEY /x 'X2 /y 'Y1
**
** SUMMARY
** 2 judges on DUP
** 1 judge on KEY
** 3 judges in total
**
重複した判断
|-- A /x 'X4 /y 'Y4 /text "fff" ** 判断の重複
|-- A /x 'X4 /y 'Y4 /text "fff" ** 判断の重複
は、同じ情報が 2 度あらわれるだけなので、 データ解釈が矛盾することもなく、 単に、重複が取り除かれます。
一方、キー項目が重複している
|-- A /x 'X2 /y 'Y1 /text "ccc" ** キー項目の重複
|-- A /x 'X2 /y 'Y1 /text "ddd" ** キー項目の重複
は、データ解釈が矛盾します。
duplicate /x /y
によってキーの重複が判定され、
|-- DUP /x 'X2 /y 'Y1 /text 'ddd
|-- DUP /x 'X2 /y 'Y1 /text 'ccc
として出力されます。
重複したキーだけを確認したいときは、 つぎの判断集合が使えます。
|-- KEY /x 'X2 /y 'Y1
このノートの内容は,甲州計算機バーラ実装のバージョン 0.38 にもとづきます.