Go to the first, previous, next, last section, table of contents.


書替え 練習問題 4 解答「整数の数列」

これが問題前半の解となる規則群の一式です。

[ seq(n, c) := seq(n/2,  c+1) :: n%2 = 0,
  seq(n, c) := seq(3n+1, c+1) :: n%2 = 1 :: n > 1 ]

与えられた初期の式 `seq(6, 0)' に対してこれらの規則群を適用すると、 下記の順に式を生成します。

seq( 3, 1)
seq(10, 2)
seq( 5, 3)
seq(16, 4)
seq( 8, 5)
seq( 4, 6)
seq( 2, 7)
seq( 1, 8)

どちらの規則もマッチしなくなると、書替えは終了します。
(訳注: 表示されるのは最後の式だけである。)

いくつか規則を追加して、見映え良くすることができます。

[ seq(n) := seq(n, 0),
  seq(1, c) := c,
  ... ]

これで初期値として `seq(6)' を与えると、 結果として 8 が得られるようになります。

ベクトルを返すようにする変更はとても簡単です。

[ seq(n) := seq(n, []) :: integer(n) :: n > 0,
  seq(1, v) := v | 1,
  seq(n, v) := seq(n/2,  v | n) :: n%2 = 0,
  seq(n, v) := seq(3n+1, v | n) :: n%2 = 1 ]

`seq(6)' を与えると、結果は `[6, 3, 10, 5, 16, 8, 4, 2, 1]' です。

最後の規則において n > 1 という安全弁はもはや必要ありません。 なぜなら n = 1 の場合はいまや別の規則で検出されるからです。 けれども、 計算を始める前に初期値が適切かどうか確認するために別の安全弁が追加されました。

確かに良い考えですが、 `seq(x, [])' 呼出しは無限ループに陥ったりしないので、 この安全弁は fib 関数の時ほど重要ではありませんが、 Calc は記号 `x' が偶数か奇数か判らないので、 どの規則も適用されずに書替えは止まります。


Go to the first, previous, next, last section, table of contents.     利用度数