*   reverseはmonotonicな関数
*   reverseの実行には|r|ステップかかる
*   |r|ステップ = 借金
*   最も外側にあるreverse suspは|f|回のtailの後にforce
*   |r| =~ |f| の時reverseして、
*   オペレーション毎に借金を1つ返済するなら、
*   reverseをforceするまでにその借金を返済すれば良い
let q0 = (m, f, m, r)
let q1 = tail q0 # <= f ++ reverse r -- |r|借金
let q2 = tail q1
let q3 = tail q2
...
let qm = tail qm-1 # <= force (reverse r) -- 返済期限

ここの時任意のkで分岐が発生したとするとqkからqmまで
分岐先でも二重に実行されることになる。
let q0 = (m, f, m, r)
let q0' = q0
let q1 = tail q0 # <= f ++ reverse r -- |r|借金
...
let qm = tail qm-1 # <= force (reverse r) -- 返済期限

let q1' = tail q0' # <= f ++ reverse r -- |r|借金
...
let qm' = tail qm-1' # <= force (reverse r) -- 返済期限
d(i) = fのi番目の要素における借金
D(i) = 0からiまでのd(j)を足しこんだもの

さらに↓を不変条件とする

D(i) <= min(2i, |f| - |r|)
readpfds_6.3.2
readpfds_6.3.2
readpfds_6.3.2

readpfds_6.3.2

  • 4.
    * reverseはmonotonicな関数 * reverseの実行には|r|ステップかかる * |r|ステップ = 借金 * 最も外側にあるreverse suspは|f|回のtailの後にforce * |r| =~ |f| の時reverseして、 * オペレーション毎に借金を1つ返済するなら、 * reverseをforceするまでにその借金を返済すれば良い
  • 5.
    let q0 =(m, f, m, r) let q1 = tail q0 # <= f ++ reverse r -- |r|借金 let q2 = tail q1 let q3 = tail q2 ... let qm = tail qm-1 # <= force (reverse r) -- 返済期限 ここの時任意のkで分岐が発生したとするとqkからqmまで 分岐先でも二重に実行されることになる。
  • 7.
    let q0 =(m, f, m, r) let q0' = q0 let q1 = tail q0 # <= f ++ reverse r -- |r|借金 ... let qm = tail qm-1 # <= force (reverse r) -- 返済期限 let q1' = tail q0' # <= f ++ reverse r -- |r|借金 ... let qm' = tail qm-1' # <= force (reverse r) -- 返済期限
  • 9.
    d(i) = fのi番目の要素における借金 D(i)= 0からiまでのd(j)を足しこんだもの さらに↓を不変条件とする D(i) <= min(2i, |f| - |r|)