職業プログラマの休日出勤

職業プログラマによる日曜自宅プログラミングや思考実験の成果たち。リアル休日出勤が発生すると更新が滞りがちになる。記事の内容は個人の意見であり、所属している(いた)組織の意見ではない。

昨日の明日は今日?

「昨日の明日は今日」という言い回しがあります。本当にそうなのでしょうか?

この問題は、新人のプログラマさん*1に教育目的で時々投げかけていたものです。この記事では、この問題への想定解をいくつか紹介します。唐突に思い出したので記事にまとめました。

言葉の意味から考える

小学館デジタル大辞泉Weblio経由の配信)によれば

あす【明‐日】
今日の次の日。あした。みょうにち。

https://www.weblio.jp/content/%E6%98%8E%E6%97%A5

とのことです。つまり「明日」は「今日」を起点にした相対的な日付表現であります。

想定解その1

「昨日の」という修飾語が伴っていたとしても起点は今日、という解釈も一応有り得ます。この解釈をした場合、「今日の次の日」は「今日」ではないことが大半ですから、冒頭の命題は偽であると言えます。

想定解その2

「明日」という語に「昨日の」という修飾語を伴っている時点で不正な呼び出しであり答えは未定義であって冒頭の命題も評価不可能である、という回答も考えられます。

想定解その3

プログラミング言語におけるマクロ展開のような考え方を適用すると「昨日の明日は今日」という文は「昨日の今日の次の日は今日」という文に展開されますが、この文での「昨日の今日」の助詞「の」は並立助詞で列挙を示すと考えられ、「昨日または今日 の次の日は今日」という文になると言えます。この場合、「昨日または今日」が今日である場合は次の日は今日ではないことが大半ですので、冒頭の命題は偽であるという回答も有り得ます。

日付時刻の評価タイミングから考える(想定解その4)

これは最もプログラマっぽい想定解なのですが、「昨日の明日は今日」という文を読み上げたとき、例えば「昨日」の語を読み上げた瞬間は 2020年11月28日23時59分59秒 で、「今日」の語を読み上げた瞬間は 2020年11月29日00時00分00秒 である、ということが考えられます。この例のとき、「昨日の明日」は 2020年11月28日 を指し示すことになりますので、「今日」である 2020年11月29日 とは異なっています。このことから、冒頭の命題は偽であると言えます。ちなみに、ここでは「昨日の明日」という言葉は「昨日の次の日」という意味であると解釈しています。

この例では口頭での会話としましたが、コンピュータにおいても同じです。「昨日」という日付の相対表現を絶対表現に置き換える処理を実行した瞬間と、「今日」という日付の相対表現を絶対表現に置き換える処理をした瞬間とで、日付が同じであるという保証は、(処理系にもよりますが)通常はありません。それではこの保証を作り込むためにはどのようなプログラミングをすれば良いでしょうか?という話を考えてもらうのが、新人のプログラマさんにこの話をする意図です。

他に

「天変地異が起きて地球の自転周期が乱れGMTの定義に影響があったとき」や「改暦があったとき」「飛行機等で日付変更線を越えたとき」なんかも、上記の相対日付の評価タイミングと同じ問題を踏むキッカケとはなりそうです。また、すごいスピード(光速やそれに近い速度)で移動した場合なんかも、いろんなことが起こるかもしれません。皆さんは他にどんな事案が思い浮かびますか?

さいごに

これらの話も屁理屈と言えばその通りなのですが、このような観点を見過ごしたことによってプログラムはバグを抱えることだってあるのです。身を守るためには様々な観点を身につけるほかありません。

*1:大学とかで計算機科学の基本を一通り学んだけども情報システム開発の実務経験は乏しい、くらいの人の想定。