読者です 読者をやめる 読者になる 読者になる

ポーランド記法

前回の余弦定理 a^2 =  b^2 + c^2 - 2bc\cos AをAPL/J言語で表記しようとしていて、HP電卓逆ポーランド記法やLips(Scheme)のポーランド記法だったらどうするのだろうとか、なぜHP電卓やLips(Scheme)では問題ないのにAPL/J言語でつまずいているのかとか、思いついたので考察します。


余弦定理ではややこしそうなので、次の式で考えます。
 1 + 2 - 3 \times 4 \div 5 = 0.6


HP電卓逆ポーランド記法で電卓をたたくときはつぎのような感じで頭が働きます。
まず、1と2をスタック入れて足す。そのあと3と4を掛けたものを5で割ったものを引く。
1 2 + 3 4 * 5 / -
画面上は(1 2 +)で一旦3が表示され、(3 4 *)で12が表示され、(5 /)で2.4が表示され、最後に(-)を入れると3から2.4が引かれて、0.6が表示されます。
むむぅ、美しいな。どこにもムダがない。


さて、ポーランド記法の方ですが、こちらはあまり自信がない。
(- (+ 1 2) (/ (*3 4) 5))
かっこの数は合っているだろうか。


逆ポーランド記法はかっこがないのに、ポーランド記法はかっこだらけになっているのは言語のせいか?APL/J言語は右から順番に処理するという方法でかっこをなくしている? たぶん違うと思うけど少し合っている。考えてみよう。

さて、APL/J言語だとなんとそのままで正解が出てしまいました。

   1 + 2 - 3 * 4 % 5
0.6

でもこれって偶然だと思う。演算子の順序を入れ替えてみよう。

   1 % 2 + 3 - 4 * 5
_0.0666667

 1 \div 2 + 3 - 4 \times 5 = -16.5

   ((1 % 2) + 3) - 4 * 5 
_16.5

結果としてはこうなのですが、APL/J言語的にはちょっとちがうというか考える順序が違う。逆ポーランド表記のように考えるので、それをそのまま表記できないか。

   1 % 2
0.5
   3 + 1 % 2
3.5
   4 * 5
20
   (4 * 5) -~ 3 + 1 % 2
_16.5

うむ、これが近いかな。


次に、以上の考察を用いて、昨日の余弦定理の式を考え直してみます。
昨日の式は下記の通り。

   A=:30
   B=:60
   C=:90
   c=:2
   b=:%:3
   deg=: (1p1%180)&*
   deg 180
3.14159
   ((b^2) + c^2) - 2*b*c*2 o. deg A
1

この最後の式が次のようになると思います。

   b^2
3
   c^2
4
   (c^2) + b^2
7
   2*b*c*2 o.deg A
6
   (2*b*c*2 o.deg A) -~ (c^2) + b^2
1

どうでしょうか。
もとの公式の順序は残りませんが、式を読むときの頭の動きをなぞっているような感じがあってそれなりによいと思います。演算子の中で引き算と割り算は前後を逆にするためにチルダ(~)をつける必要がありますが、それ以外の演算子ではまず問題がないと思います。慣れれば逆ポーランド記法と同じように使えるかもしれません。


しばらくこれで行きたいと思います。


以上