関係写像 copy N R
は、写像に入力される関係を複製し、
関係写像 R
を実行します。
写像 R
のなかで N
を使うと、複製された関係を参照できます。
このノートでは、関係写像の入力を入れ子の関係として包み込む
包括演算子 down
と等価な計算を copy
を使って行う方法を説明します。
このノートの内容は甲州計算機のバージョン 0.50 に対応します。
ここで説明している甲州スクリプトの実行結果は
script
ディレクトリにあります。
|-- P /a 10 /b 40
|-- P /a 10 /b 50
|-- P /a 20 /b 60
この判断集合を項目 /a
/b
の関係として読み出し、
p : source P /a /b
演算子 down
でその関係全体を入れ子の関係とする関係をつくります。
|== DOWN-1 : p | down /r
この式から、つぎの出力が得られます。
|-- DOWN-1 /r {| /a : /b | 10 : 40 | 10 : 50 | 20 : 60 |}
このような入れ子の関係を down
を使わずにつくるには、
関係写像 p
を slice
に与えることで実現できます。
|== DOWN-2 : slice /r p
関係写像には、まず、無項万有関係 dee
が入力として与られるので、
この式は dee | slice /r p
と同じ意味になります。
無項万有関係は組をひとつだけもっているので、
そのひとつの組に項目 /r
として p
の出力が追加されます。
|-- DOWN-2 /r {| /a : /b | 10 : 40 | 10 : 50 | 20 : 60 |}
この DOWN-2
の計算式は、slice
の引数に p
が必要なため、
ほんとうの意味で down
と等価とはいえません。
slice /r p
の自由変数の p
を束縛変数に置き換えるには、
copy r ( ... slice /r r )
のようにすることです。
演算子 slice
は、入力の各組に対して、関係を追加するので、
p | copy ...
とすると 3 つの複製がつくられます。
|== DOWN-3 : p | copy r ( slice /r r )
|-- DOWN-3 /r {| /a : /b | 10 : 40 | 10 : 50 | 20 : 60 |} /a 10 /b 40
|-- DOWN-3 /r {| /a : /b | 10 : 40 | 10 : 50 | 20 : 60 |} /a 10 /b 50
|-- DOWN-3 /r {| /a : /b | 10 : 40 | 10 : 50 | 20 : 60 |} /a 20 /b 60
そのため、組をひとつだけもつ dee
を挟み、
その出力を slice /r r
へ流すことで、
down
と同等の計算になります。
|== DOWN-4 : p | copy r ( dee | slice /r r )
|-- DOWN-4 /r {| /a : /b | 10 : 40 | 10 : 50 | 20 : 60 |}
以上をまとめると、down /r
と同じ意味の関係写像は、
copy r ( dee | slice /r r )
になります。
甲州記法の copy
は UNIX のコマンド tee
に似ています。
UNIX のマニュアルでは、tee
の概要は duplicate standard input
(標準入力を複製する) と説明されることがありますが、
この説明にならえば、演算子 copy
は
duplicate relamp input (関係写像の入力を複製する) と説明できます。