def bits.root_a
bend-osdev-caps@0.1.0.0 · PROOF.bend:562
import bend-osdev-caps@0.1.0.0/PROOF.bend as PROOF
import Base
import bend-osdev-caps@0.1.0.0/caps.bend as C
562def bits.root_a(+n: Nat, +i: Word(n), +b: Word(n), +a: Word(n)) -> {C.CapBits.subset(n, a, i) == True{} : Bool} -> {Word.or(n, Word.or(n, Word.and(n, i, C.CapBits.all(n)), Word.and(n, C.CapBits.all(n), b)), a) == Word.or(n, i, b) : Word(n)}:
563 match n:
564 case 0n:
565 match i b a:
566 case WNil{} WNil{} WNil{}:
567 h0 => {==}
568 case 1n+n1:
569 match i b a:
570 case WCon{True{}, +it} WCon{True{}, +bt} WCon{True{}, +at}:
571 h0 => Equal.cong(Word(n1), Word(1n+n1), w => WCon{True{}, w}, Word.or(n1, Word.or(n1, Word.and(n1, it, C.CapBits.all(n1)), Word.and(n1, C.CapBits.all(n1), bt)), at), Word.or(n1, it, bt), bits.root_a(n1, it, bt, at)(h0))
572 case WCon{True{}, +it} WCon{True{}, +bt} WCon{False{}, +at}:
573 h0 => Equal.cong(Word(n1), Word(1n+n1), w => WCon{True{}, w}, Word.or(n1, Word.or(n1, Word.and(n1, it, C.CapBits.all(n1)), Word.and(n1, C.CapBits.all(n1), bt)), at), Word.or(n1, it, bt), bits.root_a(n1, it, bt, at)(h0))
574 case WCon{True{}, +it} WCon{False{}, +bt} WCon{True{}, +at}:
575 h0 => Equal.cong(Word(n1), Word(1n+n1), w => WCon{True{}, w}, Word.or(n1, Word.or(n1, Word.and(n1, it, C.CapBits.all(n1)), Word.and(n1, C.CapBits.all(n1), bt)), at), Word.or(n1, it, bt), bits.root_a(n1, it, bt, at)(h0))
576 case WCon{True{}, +it} WCon{False{}, +bt} WCon{False{}, +at}:
577 h0 => Equal.cong(Word(n1), Word(1n+n1), w => WCon{True{}, w}, Word.or(n1, Word.or(n1, Word.and(n1, it, C.CapBits.all(n1)), Word.and(n1, C.CapBits.all(n1), bt)), at), Word.or(n1, it, bt), bits.root_a(n1, it, bt, at)(h0))
578 case WCon{False{}, +it} WCon{True{}, +bt} WCon{True{}, +at}:
579 h0 => bits.absurd_eq(Word(1n+n1), Word.or(1n+n1, Word.or(1n+n1, Word.and(1n+n1, WCon{False{}, it}, C.CapBits.all(1n+n1)), Word.and(1n+n1, C.CapBits.all(1n+n1), WCon{True{}, bt})), WCon{True{}, at}), Word.or(1n+n1, WCon{False{}, it}, WCon{True{}, bt}), h0)
580 case WCon{False{}, +it} WCon{True{}, +bt} WCon{False{}, +at}:
581 h0 => Equal.cong(Word(n1), Word(1n+n1), w => WCon{True{}, w}, Word.or(n1, Word.or(n1, Word.and(n1, it, C.CapBits.all(n1)), Word.and(n1, C.CapBits.all(n1), bt)), at), Word.or(n1, it, bt), bits.root_a(n1, it, bt, at)(h0))
582 case WCon{False{}, +it} WCon{False{}, +bt} WCon{True{}, +at}:
583 h0 => bits.absurd_eq(Word(1n+n1), Word.or(1n+n1, Word.or(1n+n1, Word.and(1n+n1, WCon{False{}, it}, C.CapBits.all(1n+n1)), Word.and(1n+n1, C.CapBits.all(1n+n1), WCon{False{}, bt})), WCon{True{}, at}), Word.or(1n+n1, WCon{False{}, it}, WCon{False{}, bt}), h0)
584 case WCon{False{}, +it} WCon{False{}, +bt} WCon{False{}, +at}:
585 h0 => Equal.cong(Word(n1), Word(1n+n1), w => WCon{False{}, w}, Word.or(n1, Word.or(n1, Word.and(n1, it, C.CapBits.all(n1)), Word.and(n1, C.CapBits.all(n1), bt)), at), Word.or(n1, it, bt), bits.root_a(n1, it, bt, at)(h0))