Qcert.NRA.Optim.TNRARewrite
Section TOptim.
Context {m:basic_model}.
Lemma tand_comm {τin} (op1 op2 opl opr: τin ⇝ Bool) :
(`opl = `op2 ∧ `op1) →
(`opr = `op2 ∧ `op1) →
opl ≡τ opr.
Lemma tand_comm_arrow {τin} (op1 op2:nra) :
m ⊢ₐ τin ↦ Bool ⊧ (op1 ∧ op2) ⇒ (op2 ∧ op1).
Lemma tselect_and_aux (x: data) τin τ (op op1 op2:nra) :
op ▷ τin >=> (Coll τ) →
op1 ▷ τ >=> Bool →
op2 ▷ τ >=> Bool →
x ▹ τin →
brand_relation_brands ⊢ (σ⟨ op1 ⟩(σ⟨ op2 ⟩(op))) @ₐ x =
brand_relation_brands ⊢ (σ⟨ op2 ∧ op1 ⟩(op)) @ₐ x.
Lemma tselect_and {τin τ} (op opl opr: τin ⇝ (Coll τ)) (op1 op2:τ ⇝ Bool) :
(`opl = σ⟨ `op1 ⟩(σ⟨ `op2 ⟩(`op))) →
(`opr = σ⟨ `op2 ∧ `op1 ⟩(`op)) →
(opl ≡τ opr).
Lemma tselect_comm_nra {τin τ} (op1 op2:τ ⇝ Bool) (op opl opr: τin ⇝ (Coll τ)) :
(`opl = σ⟨ `op1 ⟩(σ⟨ `op2 ⟩(`op))) →
(`opr = σ⟨ `op2 ⟩(σ⟨ `op1 ⟩(`op))) →
opl ≡τ opr.
Lemma tselect_comm {τin τ} x (op: τin ⇝ (Coll τ)) (op1 op2:τ ⇝ Bool) :
x ▹ τin →
(brand_relation_brands ⊢ σ⟨ `op1 ⟩(σ⟨ `op2 ⟩(`op)) @ₐ x ) = (brand_relation_brands ⊢ σ⟨ `op2 ⟩(σ⟨ `op1 ⟩(`op)) @ₐ x).
Definition tunbox_bool (y:{ x:data | x ▹ Bool }) : bool.
Definition typed_nra_total_bool {τ} (op:τ ⇝ Bool):
{x:data|(x ▹ τ)} → bool.
Lemma typed_nra_total_bool_consistent {τ} (op:τ ⇝ Bool) (d: {x:data|(x ▹ τ)}) :
match (brand_relation_brands ⊢ `op@ₐ`d) with
| Some (dbool b) ⇒ Some b
| _ ⇒ None
end = Some (typed_nra_total_bool op d).
Lemma typed_nra_total_bool_consistent2 {τ} (op:τ ⇝ Bool) (x:data) (pf:(x ▹ τ)) :
match (brand_relation_brands ⊢ `op@ₐx) with
| Some (dbool b) ⇒ Some b
| _ ⇒ None
end = Some (typed_nra_total_bool op (exist _ x pf)).
Lemma typed_lifted_predicate {τ} (op:τ ⇝ Bool) (d:data):
data_type d τ →
∃ b' : bool,
(fun x' : data ⇒
match brand_relation_brands ⊢ (`op)@ₐ x' with
| Some (dbool b) ⇒ Some b
| _ ⇒ None
end) d = Some b'.
Lemma lift_filter_remove_one_false (l:list data) (f:data → option bool) (a:data) :
f a = Some false →
(lift_filter f (remove_one a l)) = lift_filter f l.
Lemma lift_filter_remove_one {τ} (l:list data) (f:data → option bool) (a:data) :
Forall (fun d : data ⇒ data_type d τ) l →
data_type a τ →
(∀ d : data, data_type d τ → ∃ b' : bool, f d = Some b') →
(lift_filter f (remove_one a l)) = lift (remove_one a) (lift_filter f l).
Lemma remove_still_well_typed {τ} (l:list data) (a:data) :
Forall (fun d : data ⇒ data_type d τ) l →
Forall (fun d : data ⇒ data_type d τ) (remove_one a l).
Lemma lift_filter_over_bminus {τ} (l1 l2 : list data) (f:data → option bool):
Forall (fun d : data ⇒ data_type d τ) l1 →
Forall (fun d : data ⇒ data_type d τ) l2 →
Forall (fun d : data ⇒ data_type d τ) (bminus l1 l2) →
(∀ d : data, data_type d τ → ∃ b' : bool, f d = Some b') →
lift dcoll (lift_filter f (bminus l1 l2)) =
match lift dcoll (lift_filter f l1) with
| Some d1 ⇒
match lift dcoll (lift_filter f l2) with
| Some d2 ⇒ rondcoll2 bminus d1 d2
| None ⇒ None
end
| None ⇒ None
end.
Lemma minus_select_distr {τin τ} (op:τ ⇝ Bool) (op1 op2 opl opr: τin ⇝ (Coll τ)) :
(`opl = σ⟨`op⟩(`op1 − `op2)) →
(`opr = σ⟨`op⟩(`op1) − σ⟨`op⟩(`op2)) →
opl ≡τ opr.
End TOptim.