Cでは
#define is_odd(x) ((x)&1)
と,引数が奇数であるかどうかを判定する,関数形式マクロを定義します.授業でも言っていますが,演算子の優先順位による影響を避けるため,置換内容には,全体と各引数にカッコをつけましょう.
このとき,3 != 1ですが,is_odd(3) == is_odd(1)です.
「&1」という演算,そしてis_oddという関数形式マクロは,一種の射影です.整数型の最下位ビットのみを残すという演算です.あいにく,「1ビットの値」というのはC89で表せないので*1,結果は整数型となりますが,整数値の最下位ビットだけを保持しそれ以外を取り除くというのは,まさに射影です.
《問い》では
『さらが 5まい あります。1さらに りんごが 3こずつ のって います。りんごは ぜんぶで 何こ あるでしょう。』という《問い》と,「しき」と「こたえ」を書く欄があって,子どもは「しき」に「5×3=15」,「こたえ」に「15こ」と書いたところ,「こたえ」はマル(正解)だけれど,「しき」のほうがバツ(不正解)で,そばに「3×5=15」と赤で書かれました.
「×」から学んだこと
文字列として表記される,単位付きの式から,単位をなくす射影を導入し,検討してみます.
まず,式の候補を出して,ラベルを振ります.
- b1≡"3こ×5まい=15こ"
- b2≡"3こ/まい×5まい=15こ"
- b3≡"1さらに3こ×5まい=15こ"
- c11≡"5まい×3こ=15こ"
- c12≡"5まい×3こ/まい=15こ"
- c13≡"5まい×1さらに3こ=15こ"
- c21≡"5こ×3かい=15こ"
- c22≡"5こ/かい×3かい=15こ"
- c23≡"1かいに5こ×3かい=15こ"
- d11≡"5こ×3まい=15こ"
- d12≡"5こ/まい×3まい=15こ"
- d13≡"1さらに5こ×3まい=15こ"
- d21≡"5まい×3こ=15まい"
- d22≡"5まい/こ×3こ=15まい"
- d23≡"1こに5まい×3こ=15まい"
- x≡"3×5=15"
- y≡"5×3=15"
b1, b2, b3は,「×」から学んだことの「Q: 「しき」に単位を書かせたら済む話だったのではないでしょうか?」で挙げた式です.
c11, c12, c13はそれぞれ,b1, b2, b3から乗数と被乗数を単位付きで交換してできる文字列です.c21, c22, c23はそれぞれ,トランプ配りに基づく式の例です.d11, d12, d13はそれぞれ,b1, b2, b3から単位はそのままにして,除数と被除数の数を交換してできる文字列です.d21は,b1で乗数と被乗数を単位付きで交換した上で,右辺の単位を被乗数に合わせたもので,d22, d23はそれぞれ,b2, b3をもとにd21と同じように単位合わせをしてできる式です.
d21, d22, d23については,計算結果が「15まい」となっていて,「こたえ」の「15こ」と一致していません.なので除外してよいと考えたいところですが,ここでは採点を,「しき」と「こたえ」とで別々に行っているものとします.「しき」が間違っていたら「こたえ」を採点の対象としない,という先生よりは,優しいわけです.そもそも,b1からd23までというのはそういう指導をしない限り,小学生が“書かない”ものであって,書くのは,xかyかそれ以外です.xを書いたときにb1からb3あるいはx自体のうちどれを考えたか,yを書いたときにc11からd23あるいはy自体のうちどれを考えた・どれと解釈できるか*2,という視点でご覧ください.それでもなお,「c11〜c23はあり得ない」あるいは「d11〜d23はナンセンス」とお考えの方は,この文章とはここでさようならです.
xとyは,単位を書かない場合の式です.式は他にも考えられますが,割愛します.なぜbから始まっているかというと,分かりやすく抽象的に・2010年11月バージョンのb, c, dと合わせたかったからです.次の話に移る前に,採点者の立場になってみて,b1からyまでに対して,どれを正解とし,どれを不正解とするか,またそれぞれを解答する児童がどれくらいいそうか,考えてみていただけると幸いです.「5×3=15」をマルにすべきという人は,c11からc23までの考え方をする児童が無視できないほどいる,バツにすべきという人は,d11からd23までの考え方をする児童が十分にいる,と考えるでしょうね.
さて次に,単位をなくす射影を設定します.インフォーマルに,写像pは,単位付きの式をパラメータとし,単位なしの式にする(数,演算子,等号は保持する)ものとします.ただし,例えばb3に含まれる "1さらに3こ" は,この射影により "3" とします.「時速3km」や,Cプログラミングの「char z[3];」という宣言のように,数(Cプログラミングの場合は変数)の前後に単位(型)を書けるからです.
pは,文字列から文字列への写像です.等号「=」と否定等号「≠」を,文字列間でも使用してよいとすると,以下の関係が成り立ちます.
- x=p(b1)=p(b2)=p(b3)
- y=p(c11)=p(c12)=p(c13)=p(c21)=p(c22)=p(c23)=p(d11)=p(d12)=p(d13)=p(d21)=p(d22)=p(d23)
また,写像pを導入する前に定義したb1からyまでについては,異なるどの2つ(s, tと書きます)についても,s≠tです*3.とすると,x≠yでもあるわけですが,これは文字列比較だからであって,数式としては,例えば
- x'≡3×5
- y'≡5×3
のように等号と右辺を取り除き,文字列ではなく数式となるよう,記号「'」を定めると,x'=y'となります.この「'」は,文字列から数への写像として定義できます.また,この等式は,数同士の関係である点にも,注意したいところです.
それらを合わせるとどうなるかというと,適当な写像qを定めれば,b1からyまでのうち任意のペアs, tに対して,q(s)=q(t)とできる,ということです.
もちろん,q(s)=q(t)から,s=tとするわけにはいきません.3も1も,奇数という点では同じですが,3と1は当然違う数ですし,プログラム上では極端な最適化でもなされない限り,異なるトークンであり値(おそらく定数)とみなされます.上のラベルから,b1とc11のペアを取り出してみると,qで変換されれば3×5=15=5×3ですが,この事実からは,"3こ×5まい=15こ"と"5まい×3こ=15こ"を同一視できないのです.
考えられるいろんな式に対して,それらを等しいとみなすのはいいことじゃないか,と思いたいところですが,問題もあります.上の議論では,
- q(y)=q(c11)=q(c12)=q(c13)=q(c21)=q(c22)=q(c23)=q(d11)=q(d12)=q(d13)=q(d21)=q(d22)=q(d23)
という等式も成り立ちます.これは,答案としてyを書き,その根拠をc11からc23までのいずれかに求めるのなら,d11からd23までについても正解とせよということを意味します.これらを正解とする学校の先生は,ちょっと考えられません.
なので,yを書いてバツとされた児童が,先生にc11の意図なんだと言っても通じず,それはd21と読めるんですよと先生に言われる,というシナリオが考えられます.先生は別に意地悪をしているわけではなく,yを見てd21やd11を想起するのは,それまでに教えた・児童が学んだ『「1つ分の大きさ」×「いくつ分」=「全体の大きさ」』と今回の《問い》から推測できるのです*4.
シナリオというのは,ラベルだの写像だのを使わずに書くことができます.
児童「先生,「5×3=15」って,バツなの?」
先生「そうだよ.なんでそんな式を作ったの?」
児童「先生,トランプ配りって知らないの? お皿に1個ずつ乗せるのが1回で,5個になって,それを3回やったら,5×3=15って書けるんだよ」
先生「でも「5×3=15」って書いただけでは分からないよね.この式はね,1個のりんごに5枚ずつお皿が乗ってて,そんなりんごが3個ある,って読めてしまうんだよ」
児童「そんなのおかしいよお」
ま,児童が先生をやり込めるシナリオも,書いてみますか.
児童「先生,「5×3=15」って,バツなの?」
先生「そうだよ.だってその式,1個のりんごに5枚ずつお皿が乗ってて,そんなりんごが3個ある,ってことだもん」
児童「でもね先生,トランプ配りってのがあるんだ.お皿に1個ずつ乗せるのが1回で,5個になって,それを3回やったら,5×3=15って書けるんだよ」
先生「ふむぅ」
別の言い方をすると,単位付きの式からその単位をなくす写像(射影)は容易に定義できますが,単位なしの式からそこに単位を付ける操作を考えたとき,たとえ解くべき問題すなわち文脈が定まっていても,その逆写像を一意に(児童・先生・bloggerがすべて納得するようなものとして)定めるのは困難だということです.
念のため,上の議論だと,b~は式としては正解にできないんだけど,q(b~)=xになる,そんな答案もあるんじゃないのという反論が考えられるので,答えておきますと,答案にb~と書いていればバツにすればいいわけですし*5,b~を考えてxと書くというのは,b1からb3およびxのいずれかを考えてxを書くのと区別できないので,矯正すべき式の立て方があるなら別の問い方でテスト*6し識別せざるを得ません.そもそも,児童がb~になるようなものを答えに書く可能性は,現在の小学校教育において,xあるいはyを書くのと比べてうんと低く,無視できるとみなしています.かといって,斬新な解法を作って普及されるのも困るのですが.
*1:ビットフィールドというのはあるけれど,共用体と同じく,授業では取り上げていませんね….
*2:解釈するのは採点者,すなわち小学校であれば先生です.「xを書いたときにb1からb3あるいはx自体のうちどれと解釈できるか」を考えないのは,このxを間違いと主張する人はいないからです.実はxと書いてバツにされるケースも想定できます.これについては,対策と合わせて,後日書くことにします.翌月追記:「現状肯定」談義で書きました.
*3:同語反復だなあ.b1からyまでを一つの集合としたら,その集合の要素数は14である,とすればいいのかな.
*4:《問い》とyが提示されたときに,c11からd23までのどれを想起するのか,児童・先生・bloggerでアンケートをとってみると,違いが現れるんじゃないかなとも思います.といっても,バイアスのない回答者を用意するのが難しいなあ.
*5:a≡"題意より,「1つ分の大きさ」が(1皿あたり)3個,「いくつ分」が5枚であるから,式の候補として「3×5=15」が挙げられる.一方,トランプ配りを用いると,「1つ分の大きさ」が(1回で配る)5個,「いくつ分」が3回であるから,式の候補として「5×3=15」も考えられる.これら2つの式を比較した場合,後者は,問題文に現れる数字のうち5と3を順に取り出してかけ算にしたという誤答と区別できない.そこでこの候補を除外し,「3×5=15」を最終的な解答とする" なんて,あの狭い「しき」の中に書く子がいたら嫌だなあ.
*6:wikipedia:ソフトウェアテスト.何といっても本エントリのカテゴリーには,5×3だけでなく情報教育も入っていますから.