def bits.lub

bend-osdev-caps@0.1.0.0 · PROOF.bend:516

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

516def bits.lub(+n: Nat, +a: Word(n), +s: Word(n), +p: Word(n)) -> {C.CapBits.subset(n, a, p) == True{} : Bool} -> {C.CapBits.subset(n, s, p) == True{} : Bool} -> {C.CapBits.subset(n, Word.or(n, a, s), p) == True{} : Bool}:
517  match n:
518    case 0n:
519      h0 => h1 => {==}
520    case 1n+n1:
521      match a s p:
522        case WCon{True{}, +at} WCon{True{}, +st} WCon{True{}, +pt}:
523          h0 => h1 => bits.lub(n1, at, st, pt)(h0)(h1)
524        case WCon{True{}, +at} WCon{True{}, +st} WCon{False{}, +pt}:
525          h0 => h1 => bits.absurd(C.CapBits.subset(1n+n1, Word.or(1n+n1, WCon{True{}, at}, WCon{True{}, st}), WCon{False{}, pt}), h0)
526        case WCon{True{}, +at} WCon{False{}, +st} WCon{True{}, +pt}:
527          h0 => h1 => bits.lub(n1, at, st, pt)(h0)(h1)
528        case WCon{True{}, +at} WCon{False{}, +st} WCon{False{}, +pt}:
529          h0 => h1 => bits.absurd(C.CapBits.subset(1n+n1, Word.or(1n+n1, WCon{True{}, at}, WCon{False{}, st}), WCon{False{}, pt}), h0)
530        case WCon{False{}, +at} WCon{True{}, +st} WCon{True{}, +pt}:
531          h0 => h1 => bits.lub(n1, at, st, pt)(h0)(h1)
532        case WCon{False{}, +at} WCon{True{}, +st} WCon{False{}, +pt}:
533          h0 => h1 => bits.absurd(C.CapBits.subset(1n+n1, Word.or(1n+n1, WCon{False{}, at}, WCon{True{}, st}), WCon{False{}, pt}), h1)
534        case WCon{False{}, +at} WCon{False{}, +st} WCon{True{}, +pt}:
535          h0 => h1 => bits.lub(n1, at, st, pt)(h0)(h1)
536        case WCon{False{}, +at} WCon{False{}, +st} WCon{False{}, +pt}:
537          h0 => h1 => bits.lub(n1, at, st, pt)(h0)(h1)

Uses (7)

Used by (1)