この記事の概要[]
私はp進大好きbot氏に定義の書き方を教えてもらうようにお願いし、親切にも1から10まで教えてもらえることができました。一方で今の巨大数界隈を見てみると、初心者を含め多くの方が定義の作成に困難を覚えているように思えます。
私が教えてあげたいところですが、とある理由で教えて欲しいとお願いしてきた人に教えるという受け身な方法を取らざるを得ません。それに、私は一度定義の書き方の教科書のようなものを作ろうとしていましたが、計画は頓挫してしまいました。なぜかって?同じように、人に教えよう、人の役に立つものを作ろうと尽力している人に対し、そのような行動を恩着せがましいと考える人や、そのような数学的なハウツーが巨大数研究においては有害なコンテンツであると考える人がいるために、実際に巨大数界隈の縮小や分断を引き起こしてしまった例が海外で発生したためです。
しかしながら、私が習得した技術を私の中にだけ留めておくのはもったいないと感じますし、初心者さんには誰に頼れば良いか分からない場合もあるかと思います。この記事がそのような思いで作られたことを頭の片隅に置いておいていただけると幸いです。よって、もしこの記事を読まれて何かお気づきの点がございましたら、フィードバックを頂けると助かります。
私もまだ勉強中の身ではありますが、ここで私が定義をどう書いているか、初心者にもわかりやすいようになるべく平易で分かりやすく、詳細に書き残していきたいと思います。私の定義の実力や流派を知りたい方のために、以下に現在の私の代表的な表記の定義のリンクを張っておきます。
上の定義を見て、「かっこいい!」とか、「難しそうだけどこういう風に書けるようになりたい!」と思われたなら、このページはあなたのために存在しています。逆に「こんな定義の書き方は巨大数で用いられるべきじゃない!」とか、「こんなのは巨大数の定義じゃない!」と思われたのなら、このページを閉じる方があなたの精神衛生のためになるでしょう。
さあ、お気持ち表明はこのくらいにして、早速定義を書いていきましょう!
このページでは、実際に定義作成を行いながら解説を行う方式で進行します。
お断り[]
この記事の読み手に初心者も想定しているとはいっても、この記事の主目標から離れすぎないためにそもそも巨大数論初学者だよという方には分からない単語や概念が多く登場するでしょう。定義を書くのが初心者という人向けではありますが、巨大数そのものも初心者という方には少し理解がしにくいかもしれません。そういう方のために解説が行われているページも存在するため、分からないときは検索してみたり、巨大数論者に聞いてみたりしましょう。ただし、人によって解説の性格が異なるため、注意した方が良いでしょう。数学的で厳密な解説を行う人もいれば、直感的で概略的な解説を行う人もいます。自分に合った解説を見つけるのが良いですが、数学的で厳密な解説がなされない場合には、しばしば数学的な間違いが含まれてることもあるため注意しましょう。(数学に慣れてない人にとっては、分かりやすさとのトレードオフと考えましょう。)
それと、このページでは「どうすれば良いか」「どうすれば定義が書けるか」という点に重点を置いて解説を行います。なぜそのようにして定義を書くかの、理由に関する部分の解説はあまり行いません。これは、そのような理由の解説はしばしば複雑で、理解するのが少し難しいからです。理由からしっかり学びたいという人のために解説が行われているページも存在するため、分からないときは検索してみたり、巨大数論者に聞いてみたりみましょう。
定義のエッセンス[]
アイデアを考える[]
表記を作りましょう。表記を作るためには、まず目標とする大きさを設定すると良いと思います。今回は解説ということもあるので、比較的簡単な表記を作りましょう。初心者にとっては\(\varepsilon_0\)でも大きいでしょうし、最前線の人たちと交流のある人には少し物足りないかもしれません。とはいっても一気に\(\textrm{BO}\)に飛んでも難しいでしょう。ただし、知っておいて欲しいのは\(\varepsilon_0\)の強さの表記でさえも、実は定義するのはそれほど簡単ではないということです。そこで、今回は間を取って\(\varepsilon_0\)のちょっと先の\(\zeta_0\)あたりを狙ってみましょうか。
目標が決まったら、基本方針を作ります。このステップから実際の表記を形成していきます。ここで考えたことがその表記の特徴を決定付けると言っても過言はないので、重要なステップであると言えます。最初に表記の種類を決めると、基本方針も決まりやすいです。表記の種類には、数列、配列、ネストなど様々あります。中には複数の種類を使って、それぞれの特徴の良いとこ取りする表記もあります。もちろんオリジナルの種類を考えるのも良いでしょう。今回はネスト系の表記にしましょう。\(\zeta_0\)の強さにしたいので、土台として\(()\)のネストで\(\varepsilon_0\)に到達するものを考えましょう。この表記は\(0\)と\(+\)と\(()\)を使って、\((( \ldots ((0)) \ldots ))\)で\(\varepsilon_0\)に到達する表記です。でも\(()\)だけっていうのも味気ないし、最近は\(\psi\)を用いた表記が流行っている(というか私が流行らせている)ので、\(\psi\)という文字を導入しましょう。どうせ\(\psi\)を使うなら、\(\psi_{\psi_0(0)}(0)\)な感じで\(\psi\)の添字も使っちゃいましょう。
大体固まってきましたね。一旦構想をまとめてみましょう。
- 文字として、\(0\)と\(+\)と\(\psi\)と\((\)と\()\)を使う。
- \(0\)が順序数の\(0\)に、\(\psi_0(0)\)が順序数の\(1\)に、\(\psi_0(0)+\psi_0(0)\)が順序数の\(2\)に、\(\psi_0(\psi_0(0))\)が順序数の\(\omega\)にそれぞれ対応して欲しい。
- \(\psi_0(\psi_0( \ldots \psi_0(\psi_0(0)) \ldots ))\)が\(\psi_{\psi_0(0)}(0)\)と圧縮され、これが順序数の\(\varepsilon_0\)と対応して欲しい。
- \(\psi_{\psi_{\psi_{\cdot_{\cdot_{\cdot}}}(0)}(0)}(0)\)が極限で、これが順序数の\(\zeta_0\)と対応して欲しい。
ここで、順序数への対応が分からない場合はその対応を無理に考える必要はありません。マイルストーンとなる形のときの大きさが大まかに想像できれば十分です。
基本方針が固まったら、いくつかの項に対して展開例を作り、構造の肉付けを行っていきます。このステップがその表記の実際の大きさを決定付けると言っても過言ではないため、十分に時間を割いて考察を行いましょう。肉付けが不十分の場合、目標とした大きさに到達できな場合があります。順序数への対応が不明な場合は、特になるべく多くの展開例を作っておいた方が良いでしょう。
- \(0 \to 0\)
- \(\psi_0(0) \to 0\)
- \(\psi_0(0)+\psi_0(0) \to 1\)
- \(\psi_0(\psi_0(0)) \to \psi_0(0)+\psi_0(0)+ \ldots +\psi_0(0)+\psi_0(0)\)
- \(\psi_0(\psi_0(0))+\psi_0(\psi_0(0)) \to \psi_0(\psi_0(0))+\psi_0(0)+\psi_0(0)+ \ldots +\psi_0(0)+\psi_0(0)\)
- \(\psi_0(\psi_0(0)+\psi_0(0)) \to \psi_0(\psi_0(0))+\psi_0(\psi_0(0))+ \ldots +\psi_0(\psi_0(0))+\psi_0(\psi_0(0))\)
- \(\psi_0(\psi_0(\psi_0(0))) \to \psi_0(\psi_0(0)+\psi_0(0)+ \ldots +\psi_0(0)+\psi_0(0))\)
- \(\psi_{\psi_0(0)}(0) \to \psi_0(\psi_0( \ldots \psi_0(\psi_0(0)) \ldots ))\)
- \(\psi_{\psi_0(0)}(\psi_0(0)) \to \psi_{\psi_0(0)}(0)+\psi_{\psi_0(0)}(0)+ \ldots +\psi_{\psi_0(0)}(0)+\psi_{\psi_0(0)}(0)\)
- \(\psi_{\psi_0(0)}(\psi_{\psi_0(0)}(0)) \to \psi_{\psi_0(0)}(\psi_0(\psi_0( \ldots \psi_0(\psi_0(0)) \ldots )))\)
- \(\psi_{\psi_0(0)+\psi_0(0)}(0) \to \psi_{\psi_0(0)}(\psi_{\psi_0(0)}( \ldots \psi_{\psi_0(0)}(\psi_{\psi_0(0)}(0)) \ldots ))\)
- \(\psi_{\psi_0(\psi_0(0))}(0) \to \psi_{\psi_0(0)+\psi_0(0)+ \ldots +\psi_0(0)+\psi_0(0)}(0)\)
- \(\psi_{\psi_{\psi_0(0)}(0)}(0) \to \psi_{\psi_0(\psi_0( \ldots \psi_0(\psi_0(0)) \ldots ))}(0)\)
ざっとこんなものでしょうか。人によって必要となる展開例の数は異なると思います。理想的には、想定している形の項(標準形)すべてに対して展開を与えられるくらい具体的な構想になっていれば良いです。大まかなところだけ用意して細かいところは定義任せにするのも良いですが、時々想定していない挙動が発生する場合もあります。この辺は人の好みですね。上記の私の考えと照らし合わせつつ、自分が良いと思うところまで展開例を書くと良いでしょう。
展開例を書けたら、それの一般化を行います。想定している展開が、それぞれどのケースのときに適用されていくのかを考えるわけですね。このステップは定義の作成に直接関わるため、できるだけすべての想定を枚挙しておくと定義作成が楽になります。一般化をどの程度厳密に行うかは好みですが、曖昧なほど定義に落とし込むのが難しくなり、厳密なほど実際の定義に近づくため定義を書くのが楽になります。
一般化のコツは、展開規則を考えるうえで仮想的な入力変数\(s\)を想定し、\(s\)に対する場合分けを行うことです。
- \(s = 0\)ならば、\(0\)を返す。
- \(s = a+b\)という形ならば、\(b\)での展開を\(b'\)と置く。\(a+b'\)を返す。
- \(s = \psi_a(b)\)という形だとする。
- \(b = 0\)とする。
- \(a = 0\)ならば、\(0\)を返す。
- \(a = \psi_0(0)\)または\(a = A+\psi_0(0)\)という形ならば、\(a\)を\(1\)減らして\(b\)にネストする。
- 上記のいずれの条件も満たさないならば、\(a\)での展開を考える。
- \(b = \psi_0(0)\)または\(b = B+\psi_0(0)\)という形ならば、\(b\)を\(1\)減らしたものを\(s'\)と置く。\(s'+s'+ \dots +s'+s'\)を返す。
- 上記のいずれの条件も満たさないならば、\(b\)での展開を考える。
- \(b = 0\)とする。
さあ、定義を書くために必要なものは揃いました!ここからは定義を書くステップに入っていきましょう!
何を表記とするかを明確にする[]
ネスト表記を定義する最も簡単な方法の一つは、表記を文字列として定め、展開規則を文字列の書き換えとして定義する方法でしょう。というわけで、まずは表記を文字列として定めてみましょう。
表記を文字列で定めるときのコツは、用いる文字をすべて列挙し、表記として許容される項の全体集合を定義することです。とりあえず、次の定義を見てみましょう。
\(0\)と\(+\)と\(\psi\)と\((\)と\()\)のみからなる文字列の集合\(T\)と\(PT\)を以下のように同時に再帰的に定める:
- \(0 \in T\)である。
- いかなる\((a,b) \in PT \times (T \setminus \{0\})\)に対しても、\(a+b \in T\)である。
- いかなる\((a,b) \in T^2\)に対しても、\(\psi_a(b) \in PT \cap T\)である。
用いる文字をすべて列挙し、表記として許容される項の全体集合を定義しているのがお分かりいただけるでしょうか?
「\(0\)と\(+\)と\(\psi\)と\((\)と\()\)のみからなる文字列」というところで用いる文字をすべて列挙し、用いる文字によって構成可能な文字列全体を指定しています。「文字列の集合\(T\)と\(PT\)」という部分では、先程指定した文字列の全体の集合から、実際に項として用いる文字列の集合を指定しています。「\(T\)と\(PT\)を以下のように同時に再帰的に定める:」という部分では、実際に項として用いる文字列の集合に\(T\)と\(PT\)という名前を与えて、再帰的、つまり繰り返しによって両方を同時に定義すると宣言しています。
まとめると、
- \(0\)と\(+\)と\(\psi\)と\((\)と\()\)のみからなる文字列全体の集合\(U\)が存在する。
- \(T\)と\(PT\)は\(U\)の部分集合として定義されている。
- \(T\)と\(PT\)は再帰的に定義されている。つまり、定義\(1\)、\(2\)、\(3\)を繰り返し適用することによって構成されている。
ここからは実際の定義を動かしてみましょう。まずはいくつかの用語と記号について解説します。
- \(a \in A\)
この文は、要素\(a\)は集合\(A\)に属する(\(\in\))と読みます。
- \((a,b) \in A \times B\)
この文は、要素\(a\)は集合\(A\)に属し、要素\(b\)は集合\(B\)に属すると読みます。\((a,b)\)を要素の組だとか、あるいは単に組と呼ぶことがあります。\((a,b,c,d) \in A \times B \times C \times D\)のように、いくらでも伸ばすことができます。\((a,b) \in A \times B\)において集合\(A\)と集合\(B\)が等しいとき、つまり\(A = B\)のとき、この文は
- \((a,b) \in A^2\)
とも書かれます。もちろん\((a,b) \in A \times A\)と書いても大丈夫です。各要素\(a,b,c,d\)が全部集合\(A\)に属するなら、\((a,b,c,d) \in A^4\)のようにも書けます。
- \(\{a,b,c, \ldots\}\)
この文は、集合を具体的な要素\(a,b,c, \ldots\)で書き下した表現です。他に\(\{\}\)を使った集合の表現としては、\(\{A \mid B\}\)があります。条件\(B\)を満たす、\(A\)を代表元とする要素の集合と読みます。例えば\(\{x \mid x \in \mathbb{N} \land x \lt 10\}\)は、\(10\)より小さい自然数\(x\)の集合となります。
- \(A \setminus B\)
この文は、集合\(A\)と集合\(B\)の差集合と読み、集合\(A\)に属する要素の内、集合\(B\)に属する要素を取り除いたものという意味です。つまり、集合同士の引き算というわけですね。
- \(A \cap B\)
この文は、集合\(A\)と集合\(B\)の積集合と読み、集合\(A\)と集合\(B\)の両方に属する要素のみからなる集合という意味です。つまり、集合\(A\)と集合\(B\)の共通部分の集合というわけですね。積集合に似た概念に和集合があり、\(A \cup B\)と書きます。これは、集合\(A\)と集合\(B\)のどちらかに属する要素のみからなる集合という意味です。つまり、\(A \cup B\)に属する要素は集合\(A\)に属するか、集合\(B\)に属するか、集合\(A\)と集合\(B\)の両方に属するかのいずれかを満たします。
- いかなるAに対しても、Bである。
この文は、どんなAに対してもBが成り立つということを意味します。
さて、改めて定義文を見てみましょう。
\(0\)と\(+\)と\(\psi\)と\((\)と\()\)のみからなる文字列の集合\(T\)と\(PT\)を以下のように同時に再帰的に定める:
- \(0 \in T\)である。
- いかなる\((a,b) \in PT \times (T \setminus \{0\})\)に対しても、\(a+b \in T\)である。
- いかなる\((a,b) \in T^2\)に対しても、\(\psi_a(b) \in PT \cap T\)である。
上の用語解説によって、実際に計算を行えるようになったのではないでしょうか。というわけで、実際に計算してみましょう。
最初は定義\(1\)から始まります。定義\(1\)により、文字列\(0\)が表記として許されていることが分かります。次に定義\(3\)を見てみると、\(0\)が許されていることから文字列\(\psi_0(0)\)が表記として許されていることが分かります。同様に、定義\(3\)によって\(\psi_0(\psi_0(0))\)や\(\psi_{\psi_0(0)}(0)\)や\(\psi_{\psi_0(0)}(\psi_0(0))\)が許されていることが分かります。最後に、定義\(2\)によって\(\psi_0(0)+\psi_0(0)\)や\(\psi_{\psi_0(0)}(\psi_0(0))+\psi_{\psi_0(0)}(0)\)が表記として許されていることが分かります。
ここで、重要なポイントを解説する前に、\(T\)と\(PT\)の違いを以下にまとめておきましょう。
- \(T\)は、表記として許される項の全体集合である。\(PT\)は\(T\)の部分集合なので、\(PT\)もまた表記として許されている項の集合である。
- \(PT\)には\(\psi_a(b)\)の形で表せられる項のみが属する。つまり、\(0\)や\(c+d\)の形で表せられる項は属さない。ただし、\(a\)と\(b\)には\(0\)や\(c+d\)の形で表せられる項を入れることができる。
本来であれば\(T\)を定義するだけで十分なのですが、\(PT\)を定義することによって次のような利点があります。
- \(+\)を使っている項を扱いやすくなる。
- \(0+0\)のような許容したくない文字列を排除するのが簡単になる。(定義中では\((a,b) \in PT \times (T \setminus \{0\})\)として現れていますね。)
- 定義中での場合分けが楽になる。
自分にとって利点があるなと思えるときは、この他にもいろんな集合を定義していきましょう!
さて、ようやく重要なポイントを解説します。まず、\(T\)には\(\psi_{\psi_0(0)}(0)+\psi_{\psi_0(0)}(\psi_0(0))\)のような項が含まれています。順序数で例えると、\(\omega+\varepsilon_0\)のような形(非標準形)が許されているということです。実際に極限形から展開を計算する場合には現れない形だから、そういうのが許されていても大丈夫・・・?場合によっては大丈夫でしょう。重要なのは、今回私が紹介する方法では展開規則を\(T\)に属するすべての要素に対して定めるため、展開規則は非標準形に対しても適用可能である必要があります。この理由については、次のステップの用語解説の全域写像の項で説明します。これを避けたい場合は、\(T\)を定めた後に実際の標準形の集合\(OT\)を定めて、展開規則を\(OT\)に対して定めるという方法があります。ただし、極限形を展開して得られる項を実際の標準形として定める場合は、展開規則を\(OT\)に対して定めることはできません。なぜなら、これは循環論法になるからです。
展開規則の定義を与える[]
展開規則を定めるために必要なものは揃っているので、ここからは展開規則を定義していきます。今回は簡易化のために取り扱いませんでしたが、必要に応じて項同士の大小比較や、共終数の類似概念などを定義することがあります。これらは前述の実際の標準形を定義するために使われたり、展開規則を定義しやすくするために使われたりします。必要になったときにはそれらを使っている表記を見てみたり、巨大数論者に聞いてみたりしましょう。
展開規則の最も簡単な定義方法の一つは、\(T\)から\(T\)への文字列書き換えを行う写像を場合分け完全によって定義することです。というわけで、まずは写像を用意してみましょう。
計算可能全域写像 \begin{eqnarray*} [ \ ] \colon T \times \mathbb{N} & \to & T \\ (s,t) & \mapsto & s[t] \end{eqnarray*} を以下のように再帰的に定める:
この文は文字列書き換えを、基本列を与える写像として慣習的に用いられている\([ \ ]\)を使って写像として再帰的に、つまり繰り返しによって定義することを宣言しています。他に使いたい記法があるなら、それを使っても構いません。以下に、いくつかの用語と記号について解説します。
- 計算可能
計算可能は、数学的にはチューリングマシンを使って定義されていますが、ざっくり言うと: 1. その写像に入力される数や文字列が有限である。2. その写像の計算アルゴリズムが明示されており、その計算が有限のステップで終了する。を満たすということです。これを満たさないものはすべて計算不可能となります。今回は計算可能のレギュレーションで表記を作っているので、計算可能であることを宣言しています。(本当に計算可能かどうかは証明が必要になります。これは定義者の意図を伝える目的で書かれるものです。)
- 全域写像
そもそも写像とは何かというと、関数の概念をより一般的にしたものだと考えてください。全域写像とは、その写像の始域内(入力される要素の全体集合)のすべての入力に対して対応する出力が定義されている写像のことです。言い換えると、定義域が始域と一致する写像のことです。全域であるためには、場合分け完全である必要があります。つまり、定義内で\(A\)という場合が出てきたら、\(A\)でない場合についても定義が書かれている状態である必要があります。なので、場合分けが実は不完全だったなどで展開規則が適用できない例が出てきてはいけません。また、始域と定義域が\(T\)、つまり全域であるという事は、任意の\(T\)の要素に対し計算規則が適用可能であるという事を意味します。この「計算規則が適用可能である」には、その計算が終了することも含まれます。何回も写像の計算を通して結果として無限ループするのは大丈夫ですが、一回一回の計算では終域に属するような何らかの(有限な)出力を行える必要があります。一方で、全域でない写像は部分写像となります。つまり、始域の部分集合に定義域を持つ写像が部分写像となります。ここで、「じゃあ"標準形"にだけ定義したいから展開規則は部分写像で作ろう!」と早とちりしてはいけません。わざわざ全域写像で定義するのには、明確なメリットがあるからです。それは、計算不能に陥る可能性や意図していない挙動の発生を限りなく低くできる点です。更に、部分写像として定義する場合にはデメリットもあります。一つは、その写像の出力が入力に適さない形になる場合が発生すると、それ以上の計算が不能になってしまうことに注意しないといけません。言い換えると、部分写像の出力が必ずその部分写像の入力に適した形になるようにしなければなりません。これを満たすような構成方法はかなり難易度が高いものとなっていますし、考えないといけないことと確認作業が増えるので初心者かどうかに限らず根気と地頭の良さを要求されてしまいます。全域写像で定義した方が定義が簡潔になり、そのような心配をする必要もなく、結果として少ない労力で定義を書くことができると思います。ただし、部分写像で定義するメリットが明確な場合や、全域性が不明な写像を定義する場合は部分写像として定義する方が良いでしょう。
- \([ \ ] \colon T \times \mathbb{N} \to T\)
この文は、写像名が\([ \ ]\)で、始域(入力される要素の全体集合)が\(T \times \mathbb{N}\)、終域(出力される要素が属する集合)が\(T\)であるという意味です。\(\mathbb{N}\)は数学の慣習的記法で、自然数の集合を表します。自然数に\(0\)を含めるか否かは流派や分野によって違いますが、巨大数論においては\(0\)を含める方が一般的のようです。
- \((s,t) \mapsto s[t]\)
この文は、入力が変数の組\((s,t)\)で、出力が\(s[t]\)と表せられるという意味です。前の文\([ \ ] \colon T \times \mathbb{N} \to T\)と合わせることで、\(s \in T\)、\(t \in \mathbb{N}\)、\(s[t] \in T\)であることが分かります。私たちは出力\(s[t]\)を、入力変数\(s\)と\(t\)を使って定義することになります。
写像が用意できたら、あとはその定義を書くだけです。一般化した展開ルール
- \(s = 0\)ならば、\(0\)を返す。
- \(s = a+b\)という形ならば、\(b\)での展開を\(b'\)と置く。\(a+b'\)を返す。
- \(s = \psi_a(b)\)という形だとする。
- \(b = 0\)とする。
- \(a = 0\)ならば、\(0\)を返す。
- \(a = \psi_0(0)\)または\(a = A+\psi_0(0)\)という形ならば、\(a\)を\(1\)減らして\(b\)にネストする。
- 上記のいずれの条件も満たさないならば、\(a\)での展開を考える。
- \(b = \psi_0(0)\)または\(b = B+\psi_0(0)\)という形ならば、\(b\)を\(1\)減らしたものを\(s'\)と置く。\(s'+s'+ \dots +s'+s'\)を返す。
- 上記のいずれの条件も満たさないならば、\(b\)での展開を考える。
- \(b = 0\)とする。
を元に、写像の定義に合うように加筆修正を行っていくと、次のようになります。
- \(s = 0\)ならば、\(s[t] := 0\)である。
- \(s = a+b\)を満たす\((a,b) \in PT \times (T \setminus \{0\})\)が存在するならば、\(b' := b[t]\)と置く。
- \(b' = 0\)ならば、\(s[t] := a\)である。
- そうでないならば、\(s[t] := a+b'\)である。
- \(s = \psi_a(b)\)を満たす\((a,b) \in T^2\)が存在するとする。
- \(b = 0\)とする。
- \(a = 0\)ならば、\(s[t] := 0\)である。
- \(a = \psi_0(0)\)または\(a = A+\psi_0(0)\)を満たす\(A \in T\)が存在するならば、\(0 \le i \le t\)を満たす\(i \in \mathbb{N}\)に対し、\(\Gamma_i\)を次のように再帰的に定める。\(s[t] := \Gamma_t\)である:
- \(i = 0\)ならば、\(\Gamma_i := \psi_{a[0]}(b)\)である。
- \(0 \lt i \le t\)ならば、\(\Gamma_i := \psi_{a[0]}(\Gamma_{i-1})\)である。
- 上記のいずれの条件も満たさないならば、\(s[t] := \psi_{a[t]}(b)\)である。
- \(b = \psi_0(0)\)または\(b = B+\psi_0(0)\)を満たす\(B \in T\)が存在するならば、\(s' := \psi_a(b[0])\)と置く。
- \(t \in \{0,1\}\)ならば、\(s[t] := s'\)である。
- そうでないならば、\(s[t] := s'+s[t-1]\)である
- 上記のいずれの条件も満たさないならば、\(s[t] := \psi_{a}(b[t])\)である。
- \(b = 0\)とする。
それでは、解説を行いましょう。
- \(a := b\)
この文は、\(a\)を\(b\)と定義するという意味です。\(:=\)は定義イコールと読みます。この文が定義文であることを明示するための記法で、条件文に現れる\(=\)と区別することで曖昧さを減らしています。
- \(A\)ならば、\(B\)である。
この文は、条件文\(A\)が成り立つならば、\(B\)が成り立つという意味です。今回は\(B\)が定義文なので、「\(A\)という条件を満たすならば、\(B\)と定義する。」ということになります。
- \(A\)または\(B\)ならば、~
この文は、条件文\(A\)か\(B\)のどちらか一方、またはその両方が成り立つ場合に、「~」に入っていく条件文です。
- \(A\)かつ\(B\)ならば、~
この文は、条件文\(A\)と\(B\)が同時に成り立つ場合に、「~」に入っていく条件文です。
- \(A\)とする。\(B\)ならば、\(C\)である。\(D\)ならば、\(E\)である。・・・
この文は、条件文\(A\)が成り立つもとで、更に条件分岐を行う文です。共通する条件を満たす中で場合分けを行いたい場合に便利な文です。
- \(A\)ならば、\(B\)である。そうでないならば、\(C\)である。
この文は、条件文\(A\)を満たすときに\(B\)が成り立ち、\(A\)を満たさないときは\(C\)が成り立つという意味です。場合分け完全の定義を書くときの基本的な文法となります。
- \(A\)ならば、\(B\)である。\(C\)ならば、\(D\)である。・・・上記のいずれの条件も満たさないならば、\(Z\)である。
この文は、「\(A\)ならば、\(B\)である。そうでないならば、\(C\)である。」という文の場合分けを増やしたものになります。複数の条件分岐が発生したときに、いずれの条件にも当てはまらない場合を「上記のいずれの条件も満たさないならば、」として処理しています。もちろん、「\(A\)でないかつ\(C\)でないかつ・・・」のように、いずれの条件にも当てはまらない場合を具体的に書いても良いです。
- \(A\)を満たす\(B\)が存在するならば(あるいは、存在するとする)
この文は、一時変数を使用する場合に便利な文です。入力として与えられた変数だけでは定義を書けない場合、一時変数を使います。例えば「\(s = a+b\)」という文においては、\(a\)と\(b\)が一時変数ですね。一時変数を使う場合は、必ずその変数が何者かを明言しないと読み手にこちらの意図が伝わりません。つまり、「\(s = a+b\)を満たす\((a,b) \in PT \times (T \setminus \{0\})\)が存在する」というところまで書いて初めて読み手に\(a\)と\(b\)が何なのかを伝えることができるというわけですね。このように、「(一時変数を使った文)を満たす(一時変数が何者であるかを明示する文)が存在するならば(あるいは、存在するとする)」という文を使いこなすことが、定義を書けるようになるための重要なポイントであると言えるでしょう。
- \(a := b\)と置く。
この文は、一時変数\(a\)を既に存在する変数や写像などを使って\(b\)と定義するという意味です。この文では\(a\)が何者であるかを明示する必要はありません。なぜなら、「既に存在する変数や写像などを使って\(b\)と定義する」ことから、自動的に\(a\)が何者であるかが決まるためです。
上の解説でもって、定義文が読めるようになったのではないでしょうか?
ところで、一般化した展開ルールと若干異なるところがあることに気付いたと思います。具体的には、
- \(s = a+b\)を満たす\((a,b) \in PT \times (T \setminus \{0\})\)が存在するならば、\(b' := b[t]\)と置く。
- \(b' = 0\)ならば、\(s[t] := a\)である。
- そうでないならば、\(s[t] := a+b'\)である。
という部分と、
- \(a = \psi_0(0)\)または\(a = A+\psi_0(0)\)を満たす\(A \in T\)が存在するならば、\(0 \le i \le t\)を満たす\(i \in \mathbb{N}\)に対し、\(\Gamma_i\)を次のように再帰的に定める。\(s[t] := \Gamma_t\)である:
- \(i = 0\)ならば、\(\Gamma_i := \psi_{a[0]}(b)\)である。
- \(0 \lt i \le t\)ならば、\(\Gamma_i := \psi_{a[0]}(\Gamma_{i-1})\)である
という部分と、
- \(b = \psi_0(0)\)または\(b = B+\psi_0(0)\)を満たす\(B \in T\)が存在するならば、\(s' := \psi_a(b[0])\)と置く。
- \(t \in \{0,1\}\)ならば、\(s[t] := s'\)である。
- そうでないならば、\(s[t] := s'+s[t-1]\)である
という部分ですね。
1つ目については、このように場合分けすることで\(X+0\)のような形を排除する目的があります。文字列の厄介なところですが、\(X+0\)は勝手には\(X\)と簡略化されないため、このような書き方をする必要があります。
2つ目については、「\(a\)を\(1\)減らして\(b\)にネストする。」というものを具体的なアルゴリズムに書き直したものになります。\(\Gamma_i\)を、\(i\)回ネストするための具体的な手順を元に構成し、\(\Gamma_t\)を\(s[t]\)の返り値をすることで、\(t\)回のネストを行っています。このように書くことで、\(\ldots\)や\(\cdots\)を使うことで生じる曖昧さを減らすことができます。
3つ目については、「\(s'+s'+ \dots +s'+s'\)を返す。」というものを具体的なアルゴリズムに書き直したものになります。2つ目と同様、\(\ldots\)や\(\cdots\)を使うことで生じる曖昧さを減らすことができます。
特に2つ目と3つ目について、わざわざこんな難しい書き方をしなくてもと思われるかもしれません。実際その通りで、もしあなたが\(\ldots\)や\(\cdots\)を使って厳密に定義を書ける自信があるならば、このような書き方をする必要はありません。しかし、\(\ldots\)や\(\cdots\)を使って書こうとすると、上記の書き方では不必要だった場合分けが生じたり(例えば\(0\)回や\(1\)回だけネストや\(+\)の形に展開するときは\(\ldots\)や\(\cdots\)を使えないので書き分ける必要がある)、繰り返すもの(例えば\(s'\))がいくつあるかを明示しないといけなかったりと、案外楽ではないことに気付くと思います。まあこの辺は好みですが、やはり再帰的な手順で構成するほうが簡単で厳密性もあるのでおすすめとなります。
後書き[]
以上で定義の書き方の解説は終わりとなります。いかかでしたか。よろしければ高評価とチャンネル登録をお願いします。今回は定義の書き方初心者の方向けだったため取り扱わなかったものがたくさんありますが、とりあえず今回習ったことを身に付けることができたら検索したり巨大数論者に聞いてみたりしましょう。それでは楽しいグーゴライフを楽しんでください。さよなら~🐻🐻
最後に、完成品としての定義を以下に置いておきます。解説で取り扱っていないものも登場しますが、今までの解説を理解できていれば理解するのはそう難しくないでしょう。
表記の概要[]
\(\zeta_0\)の強さをもつ表記を定義します。表記名を「ゼータψ」とします。
ゼータψ[]
表記[]
\(0\)と\(+\)と\(\psi\)と\((\)と\()\)のみからなる文字列の集合\(T\)と\(PT\)を以下のように同時に再帰的に定める:
- \(0 \in T\)である。
- いかなる\((a,b) \in PT \times (T \setminus \{0\})\)に対しても、\(a+b \in T\)である。
- いかなる\((a,b) \in T^2\)に対しても、\(\psi_a(b) \in PT \cap T\)である。
展開規則[]
計算可能全域写像 \begin{eqnarray*} [ \ ] \colon T \times \mathbb{N} & \to & T \\ (s,t) & \mapsto & s[t] \end{eqnarray*} を以下のように再帰的に定める:
- \(s = 0\)ならば、\(s[t] := 0\)である。
- \(s = a+b\)を満たす\((a,b) \in PT \times (T \setminus \{0\})\)が存在するならば、\(b' := b[t]\)と置く。
- \(b' = 0\)ならば、\(s[t] := a\)である。
- そうでないならば、\(s[t] := a+b'\)である。
- \(s = \psi_a(b)\)を満たす\((a,b) \in T^2\)が存在するとする。
- \(b = 0\)とする。
- \(a = 0\)ならば、\(s[t] := 0\)である。
- \(a = \psi_0(0)\)または\(a = A+\psi_0(0)\)を満たす\(A \in T\)が存在するならば、\(0 \le i \le t\)を満たす\(i \in \mathbb{N}\)に対し、\(\Gamma_i\)を次のように再帰的に定める。\(s[t] := \Gamma_t\)である:
- \(i = 0\)ならば、\(\Gamma_i := \psi_{a[0]}(b)\)である。
- \(0 \lt i \le t\)ならば、\(\Gamma_i := \psi_{a[0]}(\Gamma_{i-1})\)である。
- 上記のいずれの条件も満たさないならば、\(s[t] := \psi_{a[t]}(b)\)である。
- \(b = \psi_0(0)\)または\(b = B+\psi_0(0)\)を満たす\(B \in T\)が存在するならば、\(s' := \psi_a(b[0])\)と置く。
- \(t \in \{0,1\}\)ならば、\(s[t] := s'\)である。
- そうでないならば、\(s[t] := s'+s[t-1]\)である
- 上記のいずれの条件も満たさないならば、\(s[t] := \psi_{a}(b[t])\)である。
- \(b = 0\)とする。
急増加関数[]
計算可能部分写像 \begin{eqnarray*} f \colon T \times \mathbb{N} \times \mathbb{N} & \to & \mathbb{N} \\ (s,m,n) & \mapsto & f_s^m(n) \end{eqnarray*} を以下のように再帰的に定める:
- \(m = 0\)ならば、\(f_s^m(n) := n\)である。
- \(m = 1\)とする。
- \(s = 0\)ならば、\(f_s^m(n) := n+1\)である。
- \(s \neq 0\)とする。
- \(s = \psi_0(0)\)または\(s = S+\psi_0(0)\)を満たす\(S \in T\)が存在するならば、\(f_s^m(n) := f_{s[0]}^n(n)\)である。
- そうでないならば、\(f_s^m(n) := f_{s[n]}^1(n)\)である。
- \(m \notin \{0,1\}\)ならば、\(f_s^m(n) := f_s^1(f_s^{m-1}(n))\)である。
限界関数[]
計算可能全域写像 \begin{eqnarray*} \Lambda \colon \mathbb{N} & \to & PT \\ n & \mapsto & \Lambda(n) \end{eqnarray*} を以下のように再帰的に定める:
- \(n = 0\)ならば、\(\Lambda(n) := \psi_0(0)\)である。
- \(n \neq 0\)ならば、\(\Lambda(n) := \psi_{\Lambda(n-1)}(0)\)である。
標準形[]
ここでは、表記の標準形を定める。
部分集合\(OT \in T\)を次のように再帰的に定める:
- いかなる\(n \in \mathbb{N}\)に対しても、\(\Lambda(n) \in OT\)である。
- いかなる\((s,n) \in OT \times \mathbb{N}\)に対しても、\(s[n] \in OT\)である。
命名[]
計算可能全域写像 \begin{eqnarray*} F \colon \mathbb{N} & \to & \mathbb{N} \\ n & \mapsto & F(n) \end{eqnarray*} を\(F(n) = f_{\psi_0(\Lambda(n))}^n(n)\)と定める。
\(F(10^{100})\)を「ゼータψ数」と名付ける。
表記の限界に対応する順序数を「Zeta psi ordinal」(ZPO)と名付ける。