Skinerrian's blog

論理学・哲学・科学史・社会学などに興味があるので、その方面のことを書きます。更新は不定期。

括弧の話

ハードディスクの中身を整理していたら、数年前に思いつきで書いた、『数学ガール』の二次創作が見つかった…。何でこんな駄文を作ってしまったのか悔やまれるが、サンプルを1つ以下に載せてみる。数学的な正しさ・厳密さは全く保証できませんので。

それと、断っておくと、『数学ガール』は結城浩先生の創造物です。

数学ガール (数学ガールシリーズ 1)

数学ガール (数学ガールシリーズ 1)

演算の順序

  • テトラ:ねぇ、先輩。小学校の頃から気になっていたことなんですけど…
  • ぼく:何かな。
  • テトラ:「2+3×5」みたいな式って、後ろの3×5を先に計算するって習うじゃないですか。でもどうして足し算より掛け算が先なんでしょう?
  • ぼく:確かにそれは気になるよね。ぼくも少し考えたことはあるけれど…。そうだねぇ。まず、括弧を書くっていうのはどういうことなのか、ということを考えてみればいいんじゃないかな。
  • テトラ:「括弧」、ですか。
  • ぼく:うん。じゃあ、とりあえずさっきの式を、括弧を省略しないで書いてみようか。
  • テトラ:えーと…

2+(3×5)

  • こうですか。
  • ぼく:残念、はずれ。一番外側の括弧が抜けているよ。正解は

(2+(3×5))

  • だね。
  • テトラ:一番外側に括弧つけるなんて習ってませんよぅ。
  • ぼく:まぁそうだよね。でも、「+」とか「×」のような演算子を使って、より大きな式を作るつくるときには括弧をつけるものなんだよ。
  • テトラ:何だか面倒ですね。
  • ぼく:うん。だから省略していいことになっている。一番外側の括弧を取り去っても、他の読み方ができるようになるわけじゃないからね。こういう風に、読み方の一意性が損なわれない限りで括弧は省略してよいということは、省略規則とよばれているんだ。
  • テトラ:「イチイセイ」?
  • ぼく:一つしかないってことだよ。
  • テトラ:あぁ、思い出しました。あたしどうも数学の用語って苦手です…。ところで、2+3×5は全然一意的に読めないと思うんですけど。
  • ぼく:まぁ普通に考えればそうだよね。そこは暗黙のルールというやつだよ。「×」は「+」よりも数字との結びつきが強い、という取り決めをするんだ。
  • テトラ:…それって何かズルいような。
  • ぼく:でも便利だよ。つまり、デフォルトの状態は何なのかを予め決めておいて、それ以外の場合にだけ括弧をつける、という風にしておけば括弧は省略できるわけだからね。デフォルトな状態ってのは、この場合は掛け算の方が先っていうことね。(2+3)×5のように、足し算を先にやるときには括弧が必要になる。
  • テトラ:…例えば、負の数のときには「-」記号をつけるけど、正のときは「+」記号を省略するのと同じような感じなんでしょうか。
  • ぼく:それは良い例だね。それ以外にもこの方法はいろいろ使い道があるよ。例えば、無口な人は、yes/noで答えられる質問をされたとき、何も答えなければyes。Noの時にはそう答える、という風に行動する場合がある。
  • テトラ:それって先輩も、じゃないですか!メールで都合を聞いても大抵返事が返ってこない…。
  • ぼく:…筆不精だからね。これからはちゃんと送るからさ。
  • テトラ:ことばに出さないと伝わらないこともあるんですよ。
  • ぼく:え、何か言った?

ポーランド記法

  • ぼく:…というようなことを話したんだ。そんなに間違ったことは言ってないよね。
  • ミルカ:たぶんね。君が言った省略規則は命題論理でしばしば目にするものだよ。この場合、「+」や「×」に相当するのは「&」とか、「∨」、「→」だけどね。
  • ぼく:「→」はどういう意味?
  • ミルカ:「ならば」という意味だね。「A→B」は「AならばB」。命題論理では、ふつう「&」や「∨」が「→」よりも結びつきが強い。だから、

