Qcert.Basic.Operators.RBinaryOpsSem


Section RBinaryOpsSem.




  Definition fun_of_arithbop (op:ArithBOp) : Z Z Z
    := match op with
       | ArithPlusZ.add
       | ArithMinusZ.sub
       | ArithMultZ.mul
       | ArithMinZ.min
       | ArithMaxZ.max
       | ArithDivideZ.quot
       | ArithRemZ.rem
       end.

  Context {fdata:foreign_data}.
  Context {fbop:foreign_binary_op}.
  Context (h:brand_relation_t).

  Definition fun_of_binop (bop:binOp) : data data option data :=
    match bop with
    | ABArith op
      fun d1 d2
        match d1, d2 with
        | dnat n1, dnat n2Some (dnat (fun_of_arithbop op n1 n2))
        | _, _None
        end
    | AAndfun d1 d2unbdbool andb d1 d2
    | AOrfun d1 d2unbdbool orb d1 d2
    | AEqfun d1 d2unbdata (fun x yif data_eq_dec x y then true else false) d1 d2
    | ALtfun d1 d2unbdnat (fun x yif Z_lt_dec x y then true else false) d1 d2
    | ALefun d1 d2unbdnat (fun x yif Z_le_dec x y then true else false) d1 d2
    | AUnionfun d1 d2rondcoll2 bunion d1 d2
    | AMinusfun d1 d2rondcoll2 (@bminus data data_eq_dec) d1 d2
    | AMinfun d1 d2rondcoll2 (@bmin data data_eq_dec) d1 d2
    | AMaxfun d1 d2rondcoll2 (@bmax data data_eq_dec) d1 d2
    | AContainsfun d1 d2ondcoll (fun l
                                           if in_dec data_eq_dec d1 l
                                           then dbool true else dbool false) d2
    | ASConcatfun d1 d2unsdstring append d1 d2
    | AConcat
      fun d1 d2
        match d1, d2 with
        | (drec r1), (drec r2) ⇒ Some (drec (rec_sort (r1++r2)))
        | _, _None
        end
    | AMergeConcat
      fun d1 d2
        match d1, d2 with
        | (drec r1), (drec r2) ⇒
          match merge_bindings r1 r2 with
          | Some xSome (dcoll ((drec x) :: nil))
          | NoneSome (dcoll nil)
          end
        | _, _None
        end
    | AForeignBinaryOp fbforeign_binary_op_interp h fb
    end.

  Lemma fun_of_binop_normalized {b d1 d2 o} :
    fun_of_binop b d1 d2 = Some o
    data_normalized h d1 data_normalized h d2
    data_normalized h o.

End RBinaryOpsSem.