導出関係写像は、ユーザが定義した関係写像です。 関係写像は、甲州計算機が提供している基底関係写像と ユーザが定義する導出関係写像に分けられます。 基底関係写像と導出関係写像は、通常は、より短く、 基底写像 (derived relmap) と 導出写像 (base relmap) とよばれます。 「導出」ということばは、既知の関係写像を組み合わせることで 導き出された写像という意味をもちます。
関係の分類として、基底関係と導出関係という似たことばがありますが、 異なる意味をもちますので、注意してください。
このノートでは、甲州計算機のバージョン 0.54 で実装される予定の スロットつき導出写像の使用例をとりあげます。 つぎの判断集合を例として、導出写像の使用例をみてみましょう。 この使用例の入出力リストは INOUT.md にあります。
|-- P /a 1 /b 30
|-- P /a 1 /b 40
|-- P /a 2 /b 50
まず、導出写像を使わず、基底写像の演算子 source
と
add
のみを使って計算式を組み立てます。
|== 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 /b
に p
という名前をつけ、
関係写像 add /c ( /a + /b )
に a
という名前をつけます。
この a
や p
が導出写像です。
計算式と、出力される判断集合は、つぎのようになります。
|== 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
では @n
が 100
に置き換えられ、
判断種 T
では @n
が 100 + 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