バート・ジェイコブスとコラボレーター達は、現状のベイズ確率論で使われている概念・用語・記法とは異なる、完全に新しい概念・用語・記法を提案しています。悪しき風習やしがらみを断ち切って、理論をリフォーミュレートしたのです。
従来のやり方に慣れている方は、彼らのスタイルに強い違和感を持つかもしれません。しかし、白紙で考えれば、とても使いやすいものです。僕は、ジェイコブス・スタイルを若干アレンジして使っているのですが、ほんとに気持ちよくて、従来方式に戻る気にはなれません。
今日は、その内容の詳細までは解説しませんが、基本概念だけに絞って雰囲気を紹介します(それでもけっこうな長さになりました)。
内容:
ベイズ確率論を整理して再構成する
ベイズ確率論〈Bayesian probability theory〉は幾つかの起源を持ち、たくさんの応用分野を持ちます。関連する諸分野が多い理論にありがちな事として; 各分野の概念・用語・記法がもとの理論にシッチャカメッチャカになだれ込んで、もとの理論がグチャグチャに見えてしまう事があります。ベイズ確率論もそんな状況です。
そんな状況であっても、後方互換性(あるいは惰性)から、改善されないままに放置される場合がほとんどです。誰かが整理して再構成してみても、惰性の力が強く、新しい方式は受け入れられないことが多いでしょう。
バート・ジェイコブス〈Bart Jacobs〉*1達は、ベイズ確率論に対して「整理して再構成」を試みています。上に述べた事情から、広く受け入れられるのは難しいかも知れませんが、それが優れた方式であるなら、徐々にファンを増やしていくでしょう。そして、ジェイコブス・スタイルは、間違いなく優れた方式です。
ジェイコブス・スタイル -- チャンネル方式〈the channel perspective, the channel approach〉とも呼びます -- に関する論文はたくさんありますが、ひとつだけ挙げると:
- Title: The Logical Essentials of Bayesian Reasoning (3 Apr 2018 (v1), 27 Apr 2018 (v2))
- Author: Bart Jacobs, Fabio Zanasi
- Pages: 29p
- URL: https://arxiv.org/abs/1804.01193
必要に応じて、この論文の"References"から他の論文を辿ればいいでしょう。論文が、書籍のひとつの章のように書かれているので、いずれまとまって本になるのかも知れません*2。
状態変換子と述語変換子
ジェイコブス達が提案している概念・用語・記法は、ベイズ確率論としては斬新なものですが、下敷きにしている既存理論はあります。プログラム意味論、量子論、論理(のモデル論)などです。
特に、プログラム意味論*3における「プログラムに対する双対的な2つの解釈」がジェイコブス・スタイルのバックボーンになっています。
- プログラムは、状態変換子〈state transformer〉である。
- プログラムは、述語変換子〈predicate transformer〉である。
XとYが集合だとして、プログラムの実行が写像 f:X→Y で表されるとします(X = Y のことが多いです)。X, Yの要素を状態〈state〉と呼ぶと、写像(プログラムの実行)fは、事前の状態〈pre-state〉xを事後の状態〈post-state〉f(x)に変換します。よって、プログラムは状態変換子です。
B = {0, 1} を二値ブール値の集合とします(0がfalseで、1がtrue)。述語〈predicate〉とは、B値の関数*4のことで、何らかの条件〈condition〉を表します。写像(プログラムの実行)fは、Y上の述語〈post-condition | 事後条件〉をX上の述語〈pre-condition | 事前条件〉に引き戻す働きを持ちます。この見方をすれば、プログラムは述語変換子です。
集合X上の述語(B値関数)の全体からなる集合を Pred(X) = Map(X, B) = BX とします。写像の結合〈合成〉の図式順記号は';'〈セミコロン〉を使います。この約束のもとで:
- f:X→Y による変換: 状態 x∈X 状態 f(x)∈Y
- f*:Pred(Y)→Pred(X) による変換: 述語 (q:Y→B) 述語 (f*(q) = f;q : X→B)
記号のフレーバーを揃えるために、State(X) := X, f* := f と置きます。すると:
- 状態変換子 f*:State(X)→State(Y)
- 述語変換子 f*:Pred(Y)→Pred(X)
状態変換子 f* と述語変換子 f* は逆方向であることに注意してください。
プログラム意味論の経験から得られた強いポリシーは:
- 状態変換子と述語変換子の2つを常に一緒に考えよ。
です。現状のベイズ確率論はこのポリシーに従っていません。そこで、「このポリシーに沿って整理・再構成すべし」というミッションが生まれます*5。
確率的状態
話を簡単にするために、ここから先では、X, Yなどの集合は有限集合だとします。(無限集合を扱うには、測度論の難しい議論が必要になります。)
前節で、State(X) = X 、つまりX上の状態とはXそのものだと言いました。これを変更します。Xは有限集合ですが、これは離散有限な“位置”を表すとします。例えば、X = {1, 2, 3, 4} ならば、4つの位置があります。
ここで物理的な発想をして、とある粒子がX上にいるとします。粒子がいる位置(1, 2, 3, 4 のどれか)が粒子の状態だとすれば、Xは粒子の状態の集合ともいえます。粒子がどの位置にいるかを特定はできなくて、存在する位置の確率分布だけが与えられているとします。例えば:
- 位置1にいる確率 = 1/4
- 位置2にいる確率 = 1/2
- 位置3にいる確率 = 1/4
- 位置4にいる確率 = 0
この確率分布は、粒子の確率的状態〈probabilistic state〉だといえます。別な解釈として、総質量が1になる物質(離散有限だから質点系)がX上にあり、その物質の質量分布が確率的状態だと思ってもかまいません。
確率的状態を書き表すために、次の記法を使います。
今の例だと X = {1, 2, 3, 4} なので、
先の例の確率的状態は次のようになります。
確率的状態は、Xの要素の形式的線形結合〈formal linear combination〉ですが、確率を表すので、次の制限が付きます。
- すべての x∈X に対して、αx ≧ 0
- (係数をすべて足したら 1)
この制限を満たす線形結合を凸結合〈convex combination〉と呼びます。この言葉を使うと:
- X上の確率的状態は、Xの要素の凸結合である。
ここから先では、単に「X上の状態」と言ったら、それは確率的状態を意味します。“X上の状態=確率的状態”全体の集合を State(X) と書きます。前節とは、State(X)の意味が変わっています。
- State(X) = (Xの要素の凸結合の集合)
State(X) の幾つかの要素に対してその凸結合を計算できるので、State(X)は凸結合演算を備えた集合になります。このような構造を凸空間〈convex space〉、または凸代数〈convex algebra〉と呼びます。凸空間に関しては「二点しかない離散空間に長さ1の線分を描けるか?」に書いてあります。
a∈X に対して、 は状態です。この形の状態を一点状態〈one-point state〉と呼びます。前節の状態は一点状態のことでした。a∈X に対して一点状態 ∈State(X) を対応させることにより、X⊆State(X) とみなすことができます。State(X)の部分集合とみなしたXは、凸結合によりState(X)を生成します。ベクトル空間の基底と同じ意味で、XはState(X)の基底〈basis〉(凸独立な生成系)になります。
ジェイコブス達の記法では、 ではなくて、 と、ディラックのブラケット記法(のケット)を使っています。物理の人にはお馴染みでしょう。しかし、初めて見る人には奇異に映ることと、ケットは使ってもブラはほとんど使わないので、Xの要素を山形括弧で囲むことにしました。
[/補足]
確率的状態変換子とチャンネル
2つの有限集合 X, Y に対して、State(X) から State(Y) への写像が状態変換子でした。「状態」は確率的状態の意味です。State(X), State(Y) は凸空間だったので、凸空間の構造を保つ写像だけを考えます。正確に言えば:
いちいち「確率的」という形容詞を付けませんが、常に確率的状況で考えます。状態の全体は凸空間の構造を持ち、状態変換子は凸空間のあいだの準同型写像です。凸空間のあいだの準同型写像を、短く凸写像〈convex map〉とも呼びます。
状態 | 凸構造 |
---|---|
状態空間 | 凸空間 |
状態点=確率分布 | 点=Xの要素の凸結合 |
状態変換子 | 凸写像 |
一点状態 | 基底の要素 |
状態空間(凸空間)のあいだの状態変換子(凸写像)は、ベクトル空間のあいだの線形写像と同じように考えることができます。線形写像が、基底での値で完全に決まってしまうのと同様に、状態変換子も基底での値で完全に決まります。そして、State(X)の部分集合とみなしたXはState(X)の基底でした。これらのことより、次が言えます。
凸空間のあいだの凸写像全体の集合を ConvexMap(V, W) のように書くことにすれば*6:
- ConvexMap(State(X), State(Y)) Map(X, State(Y))
同型の右辺に出てきた Map(X, State(Y)) は、集合Xから集合State(Y)への勝手な(何の制限もない)写像の集合です。Map(X, State(Y)) の要素、つまり、集合Xから集合State(Y)への写像を、XからYへのチャンネル〈channel〉と呼びます。チャンネルは通常の写像とは区別して、c:X→* Y のように書きます。'→*' がチャンネル用の矢印記号です。
- (チャンネル X→* Y) ←(同じ)→ (写像 X→State(Y))
XからYへのチャンネルの全体を Chan(X, Y) と書くと、定義から:
- Chan(X, Y) = Map(X, State(Y))
ひとつ前の同型から:
- Chan(X, Y) ConvexMap(State(X), State(Y))
なので、チャンネルと状態変換子(凸写像)は事実上同じものです。が、ここでは、チャンネルをより基本的なものだと考えて、状態変換子はチャンネルから引き起こされるとします。チャンネルcから引き起こされた状態変換子を c*:State(X)→State(Y) と書きます。
- (チャンネル c:X→* Y) ←(対応)→ (写像 c*:State(X)→State(Y))
チャンネルについてもう少し
ジェイコブス達の発想・方法は、the channel perspective / the channel approach と呼ばれるくらいなので、チャンネルはジェイコブス・スタイルの中核的な概念です。チャンネルの導入により、驚嘆すべき単純さが実現されます。ただし、あまりにも単純だとかえって分かりにくい*7ので、ほどよい複雑さをあえて残すような定式化にはなっています。
チャンネルと同じ概念は既に多くの人々が様々な呼び名で扱っています。「分布から拡散へ: ミシェル・ジリィを巡って // ローヴェアとジリィの定式化」において、同じ概念に付けられた17個の名前を列挙しています。僕はさらに、「拡散」(18個目)という呼び名を追加しています。そして、ジェイコブスは「チャンネル」(19個目)と呼んでいるわけです。([追記]ゴルブツォフを追加。ゴルブツォフ〈Peter Golubtsov〉については「マルコフ圏 A First Look -- 圏論的確率論の最良の定式化」を参照。ゴルブツォフを入れると20個の名前。[/追記])
人物 | 同じ概念を何と呼ぶか |
---|---|
ローヴェア〈Lawvere〉 | probabilistic mapping |
ジリィ〈Giry〉 | transition probability |
スターツ〈Sturtz〉 | conditional probability |
パナンガデン〈Panangaden〉 | probabilistic relation / Markov kernel |
ドバーカット〈Doberkat〉 | stochastic relation |
ドールクゥイスト〈Dahlqvist〉 | kernel |
ジェイコブス〈Jacobs〉 | channel |
ゴルブツォフ〈Golubtsov〉 | information transformer |
ジェイコブスが別な名前を付けたのは、手垢の付いてない言葉が欲しかったのかも知れません。チャンネルは、写像に似てますが、通常の写像が入力に対して出力を決定性〈deterministic〉に出力するのに対して、確率的〈probabilistic | stochastic〉に出力を吐き出します。実際ローヴェアは、チャンネルを「確率写像」と呼んでいます。
チャンネルは、もともとは情報通信の「通信路」の意味ですが、以下のような対応から確率写像と同じ意味で使っているのです。
通信路 | 写像 |
---|---|
aを通信路cに送り出す | aを写像fに入力する |
c(a)を通信路cから受け取る | f(a)が写像fから出力される |
cにノイズが乗る | fは確率的である |
ノイズがない(通信エラーが起きない)通信路が、決定性の写像に対応します。決定性の写像に対応するチャンネルを決定性チャンネル〈deterministic channel〉と呼びます。
写像の出力が確率的に揺らいでしまうような現象は世の中にいくらでもあります。いくらでもあるからこそ、色々な人々が色々な呼び名で呼んでいるのです。呼び名が問題なのではなくて、そのような現象とその数学的なモデルが問題なのです。ジェイコブスは(理由はハッキリは分かりませんが)たまたま「チャンネル」という呼び名を採用しているだけです。
状態とチャンネルの実例
ここらで、状態とチャンネルの実例を出します。"The Logical Essentials of Bayesian Reasoning" Bart Jacobs and Fabio Zanasi からの例です。
血圧となんらかの病気〈disease〉のあいだに確率的(あるいは統計的)関係があるとします。それを次の表で表します。血圧は、L (low), M (medium), H (high) の3つに分類し、d+ は「病気である」こと、d- は「病気でない」ことを示します。
L | M | H | |
d+ | 5% | 10% | 15% |
d- | 95% | 90% | 85% |
これは血圧ごとの、“病気になりやすさ”を表しているので s (sickness) と呼びます。sは、{L, M, H} →* {d+, d-} というチャンネルです。さらに、B = {L, M, H}、D = {d+, d-} と置けば s:B→* D です。
チャンネルsの表現として、集合Bの要素(血圧)ごとに、集合D上の状態を割り当てることにします。
- s(L) = 0.05<d+> + 0.95<d->
- s(M) = 0.1<d+> + 0.9<d->
- s(H) = 0.15<d+> + 0.85<d->
集合B上を走る変数をb、集合D上を走る変数をdとすると、次のように書けます。
のbを L, M, D と動かし、dを d+, d- を動かした全体は、マルコフ行列(成分を縦に足すと1になる行列)として簡潔に表現できます。
さて、とある会社で健康診断をしたとしましょう。社員の血圧の分布が次のようだったとします。
血圧 | 比率 |
---|---|
L | 20% |
M | 50% |
H | 30% |
これは、社員たちの血圧状態です。この状態に、病気の(確率的)傾向性を示すチャンネルsを作用させると、病気状態が出てきます。実際の計算はチャンネルの行列と状態の縦ベクトルの掛け算で済みます。
この会社の社員たちの病気状態は:
一般に、集合B上の状態(血圧状態)βと、集合D上の状態(病気状態)をδとすると*8、次のように書けます。
βに、チャンネル s:B→* D(血圧ごとの、病気になりやすさ)を作用させたものがδだとするならば、次が成立します。
これを、βがsによって前送り(sと同じ方向に移動)されてδになったと考えて、次のように書きます。
- β>>s = δ
演算子記号'>>'は、左から右に移動する“感じ”を表します。チャンネルsから引き起こされた状態変換子は s*:State(B)→State(D) ですが、前送りと状態変換は同じことなので:
- β>>s = s*(β)
割と最近になって気付いたことですが、テクニカルタームの自然言語的(国語辞書的)意味に拘る人が少なからずいるようです。「血圧と病気に関する統計的資料を、チャンネル(通信路)と呼ぶのは奇妙過ぎる」とかです。こういうツッコミやコダワリはまったく不毛でナンセンスなので、やめましょうね。
[/補足]
ファジー述語
決定性の状況だと、集合X上の述語とは、X→{0, 1} という写像です。非決定性〈non-deterministic〉、あるいは不確実性〈under uncertainty〉の状況では、中間の真偽値を認めたほうがいいでしょう。{0, 1} ではなくて、閉区間 [0, 1] を真偽値の集合にとります。X→[0, 1] という写像をファジー述語〈fazzy predicate〉と呼びます。ここから先では、単に述語〈predicate〉と言えばファジー述語のことだとして、値が {0, 1} である述語(通常の意味の述語)はシャープ述語〈sharp predicate〉と呼びます。
ジェイコブス・スタイル〈チャンネル方式〉は、プログラム意味論のポリシーに従うので、状態/状態変換子と共に述語/述語変換子を考えます。常にペアで扱います。これは、ジェイコブス・スタイルに特徴的なことで、従来のベイズ確率論はこの点に注意を払っていません。
従来の方式が述語を無視してきたと言うよりは、述語と状態を混同していたきらいがあります。述語を使うべきところで、(誤って)状態で考えていたり。ジェイコブスは、「状態と述語はまったくの別物だ、混同してはいけない」とくどいくらいに強調しています。この注意とメッセージは、僕にとって衝撃でした。「ウギャーー!」と叫び声を(心の中で)あげてしまいました。まさに僕が誤解と混同をしていたからです。
p:X→{0, 1} がシャープ述語とします。そのとき、{x∈X | p(x)} としてXの部分集合(pの外延)が決まります。逆に、AがXの部分集合のとき、λx∈X.(if (x∈A) then 1 else 0) というシャープ述語(Aの内包)が決まります。このシャープ述語は、部分集合Aの指示関数〈indicator function | characteristic function | 特性関数〉と呼び、χA('χ'はギリシャ文字カイ)と書くことが多いですが、ここでは [∈A] と略記します。
- [∈A](x) = (if (x∈A) then 1 else 0)
{x∈X | p(x)} も {|p} と短く書くことにします。すると:
- [∈{|p}] = p
- {|[∈A]} = A
となり、シャープ述語 ←→ 部分集合 の1:1対応が得られます。この対応のもとで、シャープ述語と部分集合は同一視してもかまいません。
シャープとは限らない述語に対しても、その外延としてファジー部分集合を考えることができます。ただし、ファジー部分集合という概念を新たに導入するのはなくて、(シャープとは限らない)述語の別名として「ファジー部分集合」という言葉の使用を認めるだけです。
状況 | 述語(内包) | 外延 |
---|---|---|
決定性 | シャープ述語 | 部分集合 |
一般 | 述語(ファジー) | ファジー部分集合(言葉だけ) |
確率論では、Xの部分集合を事象〈event〉と呼ぶので、ファジー部分集合はファジー事象だともいえます。ここらへんは単に言い回しだけの問題なので、まー、どうでもいいけど。
さて、区間 [0, 1] は実数Rの部分集合なので、色々な演算を持ちます。
- 足し算: a + b (部分的にしか定義できない)
- 掛け算: ab
- 大きい方: max(a, b) (正確には小さくないほう)
- 小さい方: min(a, b) (正確には大きくないほう)
- 1との差: 1 - a
- 逆数: a-1 (0では定義できない)
これらの演算の一部は論理演算とみなせるので、別な記号も割り当てます。
演算 | 論理的演算記号 |
---|---|
掛け算 | & |
大きい方 | ∨ |
小さい方 | ∧ |
1との差 | ¬ |
連言〈論理AND〉が二種類ありますが、どちらも使います。足し算を選言〈論理OR〉のようにみなすこともあります。逆数は&演算の逆元を与えます。
閉区間 [0, 1] が豊富な演算を持つので、述語の集合 Pred(X) := Map(X, [0, 1]) = [0, 1]X も、点ごとの演算を定義すれば同じだけの演算を持ちます。点ごとの順序により順序構造も入ります。
- p, q∈Pred(X) に対して、p ≦ q :⇔ ∀x∈X.(p(x) ≦ p(x))
状態の集合State(X)と述語の集合Pred(X)は、定義が違うので別物なのは当たり前ですが、持っている代数構造がまったく違います。Pred(X)は今述べたような演算と順序により、論理の代数とみなせますが、State(X)で許される演算は凸結合だけです。
台集合Xが有限集合やRnの場合は、State(X)とPred(X)を混同しがちですが、混同すると、僕がそうであったように、トンチンカンでワケワカラナイことになります。
ベイズ論理/ベイズ計算に向けて
以上で、ジェイコブス・スタイルの最も基本的な概念である「状態」「述語」「チャンネル」について一通りは説明しました。従来の用語法との対応をまとめます。
ジェイコブス達 | 従来方式 |
---|---|
状態 | 確率分布 |
述語 | 事象の一般化 |
シャープ述語 | 事象 |
チャンネル | 条件付き確率の利用法のひとつ |
決定性チャンネル | 確率変数 |
状態変換子 | 条件付き確率と確率分布の計算法のひとつ |
述語変換子 | 条件付き確率と事象の計算法の一般化 |
これは、言葉を趣味的に変更した、というものではありません。理論の定式化と構成を新しくしたので、それに伴いラベルも貼り替えた、ということです。
冒頭でも述べたように、ジェイコブス・スタイルは、プログラム意味論の理論構成を下敷きにしています。それ以外に、量子論/量子論理にも影響を受けています。量子系の量子状態が、チャンネルを通じて別な量子系の量子状態に転送されるというイメージもあるのでしょう。状態が確率的であるだけでなく、命題も“真偽の度合い”を持ち、ある状態においてある命題の“真偽の度合い”が評価される、という論理的枠組みが採用されています。
ベイズ推定〈Bayesian inference | Bayesian reasoning〉という言葉があるくらいなので、ベイズ確率論は、なんらかの演繹・推論を行う道具だという認識は世間一般にあるのでしょう。しかし、論理システムとしての体裁をなしていません。ジェイコブス達の試みは、ベイズ確率論に論理システムとしての形を与えて、いわばベイズ論理〈Bayesian logic〉を構築しようというものです。
ベイズ確率論の記法には、暗黙の了解事項が多く、曖昧であまり合理的ではない略記が採用されています。計算体系が整備されてないので、これを使って確率の計算を行うのは難儀です。計算ツールとしての機能性・効率性も芳しくない。機能性・効率性に優れたベイズ計算〈Bayesian calculus〉が欲しいですね。それもまたジェイコブス達の目標のひとつです。
ジェイコブス・スタイルでは、下の表のような演算子達を駆使した計算体系が備わっています。従来方式に比べてはるかに機能的・効率的です。(演算子は、図式順記法に変更しているので、オリジナルとは少し違う*9。)
記号 | 意味 |
---|---|
; | チャンネルの直列結合〈sequential composition〉 |
チャンネルの並列結合〈parallel composition〉 | |
>> | 状態の前送り〈pushout | post-composition | forward transform〉 |
<< | 述語の引き戻し〈pullback | pre-composition | backward transform〉 |
|= | 妥当性値〈validity〉 |
| | 条件付け〈conditioning〉 |
・ | スケーリング〈scaling〉 |
このなかで、'>>', '<<', '|=' はなくてもよく、';'だけで済みます。状態も述語も特殊なチャンネルとみなせるからです。しかし、あまりに単純化するとかえって分かりにくいので、場合ごとに別な記号を用意しています。
- '>>' は、状態とチャンネルの順次結合
- '<<' は、チャンネルと述語の順次結合
- '|=' は、状態と述語の順次結合
今回述べたように、X, Y などの台集合が有限なら、マルコフ行列/マルコフテンソル(「確率的推論・判断の計算法:マルコフ・テンソル絵算」を参照)で計算ができます。また、ジェイコブス・スタイルは、ストリング図と相性がよく、モノイド圏における絵図計算〈pictorial calculation〉の技法がそのまま使えます。
ジェイコブス達は言及してないようですが、ゴグエン/バーストル〈Joseph Goguen and Rod Burstall〉のインスティチューション〈institutions〉や、ローヴェア〈William Lawvere〉のハイパードクトリン〈hyperdoctrine〉との関連もありそうです。インスティチューション/ハイパードクトリンからの知見を、ベイズ論理/ベイズ計算に活かせるかも知れません。例えば、「順序集合のカン拡張と特徴述語論理」の手法で限量子を定義できそうな気がします。
ベイズ確率論の新しい風を感じたい人、従来の理論にモヤモヤを感じている人は、ジェイコブス・スタイル(「チャンネル理論」と呼ぶべきかな?)に目を向けてはどうでしょう。
*1:"Jacobs"を「ヤコブス」と書いていたのですが、「ジェイコブス」に変更します。
*2:[追記]"Structured Probabilitistic Reasoning" というタイトルの本になるようです。http://www.cs.ru.nl/B.Jacobs/PAPERS/ のBooksで最新情報を確認できます。[/追記]
*3:プログラム意味論全般ではなくて、ホーアやダイクストラの流儀です。
*5:ベイズ確率論が「なんで違った分野のポリシーに従う必要があるんだよ?」というツッコミは当然にあるでしょう。ベイズ確率論とプログラム意味論は、十分に抽象化したレベルで見ると強い類似性があります。その類似性からすると、プログラム意味論の基本原則がベイズ確率論で尊重されてないのは「どうもマズイだろう」という懸念があるのです。
*6:この同型は、“凸空間の自由生成関手と忘却関手の随伴性”を表す同型の特殊ケースです。
*7:今まで見たことのない単純さなので、多くの人は面食らってしまうでしょう。
*8:ギリシャ文字'δ'は、クロネッカーのデルタやディラックのデルタなどに使われますが、ここでは単に状態を表す変数です。
*9:具体的には、結合記号を図式順の';'に変えてあります。ジェイコブスの前送り f>>α は α>>f と逆順にして、f<<p はそのままです。これで、;, >>, <<, |= がすべて整合的に図式順になります。