Qcert.Basic.Data.RDataNorm
Section RDataNorm.
Context {fdata:foreign_data}.
Context (h:brand_relation_t).
Fixpoint normalize_data (d:data) : data :=
match d with
| drec rl ⇒
drec (rec_sort (map (fun x ⇒ (fst x, normalize_data (snd x))) rl))
| dcoll l ⇒ dcoll (map normalize_data l)
| dleft l ⇒ dleft (normalize_data l)
| dright l ⇒ dright (normalize_data l)
| dbrand b d ⇒ dbrand (canon_brands h b) (normalize_data d)
| dforeign fd ⇒ dforeign (foreign_data_normalize fd)
| _ ⇒ d
end.
Inductive data_normalized : data → Prop :=
| dnunit :
data_normalized dunit
| dnnat n :
data_normalized (dnat n)
| dnbool b :
data_normalized (dbool b)
| dnstring s :
data_normalized (dstring s)
| dncoll dl :
Forall (fun x ⇒ data_normalized x) dl → data_normalized (dcoll dl)
| dnrec dl :
Forall (fun d ⇒ data_normalized (snd d)) dl →
(is_list_sorted ODT_lt_dec (domain dl) = true) →
data_normalized (drec dl)
| dnleft l :
data_normalized l →
data_normalized (dleft l)
| dnright r :
data_normalized r →
data_normalized (dright r)
| dnbrand b d :
is_canon_brands h b →
data_normalized d →
data_normalized (dbrand b d)
| dnforeign fd :
foreign_data_normalized fd →
data_normalized (dforeign fd).
Theorem normalize_normalizes :
∀ (d:data), data_normalized (normalize_data d).
Theorem normalize_normalized_eq {d}:
data_normalized d →
normalize_data d = d.
Lemma map_normalize_normalized_eq c :
Forall (fun x ⇒ data_normalized (snd x)) c →
(map
(fun x0 : string × data ⇒ (fst x0, normalize_data (snd x0)))
c) = c.
Corollary normalize_idem d :
normalize_data (normalize_data d) = normalize_data d.
Corollary normalize_data_eq_normalized {d} :
normalize_data d = d → data_normalized d.
Theorem normalized_data_dec d : {data_normalized d} + {¬ data_normalized d}.
Lemma data_normalized_dcoll a l :
(data_normalized a ∧ data_normalized (dcoll l)) ↔
data_normalized (dcoll (a :: l)).
Lemma data_normalized_rec_sort_app l1 l2 :
data_normalized (drec l1) →
data_normalized (drec l2) →
data_normalized (drec (rec_sort (l1 ++ l2))).
Lemma data_normalized_rec_concat_sort l1 l2 :
data_normalized (drec l1) →
data_normalized (drec l2) →
data_normalized (drec (rec_concat_sort l1 l2)).
Lemma data_normalized_dcoll_in x l :
In x l →
data_normalized (dcoll l) →
data_normalized x.
Lemma dnrec_nil : data_normalized (drec nil).
Lemma dnrec_sort c :
Forall (fun d : string × data ⇒ data_normalized (snd d)) c →
data_normalized (drec (rec_sort c)).
End RDataNorm.