Qcert.Basic.Typing.TDBindings


Section TDBindings.


  Context {fdata:foreign_data}.
  Context {ftype:foreign_type}.
  Context {fdtyping:foreign_data_typing}.
  Context {m:brand_model}.

  Definition tdbindings := list (string×drtype).

  Definition dbindings_type (b:list (string×ddata)) (t:tdbindings)
    := Forall2 (fun xy1 xy2 ⇒
                      (fst xy1) = (fst xy2)
                  ∧ ddata_type (snd xy1) (snd xy2)) b t.

  Lemma dbindings_type_Forall_normalized c τc :
    dbindings_type c τc →
    Forall
      (fun d : string × ddata ⇒ ddata_normalized brand_relation_brands (snd d))
      c.

  Definition tdbindings_sub : tdbindings → tdbindings → Prop
      := Forall2
         (fun (xy1 : string × drtype) (xy2 : string × drtype) ⇒
            fst xy1 = fst xy2 ∧ drtype_sub (snd xy1) (snd xy2)).

  Global Instance eq_and_drtype_pre : PreOrder
                                        (fun xy1 xy2 : string × drtype ⇒ fst xy1 = fst xy2 ∧ drtype_sub (snd xy1) (snd xy2)).

  Global Instance tdbindings_sub_pre : PreOrder tdbindings_sub.

  Global Instance tdbindings_sub_part : PartialOrder eq tdbindings_sub.

  Global Instance tdbindings_type_sub :
    Proper (eq ==> tdbindings_sub ==> impl) dbindings_type.

  Section unlocalize.
    Definition unlocalize_tdbindings (binds:tdbindings) : tbindings :=
      map (fun xy ⇒ ((fst xy), unlocalize_drtype (snd xy))) binds.
  End unlocalize.

  Section vdbindings.

    Definition dt_to_v (bind:string × drtype) : string × dlocalization :=
      match snd bind with
      | Tlocal _ ⇒ (fst bind, Vlocal)
      | Tdistr _ ⇒ (fst bind, Vdistr)
      end.

    Definition vdbindings_of_tdbindings (binds:tdbindings) : vdbindings :=
      map dt_to_v binds.

    Definition v_and_t_to_dt_opt (v:dlocalization) (t:rtype) : option drtype :=
      match v with
      | Vlocal ⇒ Some (Tlocal t)
      | Vdistr ⇒ lift Tdistr (tuncoll t)
      end.

    Definition v_and_t_to_dt (v:dlocalization) (t:rtype) : drtype :=
      match v with
      | Vlocal ⇒ Tlocal t
      | Vdistr ⇒ Tdistr t
      end.

  End vdbindings.

End TDBindings.