Skip to content

Latest commit

 

History

History

duplicate-keys

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 

キー項目の重複

関係には、キーとよばれる項目があります。 キーは、その関係の主語のようなもので、 関係のなかに、キー項目が同じで、キー以外の項目が異なる組は ないことになっています。 もし、キーが同じで、キー以外が異なる組があるときは、 「キーが重複している」ことになり、 データを解釈する上で矛盾が生じることになります。

たとえば、気象観測の結果をまとめている場面で、 ある日の最高気温が 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

これらを判断種 DUPKEY の判断集合として書き出します。

|== 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 にもとづきます.