フロー・ダイアグラムの束 − Dana Scottの論文紹介
2013年 作成 舟越 和己
ここでは、束と完備束がソフトウェアの世界でどのように構成されるかについての具体的イメージを把握するため、少し長くなるが1つの例としてフロー・ダイアグラムを取り上げる。この内容はDana Scottの下記の論文の概要紹介である;
Dana Scott: The lattice of flow diagrams(フロー・ダイアグラムの束) (1970)
1.フロー・ダイアグラムの表現
直感的に、フロー・ダイアグラムは非常にラフに描けば下の図1のようになる。
ここには、入力情報が流れる入口点と、出力が出ていく出口点がある。
このとき図の”ブラックボックス”の中はどうなるかという疑問がある。
・このボックスの中はこれ以上分解できない原子演算を表しているかもしれないし、他のダイアグラム
との合成であるかもしれない。
次に、このボックスの中のタイプを以降の図2から見ていく。
@最も単純な例は如何なるダイアグラムとの組合せもないものである。これは下の図2の”矢印”である。
このような矢印のみに流れる情報は全く変換されない; したがって、これを恒等関数(identity function)で表す。
A自明でない合成例の一つは下の図3に示されている。これは、積(product)と呼ばれ、この組合せに
おいて、最初のボックスの出力は2番目のボックスの入力を与えている。
Bダイアグラムにおいて、スイッチは下の図4のように表現される。
Cスイッチの各矢印にボックスが付けられ、それらのボックスの出力が一緒になるとき(下の図5)、これを(2つのボックスの)和(sum)と呼ぶ
以上の説明の中で、和と積はフローダイアグラムの基本的な合成演算である。すなわち、これらの組合せで大きなダイアグラムが作られる。
ところで、これまでループの話が出てきていないが、ループは後で登場することになる(この理由は後で明確になる。これは完備性と密接に関係している)。
ここで、フローダイアグラムを代数的に表現するために、いくつかの表記を説明する;
・スイッチはb0, b1, b2,・・・,
・ボックスはf0, f1, f2,・・・,
・ダイアグラムはd0, d1, d2,・・・
ここで、b: Boolean又はbinary、f: functions、d: diagramsを意味する。ボックスは情報上の関数を表すので"f"が使用される。ダイアグラムはスイッチ、ボックスを合成したものである。
また、恒等ダイアグラムは Iで表す。
これらの表記を使用してダイアグラムの和、積を表現すると次のようになる;
dとd'が2つのダイアグラムのとき、その積は
(d ; d')
で表す(図3参照)。この場合、表示の順序は図3のように「左−右」の順となる。
また、和は下記で表す(図5参照)。
(bj→d, d')
この表記ルールにより、図6のダイアグラムは下記で表される;
(b0→ (f0 ; (f1 ; (b1→ f3, f4))), (f2 ; (b2→ f4, f5)))
次の小節では、ダイアグラムの代わりに和や積の演算の適用を繰り返すことにより、fiとbjから生成される式について議論する。
2.フロー・ダイアグラムの束の構築
まず初めに、2つのダイアグラムd,d'間の半順序関係⊆を次のように定義する;
・d'がdの属性(注)を全て含むとき、d⊆ d'であるとする。
(注)dのエレメント及びd内の関係
また、2つのダイアグラムd,d'間に d⊆ d'の関係があるとき、dはd'を近似するという。あるいは、
dはd'の不完全な部分(incomplete parts)とも言う。
極端な場合として、全てのダイアグラムの近似となる最も粗いダイアグラムとして⊥(ボトム)がある。ダイアグラムでは、⊥(ボトム)はその内容が未定の”空”のボックスである。この”空”のボックスは図7に示すようにダイアグラムの一部として表現されることがある。図7の表現は下記のようになる;
(b0→ (f0 ;⊥), (f1 ; (b1→ f2, I )))
この小節の目的は、”原子”シンボルから出発しフロー・ダイアグラムを束の構造として組み立てていくことである。ここで、”原子”シンボル(フロー・ダイアグラムにおいてこれ以上分解できないシンボル)とは、
⊥, f0, f1,・・・・, fn,・・・, I,Τ
であり、これらを出発点にして、フロー・ダイアグラムの積と和
(d ; d')、(bj→d, d')
及び、
束論の(⊆,∪,∩)
を使用して全ての組合せを構成していくことである。これを以下、順を追って説明する。
(1)原子シンボルの束
束の最初の部分は、原子シンボル f0, f1,・・・・, fn,・・・及び Iに対応する。i≠jならばfiとfjは異なるので原子シンボル f0, f1,・・・・, fn,・・・は下の図8のように束の各要素として表現すればよい。
この束の図において半順序は上昇するラインにより表現されている;
図8 原子シンボルの束
この場合、より弱い(小さい)エレメントは下で、より強い(大きい)エレメントは上である。
(2)2つの束の和
データ・フローの束を構築する上でお互いに交わらないエレメントを持つ2つの束の和を考える。
すなわち、D, D'を半順序⊆,⊆'を持つ束とし、DとD'を一緒にして統合された束D+D'を作りたい。
これは、2つの半順序関係の”和(union)"により組立てられた2つの集合の和(union)に過ぎない。しかし、この和には最大元も最小元がないので束ではない。
そこで、Τ ,Τ'と⊥,⊥'を各々DとD'の最大元と最小元とするとき、各々の最大元と最小元は等しい(すなわち、Τ =Τ',⊥ =⊥')とすることによりD+D'は束となる。束の和を形成するこのプロセスは図13に描かれている。
(3)フロー・ダイアグラムの最初の束
原子シンボル f0, f1,・・・・, fn,・・・及び Iに対応するフロー・ダイアグラムの最初の束は、束の和を使用して
D0 = F + { I }
と表現される。Fのエレメントはf0, f1,・・・・, fn,・・・であるが、各エレメントfiを束{ I }と同型な束{ fi }と考えると、
F={ f0 }+{ f1 }+・・・+{ fn}・・・
と表現できる。従って、D0 = F + { I }のエレメントは、下記となる;
(4)ダイアグラムの積と和
DとD'はそのエレメントが”ダイアグラム”を表す束とする。ダイアグラムの積を考えるとき、積の半順序と呼ばれるD*D'上の半順序が下記のように定義される;
任意のd0, d1∈ Dとd'0, d'1∈ D'に対して、
(d0 ; d'0)⊆ (d1 ; d'1) ⇔ d0⊆ d1かつd'0⊆ d'1
ここで、積(d0 ; d'0)の表記に代わりに抽象的に順序付けられた組の表記として<d0 ; d'0>を使用する。したがって、DとD'の積は
D*D'={<d ; d'> | d∈ D, d'∈ D' }
となる。D*D'の最大と最小のエレメントは<Τ ;Τ'>と<⊥ ;⊥'>。
一方、ダイアグラムの和(bj→d, d')は下記の束のエレメントである;
B*D*D' = {<bj, d, d'> | bj∈B, d∈D, d'∈D' }
(5)積と和から作るフロー・ダイアグラムの束
次に、D0 = F + { I }からダイアグラムの積と和を使用して次の段階のダイアグラムD1を下記のように構成する;
D1= D0 + (D0* D0) + (B*D0*D0)
これのエレメントは下記のようになる;
明らかに、D1は非常に短いダイアグラムしかエレメントに含んでいない。より大きなダイアグラムを得るためには、式の合成を進めなければならない。
これはさらに複雑な束を下記の漸化式で構成していく;
Dn+1= D0 + (Dn* Dn) + (B*Dn*Dn)
このとき、{ Dn }は単調増加である。
上記のようにして構成されたダイアグラム{ Dn }の全体は、半順序関係(⊆)に関して束を構成する。このイメージを次に図示する。
この図は、ボトム(⊥)から出発して単純なダイアグラムの集合D0からD1、D2とフロー・ダイアグラムの束の階層が構築され複雑なフロー・ダイアグラムが出来ていくことを表現している。
各階層間のエレメントに半順序の関係(⊆)がある。これを見ると分かるように、D1のエレメントのネストの深さは1, D2のエレメントのネストの深さは2である。同様に、束Dnのエレメントのネストの深さは高々nとなる。
ここで、上位の階層のエレメントはすぐ下の階層のエレメントの積と和から生成される;(下記は積と和の例)
これらの考察の結果として、{ Dn }の和集合
∪Dn (n=0から∞)
を考えると、これは束であるが完備束ではない。この和集合のエレメントは2つのモード(積と和)により原子ダイアグラムから生成される有限(注)の全ての組合せである。
(注)∪Dnの任意の要素をdとすると、d∈Dn0となる有限のn0∈Nが存在する。
すなわち、∪Dn要素は有限の積と和の組合せである。
ここで、無限ループなどの有限でない処理はどのようにして構成すればよいか、という問題が生じる。
これに対しては、次のように有理数を完備化して実数が構成された手法のアナロジーで構成される。
有理数の世界:Q ⇔ 有限の積と和の組合せから構成されるダイアグラムの世界:∪Dn
↓(コーシー)完備化 ↓(束の)完備化
実数の世界:R ⇔ 無限ループなどの有限でない処理を含むダイアグラムの世界:D∞
∪Dnの完備化を行なう前に、準備として次に「有理数の完備化」を簡単に説明する。
3.有理数の完備化
たとえば、A={x | 0≦x, x2≦2}という集合を考える。これはすべての要素が、x≦2を満たすので有界(上界)である。しかし、有理数のなかでは、この上界は最小元を持たない。一方、これが実数の中でなら、上界は(2の平方根という)最小元を持ち、これが集合の上限となる。 この違いを完備(completeness)という。
きちんと定義するなら次のようになる。
(1)完備とは?
集合Aのすべての部分集合が、上に有界ならば上限を持ち、下に有界ならば下限をもつとき、集合Aは完備あるいは順序完備(注)であるという。 (注)条件を緩めて半順序でもよい。
(例)実数の閉区間 [0, 1]は≦の順序の下で完備であるが、半開区間 [0, 1)は完備ではない。
理由:1に収束する[0, 1)内の任意の無限列が上限を持たないため。
(2)完備化とは?
・完備でない集合を完備な集合にすることを完備化という。
(3)完備化の方法
実は完備化の方法は一つではない。以下ではその一つであるコーシー完備化を説明するが、デデキントの切断による完備化などほかにも完備化の方法はある。
(注)Augustin Louis Cauchy(1789年- 1857年)は、フランスの数学者。他に天文学、光学、流体力学などへの貢献も多い。
(4)コーシー列
収束する数列は、どんどん差が縮まっていく性質を持っている。 これはε-δ論法で厳密に書くことができるが、ここではそういう数列をコーシー列ということだけ覚えておく。
有理数から無理数へつなげていくためには、何か無限に関わる操作をしなければならない。なぜならば、有限回の操作を行ったのでは、それはまた有理数になってしまうからである。
そこで、有理数に対する操作の繰り返しとして数列を考える。
例えば、下記の数列{an}を考える;
a1=2, an+1=(an2+2)/(2*an) ・・・(1)
これをいくつか計算してみると、
a2=(22+2)/(2*2)=6/4=3/2
a3=((3/2)2+2)/(2*(3/2))=17/12
a4=((17/12)2+2)/(2*(17/12)0=577/408
これは、2から始まって加減乗除だけで計算しているので、どの項も有理数のままである。 また、この数列は、どんどん差が縮まっていく性質を持っているのでコーシー列となる。
この数列は収束する値があるとすれば、その値αは
an+1= an=α
を満たすような数になる。この場合、上記(1)式はα=(α2+2)/(2*α)となり、α2=2からα=2の平方根(無理数)となる。
以上のように有理数の列があったとき、それがコーシー列になっていて極限をもっていたとしても、その極限がまた有理数の範囲に収まるとは限らない。つまり、完備ではない。
そこで、有理数のコーシー列の極限値を全て有理数に付け加えれば、その集合はコーシー完備になる。これが実数である。(注)
(注)同じ実数に収束するような異なる有理数列が存在するので、それらを1対1に対応させるために、
厳密にはコーシー列そのものに同値関係を導入し、それの商集合として実数を定義する。)
こうして、有理数から実数を作ることができる。一般にコーシー列がその集合の中で収束するように拡大することを「(コーシー)完備化」という。
フロー・ダイアグラムの束の完備化も上記と同様に、束の単調増大するエレメントのコーシー列に相当するものを束に付加することで行なう。
4.フロー・ダイアグラムの束の完備化
簡単な例でループのダイアグラムを考える;
下記の一次方程式を漸化式で解くと、
X=X/2 + 1 ・・・・@@
まず、@を漸化式で表現する;
Xn+1=Xn/2 + 1・・・AA
AをX0=0から出発して順次値を求めていくと、
X1=X0/2+1=1 X2=X1/2+1=1/2+1=3/2=1.5
X3=X2/2+1=3/4+1=7/4=1.75 X4=X3/2+1=7/8+1=15/8=1.875
・・・→ X∞=2
これをフロー・ダイアグラムで表現すると、下記のようなループ処理になる。
このループ処理を展開して表現すると、下記のようになる。
上記から、単調増大して収束するダイアグラムのシーケンス{dn}が得られる;
d0⊆d1⊆d2⊆・・・⊆dn⊆・・・→ d
したがって上記ループ処理は {dn}の極限dとなる。
ここまでの議論から、
・有理数のコーシー列の極限としての実数と、
・単調増大する積と和のダイアグラム列の極限としての無限ループ処理
には完備性という視点から類似性があることが分かった。
以上から、積と和から構成されるダイアグラムの束∪Dnに対して、∪Dnに属するダイアグラムの収束列{dn}の極限を全て追加することにより、∪Dnの完備化D∞が実現できる。
これは、有理数のコーシー列から実数を定義することと同様な手法である。
次にフロー・ダイアグラムの完備化について見ていく。
5.近似写像ψ
フロー・ダイアグラムの束において、単調増大するエレメントのコーシー列に相当するものを作るために、「ダイアグラムの近似列と近似写像ψ」を考える。
・束Dnのエレメントは高々nの”深さ”のダイアグラムである。
より正確には、それらは高々nレベルの2つのモード(積と和)の合成のネストにより生成することから
得られる。これはDn+1のエレメントがDnのエレメントにより近似されるということを示唆している。
・今、D0とD1を考える。 D1の要素をdとするとき、D0⊆ D1なのでd∈D0またはd∈(D1- D0)。
したがって、
(i) d∈D0ならば、これはD1の要素d自身なのでベスト近似となる:ψ0 (d) = d
(ii) d∈(D1 - D0)ならば、dはD0のエレメントでは合成できないので、dのD0での近似は
⊥しかない。
言い換えると、d∈D1に対してD0のエレメントによるdのベスト
近似ψ0 (d)を対応させる写像
ψ0 : D1→D0
を定義することができた; ここで、d∈D1に対して、
が成立する。
次にDn+2とDn+1を考え、
d∈Dn+2に対してDn+1のエレメントによるdのベスト近似ψn+1(d)を対応させる写像
ψn+1: Dn+2→Dn+1
を定義したい。
Dn+2とDn+1については、下記が成り立つことを思い出して欲しい;
Dn+2= D0 + (Dn+1* Dn+1) + (B*Dn+1*Dn+1)
したがって、ψn+1とψnの間には次の関係が成立する(これは束の構成図からも自明);
この写像を図示すると下記のようになる;
写像ψn: Dn+1→Dnは容易に図示できる。図14に2つのダイアグラムが与えられている:
最初のダイアグラムはD3に属し、二番目のダイアグラムは最初のダイアグラムにψ2を適用した結果である。図14の下のダイアグラムには少し曖昧な部分がある(⊥の部分); この曖昧さはダイアグラムに対して式を選んだときに取り除かれる。
■参考に、Dn+1からDnへの近似写像ψnを有理数列で考えてみる;
a1=2, an+1=(an2+2)/(2*an) これをいくつか計算してみると、
a2=(22+2)/(2*2)=6/4=3/2 a3=((3/2)2+2)/2*(3/2)=17/12
a4=((17/12)2+2)/2*(17/12)=577/408 ・・・・
anに対し、写像ψn(an+1)=an が定義される。
(例)ψ1(a2)=a1⇔ψ1(3/2)=2 ψ2(a3)=a2⇔ψ2(17/12)=3/2
ψ3(a4)=a3⇔ψ3(577/408)=17/1
6.有向集合と極限
(1)有向集合
部分集合X⊆Dは、Xの全ての有限部分集合Xが(⊆に関して)Xに属する上限を持つとき、有向(directed)であると言われる。これを任意のペアx, y∈Xに適用すると、x∪y⊆zとなるz∈Xが存在しなければならないことを意味する。有向集合の明らかな例はω鎖(ω-Chain)である;
x0⊆ x1⊆・・・・⊆ xn⊆・・・
すなわち、単調増大する列である。
(2)有向集合の極限
有向集合の極限は、∪Xである。
ω鎖の場合、極限(結合)を下記で表す;
∪xn (n=0から∞)
7.フロー・ダイアグラムの完備化
以上の準備をして{ Dn }の和集合∪Dn(n=0から∞)を考える。
これは束であるが、∪Dnのエレメントから成る有向集合(注)の極限(コーシー列に相当)を考えることにより、この完備化D∞を求める。
(注)これはω鎖で考えて良い。
(A) D∞が ∪Dn(n=0から∞)の完備化であると仮定すると、「任意のd∈D∞に対してψn(dn+1)=dnを
満たす有向集合(注)d0⊆d1⊆d2・・dn⊆dn+1・・が存在し、d=∪dn(n=0から∞)となる。」
(注)これはω鎖で考えて良い。
(B)逆に、ψn(dn+1)=dnを満たす有向集合d0⊆d1⊆d2・・dn⊆dn+1・・ (dn∈Dn)が存在するならば、
d=∪dn(n=0から∞)はD∞のエレメントとなる。
したがって、dが∪Dnの完備化D∞のエレメントになることと、
ψn(dn+1)=dnを満たす有向集合(注) d0⊆d1⊆d2・・dn⊆dn+1・・ (dn∈Dn)が存在し、d=∪dn
(n=0から∞)となることは同値である。
■参考に、D∞からDnへの近似写像ψ∞nを実数と有理数の関係
で考えてみる;
a1=2, an+1=(an2+2)/(2*an) これをいくつか計算してみると、
a2=(22+2)/(2*2)=6/4=3/2 a3=((3/2)2+2)/2*(3/2)=17/12
a4=((17/12)2+2)/2*(17/12)=577/408
・・・・
a∞ = 2の平方根(実数)
a∞ に対し、写像
ψ∞n(a∞)=an
が定義される。すなわち、{ψ∞n(a∞)}という有理数から成るコーシー列が作られる;
ψ∞1(a∞)≦ψ∞2(a∞)≦・・・・ψ∞n(a∞)≦・・・・→ a∞ = 2の平方根(実数)
8.ループと他の無限ダイアグラム
(1)ループのダイアグラム例
図17は循環のフロー、いわゆるwhile-loopを持つフロー・ダイアグラムの最も良く知られた構成である。これはプログラミング言語 の非常に基本的な概念を表現している。直感的に、図17の表記は最も単純なものの一つである。一方、図18のような無限の分岐の繰り返しも循環の例である。
(2)ループのダイアグラムの関数表現
図17のループ処理は、情報が入力され(b0により)検査される。 ここで、もし検査により正ならば、情報は(f0により)変換され、ループによる再帰により再び検査に戻される。検査が正の間は再帰が続くことになる。やがて繰り返された変換の累積結果は負の検査結果を生じる。
以上のことは、いくつかのシンボルを使うと分かり易くなる。判断(分岐)に対してb0,変換に対してf0というシンボルを使用する。最初の判断と変換の後、ダイアグラムはそれ自身を繰返す。
この単純なパターンは下記のようなシンボルで容易に表現できる;
d = ( b0 → ( f0 ; d ), I )
言い換えると、負(negative)で判断(分岐)を脱出する。一方、もし正(positive)ならば、同じ手順でf0を合成する。したがって、ダイアグラムはそれ自身を部分として含む(再帰処理である)。
このダイアグラムdは実際にフロー・ダイアグラムの完備束D∞に存在するだろうか?これを確かめるために、下記の式により定義された関数Φ:D∞→D∞を考える:
Φ(x) = ( b0 → ( f0; x ), I )
関数Φはダイアグラムの単調増加関数である(注1)。(タルスキの不動点定理(注2)より)完備束D∞から完備束D∞への全ての連続関数は不動点を持つ。このケースでは、我々はもちろん最小の不動点dを要求する; d =Φ(d)
(注1)dn⊆dn+1とすると、(f0;dn)⊆(f0;dn+1)より、Φ(dn) =( b0→(f0;dn), I)⊆( b0→(f0;dn+1), I)
=Φ(dn+1)したがって、Φは単調増加関数である。
(注2)不動点定理 f : D→Dを完備束Dで定義されDに値を持つ単調関数とする。このときFは最小不動点p=f(p)を持ち、p=∩{x∈D : f(x)⊆x}となる。
9.まとめ
1.フロー・ダイアグラムはその積と和から束∪Dnを構成することが分かった。
2.近似写像ψにより束∪Dnの完備化D∞を構成することができた。
3.フロー・ダイアグラムの完備束D∞をベースにすることにより、(タルスキの不動点定理を適用することで)回帰プログラムの不動点の存在を示すことができた。すなわち、Scottの「フロー・ダイアグラムの束」は、プログラムの不動点意味論の土台を提示している。