Skip to content

Latest commit

 

History

History

derived-relmap

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 

導出関係写像

導出関係写像は、ユーザが定義した関係写像です。 関係写像は、甲州計算機が提供している基底関係写像と ユーザが定義する導出関係写像に分けられます。 基底関係写像と導出関係写像は、通常は、より短く、 基底写像 (derived relmap) と 導出写像 (base relmap) とよばれます。 「導出」ということばは、既知の関係写像を組み合わせることで 導き出された写像という意味をもちます。

関係の分類として、基底関係と導出関係という似たことばがありますが、 異なる意味をもちますので、注意してください。

このノートでは、甲州計算機のバージョン 0.54 で実装される予定の スロットつき導出写像の使用例をとりあげます。 つぎの判断集合を例として、導出写像の使用例をみてみましょう。 この使用例の入出力リストは INOUT.md にあります。

|--  P  /a 1  /b 30
|--  P  /a 1  /b 40
|--  P  /a 2  /b 50

導出写像なし

まず、導出写像を使わず、基底写像の演算子 sourceadd のみを使って計算式を組み立てます。

|== Q : source P /a /b | add /c ( /a + /b )

この計算の結果は、つぎのような判断集合になります。

|-- Q  /c 31  /a 1  /b 30
|-- Q  /c 41  /a 1  /b 40
|-- Q  /c 52  /a 2  /b 50

スロットなし

つぎに、同じ計算を導出写像を使って書きなおしましょう。 関係写像 source P /a /bp という名前をつけ、 関係写像 add /c ( /a + /b )a という名前をつけます。 この ap が導出写像です。 計算式と、出力される判断集合は、つぎのようになります。

|== R : p | a

p : source P /a /b
a : add /c ( /a + /b )
|-- R  /c 31  /a 1  /b 30
|-- R  /c 41  /a 1  /b 40
|-- R  /c 52  /a 2  /b 50

名前スロット

上の関係写像 add /c ( /a + /b ) に 100 を足すという式を加えて、 add /c ( /a + /b + 100 ) と書いてみます。 ただし、この 100 の部分をパラメータ化して、 add /c ( /a + /b + @n ) とします。 導出写像のなかで @n のように書くと、 ここに外側から式が挿入されることを意味します。 導出写像の演算子を a -n 100 のようにして使うと、 -n の内容で @n が置き換えられます。 この @n のような式が挿入される場所をスロットとよびます。

|== S : p | b -n 100
|== T : p | b -n 100 + 100

b : add /c ( /a + /b + @n )

判断種 S では @n100 に置き換えられ、 判断種 T では @n100 + 100 に置き換えられるので、 結果として、/a + /b に 100 を足した判断か、 200 を足した判断になります。

|-- S  /c 131  /a 1  /b 30
|-- S  /c 141  /a 1  /b 40
|-- S  /c 152  /a 2  /b 50

|-- T  /c 231  /a 1  /b 30
|-- T  /c 241  /a 1  /b 40
|-- T  /c 252  /a 2  /b 50

位置スロット

スロットは、名前スロット (named slot) と 位置スロット (positional slot)、つまり、 名前つきオペランドのためのスロットと、 位置によるオペランドのためのスロットに分類できます。 名前つきオペランドは -n のように、 ハイフン - につづけて、名前 n を書き、 それに続く式がオペランドとなるものです。 これに対して、位置によるオペランドは、 rop 5 8 のように導出写像演算子 rop が使われたときに、 オペランドの並びによって、1 番目のオペランドが 5、 2 番目のオペランドが 8 のように扱う方法です。

名前によるオペランドに対しては、@n のような名前スロットを使いますが、 位置によるオペランドに対しては、@'1 のような位置スロットを使います。 位置スロットは、アットマーク @ と引用符 ' につづいて 位置をあらわす数値を書いて表現します。 名前スロットの例 add /c ( /a + /b + @n ) を 位置スロットを使った add /c ( /a + /b + @'1 ) に書き換えて計算してみます。

|== U : p | c 100
|== V : p | c ( 100 + 100 )

c : add /c ( /a + /b + @'1 )
|-- U  /c 131  /a 1  /b 30
|-- U  /c 141  /a 1  /b 40
|-- U  /c 152  /a 2  /b 50

|-- V  /c 231  /a 1  /b 30
|-- V  /c 241  /a 1  /b 40
|-- V  /c 252  /a 2  /b 50