整数式の操作 (A3P2)
※この記事は「記事3 問題集2」
ノード・ワイヤー図〈ストリング図〉の解説は:
これより前に行うべき練習は:
この練習では、整数とその足し算/掛け算について考える。足し算/掛け算を含む式をどう組み立てるかを、横棒記法とノード・ワイヤー図で表現する。
内容:
- 式の定義
- 式の操作
- 事例と入出力
- 練習問題
式の定義
ここで(あくまで「ここで」)考える式は、次の構成素から組み立てられるものに限る。
- 非負整数の定数。2, 10, 125, 0 など。
- 整数を表す変数。変数の文字(名前)は何を使ってもよい(自由)。
- 足し算記号 + と掛け算記号 × 。
- 符号の反転を表すマイナス - 。
- 演算の優先順を示す括弧。丸括弧のみ。
次の注意事項がある。
- 負の整数は、単一の基本記号ではなく、正整数と負号(マイナス記号)を組み合わせた複合記号として表す。
- 引き算は使えない。x - y ではなくて x + -y とする。
- x + y + z のような書き方は曖昧とみなして許さない。(x + y) + z か x + (y + z) のどちらかを使う。
- 掛け算の記号×は省略してよい。x×y は xy と書いてよい。しかし xyz は曖昧なので許さない。(xy)z か x(yz) とする。
- 累乗の記法を使ってよい。yy は y2 と書いてよい。しかし、y3 は使えない。y2y か yy2 とする。
- 「足し算より掛け算を優先する」というルールは使ってよい。xy + zw は (x×y) + (z×w) と解釈される。
- 掛け算と負号〈マイナス記号〉の優先順位は決めてないので、-xy は曖昧である。(-x)y または -(xy) と書く。
当然ながら、上記のルールはここだけのローカルなものである。
式の操作
前節で定義した式に対して、以下に述べるような操作を考える。操作の説明とともに、横棒記法も説明する。A, B などは式を表す文字(「メタ変数」と呼んだりする)。
足し算(和) sum
A, B が2つの式のとき、AとBを足し算した式を作る操作を sum と書く。
例:操作の前(2つの式を横に並べている)
(2x + -z) + 10 a + (2b + -1)
これらの式に対して、sum を行う。
例:操作の後
((2x + -z) + 10) + (a + (2b + -1))
これを、横棒記法を用いて、次のように書く。
(2x + -z) + 10 a + (2b + -1) ------------------------------------ sum ((2x + -z) + 10) + (a + (2b + -1))
一般的には、
A B -------- sum A + B
式のルールを守るために、括弧を付ける必要があるかも知れない。以下、括弧の必要性をいちいち言わない。
掛け算(積) product
A, B が2つの式のとき、AとBを掛け算した式を作る操作を prod と書く。
A B -------- prod A×B
入れ替え swap
A, B が2つの式のとき、AとBの並び順を入れ替える操作を swap と書く。
A B ------ swap B A
何もしない identity
Aが式のとき、何もしないことを id と書く。
A --- id A
事例と入出力
前節で導入した操作を組み合わせることが出来る。操作の過程全体は、横棒記法の図として表現できる。
x ------ dup x x 6 + a t ------ prod ----------- prod xx (6 + a)t ------ opp ----------- id -(xx) (6 + a)t ------------------------ swap (6 + a)t -(xx) -------------------- sum (6 + a)t + -(xx)
横棒記法の図の最上段を左から右に見て、出現した式を並べた列をここでは(その図の)入力列〈input sequence | input list〉と呼ぶ。同様に、図の最下段を左から右に見て、出現した式を並べた列を出力列〈output sequence | output list〉と呼ぶ。
上の事例では:
- 入力列: x, 6 + a, t
- 出力列: (6 + a)t + -(xx) (列とは言っても式がひとつだけ)
ある入力列からある出力例が得られたことを、ここだけの臨時の記法だが、
- 入力列 |→| 出力列
と書くことにする。上の事例なら、
- x, 6 + a, t |→| (6 + a)t + -(xx)
先に入出力が指定されて、そのような入出力となる図を描くことができる。例えば、
- x, y |→| y2 + x2
に対して、入力列/出力列がこのようになる横棒記法の図は:
x y ----- dup ----- dup x x y y ------ prod ------ prod xx yy --------------- swap yy xx ---------- sum yy + xx
練習問題
次のような入力列/出力列を持つような横棒記法の図を描け。
- x |→| x + -x
- x, y, 2 |→| (x2 + 2(xy)) + y2
- a, b, c |→| (a + b) + c
- a, b, c |→| a + (b + c)
- c, b, a |→| ((a + b) + c)(a + (b + c))
- s, 2 |→| (2s2 + -(2s)) + -2
- y, x |→| x + y, x + -y
- s, t, 2 |→| (2s2 + -(2s)) + -2, (2t2 + -(2t)) + -2
- 概念や書き方に慣れるために、幾つか(必要なだけ)同様な作業を行え。
[追記]
練習問題の6と8を修正:
- 練習問題の6
- 誤: 2s2 + -(2s) + -2
- 正: (2s2 + -(2s)) + -2
- 練習問題の9
- 誤: 2s2 + -(2s) + -2, 2t2 + -(2t) + -2
- 正: (2s2 + -(2s)) + -2, (2t2 + -(2t)) + -2
[/追記]
さらに、ノード・ワイヤー図とテキスト表現も練習する。
- 上の問題で出来た横棒記法の図を、ノード・ワイヤー図として描け。ノードラベルは操作(sum, dup など)、ワイヤーラベルは式である。ラベルは省略せずに記入する。
- 前問のノード・ワイヤー図を、すべての描画方向(↑→, ↑←, ↓→, ↓←, →↑, →↓, ←↑, ←↓)で描いてみよ。
- 前問のノード・ワイヤー図をテキスト記法で表現せよ。例えば、x, y |→| y2 + x2 の事例なら、(dupdup);(prodprod);swap;sum となる。
- もし可能なら、自分以外の人に入力列と前問のテキスト表現だけを見せて、出力列に至る過程を再現できるか確認せよ。
- 同じ入出力となる図は一通りではない。違った図も考えよ。
- 概念や書き方に慣れるために、幾つか(必要なだけ)同様な作業を行え。