def wv.char_sub

bend-osdev-word64@0.1.1.0 · proof_value.bend:404

import bend-osdev-word64@0.1.1.0/proof_value.bend as ProofValue
import Base
import bend-osdev-u32@0.1.0.0/u32.bend as U
import bend-osdev-u32@0.1.0.0/LAWS.bend as UL

404def wv.char_sub(+n: Nat, x: Nat, +s: Nat, +a: Nat, +b: Nat, e: {Nat.add(s, b) == Nat.add(a, wv.Q(n, x)) : Nat}, hs: {Nat.is_lt(s, wv.Q(n, 1n)) == True{} : Bool}, hb: {Nat.is_lt(b, wv.Q(n, 1n)) == True{} : Bool}) -> {x == U.U32Nat.bit(Nat.is_lt(a, b)) : Nat}:
405  match x:
406    case 0n:
407      +ea = Equal.trans(Nat, Nat.add(s, b), Nat.add(a, wv.Q(n, 0n)), a, e, Equal.trans(Nat, Nat.add(a, wv.Q(n, 0n)), Nat.add(a, 0n), a, Equal.cong(Nat, Nat, v => Nat.add(a, v), wv.Q(n, 0n), 0n, wv.q0(n)), UL.nat_add_zero(a)))
408      %ea : {0n == U.U32Nat.bit(Nat.is_lt(_, b)) : Nat}
409      %Equal.sym(Bool, Nat.is_lt(Nat.add(s, b), b), False{}, wn.not_lt_add_l(s, b)) : {0n == U.U32Nat.bit(_) : Nat}
410      {==}
411    case 1n+x1:
412      match x1:
413        case 0n:
414          +q1 = wv.Q(n, 1n)
415          +h1 = Equal.trans(Bool, Nat.is_lt(Nat.add(s, b), Nat.add(q1, b)), Nat.is_lt(s, q1), True{}, wn.lt_add_r(s, q1, b), hs)
416          +h2 = wn.lt_rw(Nat.add(s, b), Nat.add(a, q1), Nat.add(q1, b), e, h1)
417          +h3 = wn.lt_rw2(Nat.add(a, q1), Nat.add(q1, b), Nat.add(b, q1), UL.nat_add_comm(q1, b), h2)
418          +lt = Equal.trans(Bool, Nat.is_lt(a, b), Nat.is_lt(Nat.add(a, q1), Nat.add(b, q1)), True{}, Equal.sym(Bool, Nat.is_lt(Nat.add(a, q1), Nat.add(b, q1)), Nat.is_lt(a, b), wn.lt_add_r(a, b, q1)), h3)
419          %Equal.sym(Bool, Nat.is_lt(a, b), True{}, lt) : {1n == U.U32Nat.bit(_) : Nat}
420          {==}
421        case 1n+y:
422          Empty.absurd({2n+y == U.U32Nat.bit(Nat.is_lt(a, b)) : Nat}, wn.lt_irrefl(Nat.add(s, b), wn.lt_rw2(Nat.add(s, b), Nat.add(a, wv.Q(n, 2n+y)), Nat.add(s, b), Equal.sym(Nat, Nat.add(s, b), Nat.add(a, wv.Q(n, 2n+y)), e), wv.q_two(n, y, a, s, b, hs, hb))))

Uses (19)

Used by (1)