( (A&B)→C)

  • に省略規則を適用すると、

A&B→C

  • になる。四則計算の省略規則は小学校のころからの訓練で馴れているだろうけど、こちらは見慣れるのに少し時間がかかるかもね。
  • ぼく:…ミルカさんは論理学もできるんだね。
  • ミルカ:これはelementaryだよ。それからね、もう少し工夫をするとすべての括弧を省略することができるよ。ポーランド記法Polish notationという。
  • ぼく:全ての!えぇ、だって「(2+3)×5」の括弧を省略したら3×5が先に計算されちゃうでしょう。
  • ミルカ:そこは「工夫」だよ。我々がふだん見慣れている四則計算の表記法は、演算子を数字と数字の真ん中に書くからinfix notationと呼ばれるんだが、ポーランド記法では演算子の位置を前にもってくる。例えば、「2+3」は「+23」と書かれる。
  • ぼく:ふーん。でもさ、「2」と「3」なのか、「23」なのかはどうやって区別するの。
  • ミルカ:案外鋭いね、君。やり方は幾つかあるだろう。スペースを空けるのが一つのやり方。あるいは、そもそも数字の書き方を変えてしまうというやり方もある。例えば、「2」を「0''」という風に表す。「'」はアクセント記号だけど、この場合は「+1」の意味。まぁ、今は原理的な話をしているわけだから、こういう話はいいだろう。以下ではスペースを空けることにするよ。
  • ぼく:うん。
  • ミルカ:ポーランド記法では、「( (2+3)×5)」はこう書かれる。

×+2 3 5

  • ぼく:暗号みたいだなぁ。
  • ミルカ:これも馴れだよ。左から順に読んでいこう。まず、「×」だから、二つの引数があると考えられる。次は「+」だから、これまた二つの引数があると考えられる。次は「2」と「3」だから二つ揃ったから、「(2+3)」になる。最後は「5」だ。これでまた二つ揃ったから結局「( (2+3)×5)」になる。
  • ぼく:…何となく分かってきたけど。今の説明をフォーマルに書き下すのは大変そうだなぁ。
  • ミルカ:そうかもね。じゃあ、少し練習してみようか。

(1) −+5÷×4 8 2 3

  • これは?
  • ぼく:…。( (5+( (4×8)÷2) )−3)。だから18だね。
  • ミルカ:ふむ。…じゃあ、

(2) +5÷×2 4 −+9 1

  • これは?
  • ぼく:…。あれ、これって何だか変だなぁ。
  • ミルカ:デタラメに書いただけだからね。さっき君はポーランド記法を読む規則をフォーマルに書くのは難しそうだと言ったけれども、ここにはもう一つの難しさがある。文字列を適切なルールに従って分節化して読み込むプログラムをパーサーparserと言うんだが、パーサーは(1)のような式を読めるだけでなく、(2)のような式についてはエラーを出せなくてはならないんだよ。

逆ポーランド記法

  • ぼく:ところで、そのポーランド記法は何か実用性があるの?
  • ミルカ:プログラミングでよく使われるよ。それから、ポーランド記法とは逆に、演算子を操作対象の後ろに置くような表記法があるんだが――逆ポーランド記法というんだが――これをベースにした関数電卓なんかがある。
  • ぼく:使いにくそうな電卓だなぁ。
  • ミルカ:そうでもないよ。実はね、逆ポーランド記法の語順は日本語と同じなんだよ。君、ちょっとこれを読んでくれたまえ。

2+(3×5)

  • ぼく:…2に3と5を掛けたものを足す、かな。
  • ミルカ:その語順通りに記号化してごらん。

235×+

  • ぼく:本当だ。ポーランド記法の逆になっている!すごいなぁ。
  • ミルカ:これは形式言語の表記法が自然言語の分析にも繋がる興味深い一例だよ。まぁこの例だけだとトンチみたいだけどね。