def shl_adc
bend-collections-laws-math@1.0.0.0 · proofs/lib/u32alg.bend:246
import bend-collections-laws-math@1.0.0.0/proofs/lib/u32alg.bend as U32alg
import Base
246
247def shl_adc(+n: Nat, +w: Word(n), +c: Bool) -> {Word.shl.put(n, c, w) == Word.adc(n, w, w, False{}, c) : Word(n)}:
248 match n:
249 case 0n:
250 match w:
251 case WNil{}:
252 {==}
253 case 1n+p:
254 match w:
255 case WCon{True{}, t}:
256 match c:
257 case True{}:
258 Equal.cong(Word(p), Word(1n+p), x => WCon{True{}, x}, Word.shl.put(p, True{}, t), Word.adc(p, t, t, False{}, True{}), shl_adc(p, t, True{}))
259 case False{}:
260 Equal.cong(Word(p), Word(1n+p), x => WCon{False{}, x}, Word.shl.put(p, True{}, t), Word.adc(p, t, t, False{}, True{}), shl_adc(p, t, True{}))
261 case WCon{False{}, t}:
262 match c:
263 case True{}:
264 Equal.cong(Word(p), Word(1n+p), x => WCon{True{}, x}, Word.shl.put(p, False{}, t), Word.adc(p, t, t, False{}, False{}), shl_adc(p, t, False{}))
265 case False{}:
266 Equal.cong(Word(p), Word(1n+p), x => WCon{False{}, x}, Word.shl.put(p, False{}, t), Word.adc(p, t, t, False{}, False{}), shl_adc(p, t, False{}))