@[simp, grind .] theorem optimize_equiv (p : Policy) (req : Request) : evaluate (optimize p) req = evaluate p req := p:Policyreq:Requestevaluate (optimize p) req = evaluate p req p:Policyreq:RequestdenyOverrides (List.filterMap (fun rule => if rule.equivalent req = true then some rule.outcome else none) (List.filter (fun rule => rule.outcome != Decision.notApplicable) p)) = denyOverrides (List.filterMap (fun rule => if rule.equivalent req = true then some rule.outcome else none) p) induction p with req:RequestdenyOverrides (List.filterMap (fun rule => if rule.equivalent req = true then some rule.outcome else none) (List.filter (fun rule => rule.outcome != Decision.notApplicable) [])) = denyOverrides (List.filterMap (fun rule => if rule.equivalent req = true then some rule.outcome else none) []) All goals completed! 🐙 req:Requestrule:Rulerest:List Ruleih:denyOverrides (List.filterMap (fun rule => if rule.equivalent req = true then some rule.outcome else none) (List.filter (fun rule => rule.outcome != Decision.notApplicable) rest)) = denyOverrides (List.filterMap (fun rule => if rule.equivalent req = true then some rule.outcome else none) rest)denyOverrides (List.filterMap (fun rule => if rule.equivalent req = true then some rule.outcome else none) (List.filter (fun rule => rule.outcome != Decision.notApplicable) (rule :: rest))) = denyOverrides (List.filterMap (fun rule => if rule.equivalent req = true then some rule.outcome else none) (rule :: rest)) All goals completed! 🐙