Qcert.Basic.Typing.ForeignDataTyping


Section ForeignDataTyping.


  Class foreign_data_typing
        {fdata:foreign_data}
        {ftype:foreign_type}
    : Type
    := mk_foreign_data_typing {
           foreign_data_typing_has_type
             (d:foreign_data_type)
             (τ:foreign_type_type) : Prop
           ; foreign_data_typing_normalized
               {d:foreign_data_type}
               {τ:foreign_type_type} :
               foreign_data_typing_has_type d τ →
               foreign_data_normalized d
           ; foreign_data_typing_subtype
               {d:foreign_data_type}
               {τ₁ τ₂:foreign_type_type} :
               foreign_data_typing_has_type d τ₁ →
               τ₁ ≤ τ₂ →
               foreign_data_typing_has_type d τ₂
           ; foreign_data_typing_meet
               {d:foreign_data_type}
               {τ₁ τ₂:foreign_type_type} :
               foreign_data_typing_has_type d τ₁ →
               foreign_data_typing_has_type d τ₂ →
               foreign_data_typing_has_type d (τ₁ ⊓ τ₂)
           ; foreign_data_typing_infer (d:foreign_data_type)
             : option foreign_type_type
           ; foreign_data_typing_infer_normalized {d} :
               foreign_data_normalized d →
               {τ | foreign_data_typing_infer d = Some τ}
           ; foreign_data_typing_infer_correct {d τ} :
               foreign_data_typing_infer d = Some τ →
               foreign_data_typing_has_type d τ
           ; foreign_data_typing_infer_least {d τ₁ τ₂} :
               foreign_data_typing_infer d = Some τ₁ →
               foreign_data_typing_has_type d τ₂ →
               τ₁ ≤ τ₂
         }.

  Theorem foreign_data_typing_infer_complete
        {fdata:foreign_data}
        {ftype:foreign_type}
        {ftyping:foreign_data_typing}
          {d τ} :
      foreign_data_typing_has_type d τ → {τ' | foreign_data_typing_infer d = Some τ'}.

End ForeignDataTyping.