限定反復プログラム

特有の単語
必ず停止する
自然数上の全域関数を計算する
変数が負数になることはない
以下の条件を満たすプログラムのこと
while, gotoを使用しない
数式の中に使用してよいのは、変数と自然数定数のみ
普通のデクリメントは使用しない、条件付きデクリメントは使用できる
if (x!=0) x--;
変数は v1, .. ,vm
のみ
前半が入力用、後半が作業用
return文は return(v1);
という文がプログラムの最後に一つだけ存在する
変換手順

pp. 80-82
1で二項演算子を省く
こうやって見ると、単純な演算もかなり煩雑になるな

3について
ifの原子条件式を全て x > 0
の形に変換する
原子条件式は一つ一つの条件
原始条件式を &&
か ||
で結合して、条件節を作る
4のreturnについて
元のコードが以下のような場合を考える
before.cf(x) {
int a;
return (a);
a = x + 1;
...
return (a);
}
限定反復プログラムの return
は最後に一つだけしか使えないのでこう書き換える
after.cf(x) {
int a, r, e;
r = 0;
e = 0;
if(e == 0) { r = a; e = 1; }
a = x + 1;
...
return (r);
}
このコードの if
から return
までの処理は無駄に実行されてしまうが、これで良い
5について
関数をインライン展開する
これによって限定反復プログラム中には、すべての関数呼び出しが消える