/-- `deny` is the absorbing top: it wins on either side. -/ @[simp, grind =] theorem combine_deny_left (d : Decision) : combine .deny d = .deny := d:Decisioncombine Decision.deny d = Decision.deny All goals completed! 🐙 @[simp, grind =] theorem combine_deny_right (d : Decision) : combine d .deny = .deny := d:Decisioncombine d Decision.deny = Decision.deny All goals completed! 🐙 /-- `notApplicable` is the identity: silence on either side changes nothing. -/ @[simp, grind =] theorem combine_na_left (d : Decision) : combine .notApplicable d = d := d:Decisioncombine Decision.notApplicable d = d combine Decision.notApplicable Decision.permit = Decision.permitcombine Decision.notApplicable Decision.deny = Decision.denycombine Decision.notApplicable Decision.notApplicable = Decision.notApplicable combine Decision.notApplicable Decision.permit = Decision.permitcombine Decision.notApplicable Decision.deny = Decision.denycombine Decision.notApplicable Decision.notApplicable = Decision.notApplicable All goals completed! 🐙 @[simp, grind =] theorem combine_na_right (d : Decision) : combine d .notApplicable = d := d:Decisioncombine d Decision.notApplicable = d combine Decision.permit Decision.notApplicable = Decision.permitcombine Decision.deny Decision.notApplicable = Decision.denycombine Decision.notApplicable Decision.notApplicable = Decision.notApplicable combine Decision.permit Decision.notApplicable = Decision.permitcombine Decision.deny Decision.notApplicable = Decision.denycombine Decision.notApplicable Decision.notApplicable = Decision.notApplicable All goals completed! 🐙 @[simp, grind =] theorem denyOverrides_nil : denyOverrides [] = .notApplicable := rfl @[simp, grind =] theorem denyOverrides_cons (d : Decision) (rest : List Decision) : denyOverrides (d :: rest) = combine d (denyOverrides rest) := rfl @[simp, grind =] theorem denyOverrides_deny (rest : List Decision) : denyOverrides (.deny :: rest) = .deny := rest:List DecisiondenyOverrides (Decision.deny :: rest) = Decision.deny All goals completed! 🐙 /-- The headline behaviour of `notApplicable`: a silent vote at the head just disappears. This is *why* `optimize` is sound. -/ @[simp, grind =] theorem denyOverrides_na (rest : List Decision) : denyOverrides (.notApplicable :: rest) = denyOverrides rest := rest:List DecisiondenyOverrides (Decision.notApplicable :: rest) = denyOverrides rest All goals completed! 🐙