わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

Raccで「6÷2(1+2)」

少し工夫して,「6÷2(1+2)=1」「6÷2(1+2)=9」のどちらも計算可能なRubyスクリプトを作りました.

さっそくですが実行例です.

$ ruby -d calc3.rb 6÷2(1+2)
prioritize concatenation over multiplication and division
execute: racc -o calc.rb calc.y
transform "6÷2(1+2)" into "6/2 (1+2)"
6÷2(1+2)=1
$ ruby -d calc3.rb -q 6÷2(1+2)
set the same priority of concatenation as multiplication and division
execute: racc -o calc.rb calc.y
transform "6÷2(1+2)" into "6/2 (1+2)"
6÷2(1+2)=9

連接については,「数(」「)(」「)数」のいずれかのとき,間に空白文字を入れ,これも演算子とする*1ことで解決を図りました.その優先度を,乗除の演算子より上に置けば,「6÷2(1+2)=1」となり,同じとするなら,「6÷2(1+2)=9」を得ます.デフォルトは前者で,後者にするには実行の際,スクリプトファイル名のあとに-qを指定します.
細かな修正・拡張も行っています.記号類は日本語文字とASCII文字の両方に対応し,演算子の前後に空白があってもよい(事前に取り除く)ようにしました.コマンドライン引数で,優先度設定のほか,任意の式を実行できるようにしています.デバッグ用の出力を充実させました.


昨日知った情報と,所感を書いておきます.「6÷2(1+2)=?」とは - はてなキーワードがあるのにまず驚きました.そこで本記事も,表記を合わせてみました.
「6÷2(1+2)」問題について教育委員会に問い合わせてみた – 半月記は,有用な調査・まとめ記事となっています.ブログ主さんの思惑から,この件は,『単項式の乗法、除法』を認識している(受け入れられる)か,そうでないかという話ではないかとも思っています.単項式の除法を前提とするなら,6÷2xという文字式に対し,xに1+2を代入して計算する*2ことにすれば,「6÷2(1+2)=1」となります.
啓林館の教科書と,昨年の全国学力テストの例(10xy÷5x)で,学習や評価の事例は十分だとも思います.中学校学習指導要領解説 算数編を読み直すと,単項式÷単項式の具体例が載っていないのですが,「第3学年には,例えば(略)(4x^2+6x)\div2xのような多項式を単項式で割る除法について学習する」(PDF版p.134)という式の例があり,これを(4x^2+6x)\div2\times xと見なす余地はなさそうです.
https://twitter.com/metameta007/status/576296729949044736から始まる一連のツイート*3について,情報源を調べてみました.

なお,高木貞治新式算術講義 (ちくま学芸文庫)』では,「÷」のかわりに「:」が使用されており,p.37では「a:b×c=a×c:b」,p.38では「ac:b」といった式が見られますが,除算の演算子の右に,文字の並びが来るような式は,見つかりませんでした.


今さらですが,「6÷2(1+2)=?」に対するスタンスを書いておきます.

  • これは小学校の算数の問題ではない.「2(1+2)」という,連接による積を学習していないから.
  • では中学校の数学の問題として適しているかというと,疑問.その種の「割る」ことの意味を確認するための出題は,文字(単項式)を使った10xy÷5xや(4x^2+6x)\div2xなどのほうがよい.
  • なぜ6÷2(1+2)=1であるか,10xy÷5x=2yであるかは,結局のところ取り決め(数学のルール).ただし,取り決めとして理解する前に,(10xy)÷(5x)と10×x×y÷5×xとで結果が異なり,「どんな順序でもいいというわけではない」ことを押さえておきたい.この種の,計算順序による結果の違いと取り決めは,小学校4年のいわゆる乗除先行(1+2×3=1+6=7であって1+2×3=3×3=9ではないこと)が既習となるのではないか.
  • 「6÷2(1+2)=6÷{2(1+2)}=6÷6=1」にも「6÷2(1+2)=6÷2×(1+2)=1」にも解釈できるというのなら,どちらにでも解釈できるプログラムを作るまで.

*1:これによって,racc実行時に「... shift/reduce conflicts」が出なくなりました.

*2:分数で表してから代入するか,代入してからかけ算・わり算の計算をするか,1+2=3を先に計算してから代入するか,代入してからにするかによって,途中で出現する式が異なりますが,これもまた,式と演算の意味を確認できる機会となります.

*3:リプライにも目を通しましたが,fjで見かけた「暴れ」https://groups.google.com/forum/#!topic/fj.mail-lists.arukikata/yudX4dGxP7g,そして現在なら「ぼくのかんがえたさいきょうの」ってやつですかね.

*4:この著者名を使わずに検索すると,George Peacockによる別の本が出てきました.