def un.putv
bend-osdev-u32@0.1.0.0 · PROOF.bend:1341
import bend-osdev-u32@0.1.0.0/PROOF.bend as PROOF
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 Laws
1341
1342
1343def un.putv(n: Nat, +c: Bool, +w: Word(n)) -> {Nat.add(Word.to_nat(n, Word.shl.put(n, c, w)), U.U32Nat.dbl(n, U.U32Nat.bit(un.topc(n, c, w)))) == Nat.add(U.U32Nat.bit(c), Nat.double(Word.to_nat(n, w))) : Nat}:
1344 match n:
1345 case 0n:
1346 Equal.sym(Nat, Nat.add(U.U32Nat.bit(c), 0n), U.U32Nat.bit(c), Laws.nat_add_zero(U.U32Nat.bit(c)))
1347 case 1n+ +p:
1348 match w:
1349 case WCon{+x, +t}:
1350 Equal.trans(Nat, Nat.add(Word.to_nat(1n+p, WCon{c, Word.shl.put(p, x, t)}), Nat.double(U.U32Nat.dbl(p, U.U32Nat.bit(un.topc(p, x, t))))), Nat.add(U.U32Nat.bit(c), Nat.double(Nat.add(U.U32Nat.bit(x), Nat.double(Word.to_nat(p, t))))), Nat.add(U.U32Nat.bit(c), Nat.double(Word.to_nat(1n+p, WCon{x, t}))), Equal.trans(Nat, Nat.add(Word.to_nat(1n+p, WCon{c, Word.shl.put(p, x, t)}), Nat.double(U.U32Nat.dbl(p, U.U32Nat.bit(un.topc(p, x, t))))), Nat.add(U.U32Nat.bit(c), Nat.double(Nat.add(Word.to_nat(p, Word.shl.put(p, x, t)), U.U32Nat.dbl(p, U.U32Nat.bit(un.topc(p, x, t)))))), Nat.add(U.U32Nat.bit(c), Nat.double(Nat.add(U.U32Nat.bit(x), Nat.double(Word.to_nat(p, t))))), Equal.trans(Nat, Nat.add(Word.to_nat(1n+p, WCon{c, Word.shl.put(p, x, t)}), Nat.double(U.U32Nat.dbl(p, U.U32Nat.bit(un.topc(p, x, t))))), Nat.add(Nat.add(U.U32Nat.bit(c), Nat.double(Word.to_nat(p, Word.shl.put(p, x, t)))), Nat.double(U.U32Nat.dbl(p, U.U32Nat.bit(un.topc(p, x, t))))), Nat.add(U.U32Nat.bit(c), Nat.double(Nat.add(Word.to_nat(p, Word.shl.put(p, x, t)), U.U32Nat.dbl(p, U.U32Nat.bit(un.topc(p, x, t)))))), Equal.cong(Nat, Nat, zz => Nat.add(zz, Nat.double(U.U32Nat.dbl(p, U.U32Nat.bit(un.topc(p, x, t))))), Word.to_nat(1n+p, WCon{c, Word.shl.put(p, x, t)}), Nat.add(U.U32Nat.bit(c), Nat.double(Word.to_nat(p, Word.shl.put(p, x, t)))), un.wc(p, c, Word.shl.put(p, x, t))), ur.r5(U.U32Nat.bit(c), Word.to_nat(p, Word.shl.put(p, x, t)), p, U.U32Nat.bit(un.topc(p, x, t)))), Equal.cong(Nat, Nat, zz => Nat.add(U.U32Nat.bit(c), Nat.double(zz)), Nat.add(Word.to_nat(p, Word.shl.put(p, x, t)), U.U32Nat.dbl(p, U.U32Nat.bit(un.topc(p, x, t)))), Nat.add(U.U32Nat.bit(x), Nat.double(Word.to_nat(p, t))), un.putv(p, x, t))), Equal.cong(Nat, Nat, zz => Nat.add(U.U32Nat.bit(c), Nat.double(zz)), Nat.add(U.U32Nat.bit(x), Nat.double(Word.to_nat(p, t))), Word.to_nat(1n+p, WCon{x, t}), Equal.sym(Nat, Word.to_nat(1n+p, WCon{x, t}), Nat.add(U.U32Nat.bit(x), Nat.double(Word.to_nat(p, t))), un.wc(p, x, t))))