Definition Qeval_pop2 (o : Op2) : Q -> Q -> Prop :=
match o with
| OpEq =>  Qeq
| OpNEq => fun x y  => ~ x == y
| OpLe => Qle
| OpGe => fun x y => Qle y x
| OpLt => Qlt
| OpGt => fun x y => Qlt y x
end.Definition Qlt_bool (x y : Q) :=
  (Qnum x * QDen y <? Qnum y * QDen x)%Z.Definition Qeval_bop2 (o : Op2) : Q -> Q -> bool :=
  match o with
  | OpEq  => Qeq_bool
  | OpNEq => fun x y => negb (Qeq_bool x y)
  | OpLe  => Qle_bool
  | OpGe  => fun x y => Qle_bool y x
  | OpLt  => Qlt_bool
  | OpGt  => fun x y => Qlt_bool y x
  end.

(* Specifications: *)
Lemma Qlt_bool_iff : forall q1 q2, Qlt_bool q1 q2 = true <-> q1 < q2.
Lemma pop2_bop2 : forall (op : Op2) (q1 q2 : Q), is_true (Qeval_bop2 op q1 q2) <-> Qeval_pop2 op q1 q2.