|
| 1 | +From Stdlib Require Import Reals. |
| 2 | +From Stdlib Require Import ZArith. |
| 3 | +From Stdlib Require Import ZifyClasses Tify. |
| 4 | + |
| 5 | +(* Inject nat -> Z *) |
| 6 | + |
| 7 | +Instance Inj_nat_Z : InjTyp nat Z. |
| 8 | +Proof. |
| 9 | + apply (mkinj _ _ Z.of_nat (fun x => (0 <= x)%Z)). |
| 10 | + apply Nat2Z.is_nonneg. |
| 11 | +Defined. |
| 12 | +Add Tify InjTyp Inj_nat_Z. |
| 13 | + |
| 14 | +Instance Op_nat_add_Z : BinOp Nat.add. |
| 15 | +Proof. |
| 16 | + apply mkbop with (TBOp := Z.add). |
| 17 | + simpl. apply Nat2Z.inj_add. |
| 18 | +Defined. |
| 19 | +Add Tify BinOp Op_nat_add_Z. |
| 20 | + |
| 21 | +Instance Op_eq_nat_eq_Z : BinRel (@eq nat). |
| 22 | +Proof. |
| 23 | +apply mkbrel with (TR := @eq Z). |
| 24 | +simpl. split. congruence. |
| 25 | +apply Nat2Z.inj. |
| 26 | +Defined. |
| 27 | +Add Tify BinRel Op_eq_nat_eq_Z. |
| 28 | + |
| 29 | + |
| 30 | +(** Inject nat -> R *) |
| 31 | + |
| 32 | +Definition isZ (r:R) := IZR (Zfloor r) = r. |
| 33 | + |
| 34 | +Instance Inj_nat_R : InjTyp nat R. |
| 35 | +Proof. |
| 36 | + apply (mkinj _ _ INR (fun r => isZ r /\ 0 <= r)). |
| 37 | + - intros. split. unfold isZ. |
| 38 | + rewrite INR_IZR_INZ. |
| 39 | + rewrite ZfloorZ. reflexivity. |
| 40 | + apply pos_INR. |
| 41 | +Defined. |
| 42 | +Add Tify InjTyp Inj_nat_R. |
| 43 | + |
| 44 | +Instance Op_add_R : BinOp Nat.add. |
| 45 | +Proof. |
| 46 | + apply mkbop with (TBOp := Rplus). |
| 47 | + simpl. intros. apply plus_INR. |
| 48 | +Defined. |
| 49 | +Add Tify BinOp Op_add_R. |
| 50 | + |
| 51 | +Instance Op_eq_nat_eq_R : BinRel (@eq nat). |
| 52 | +Proof. |
| 53 | +apply mkbrel with (TR := @eq R). |
| 54 | +simpl. split; intro. congruence. |
| 55 | +apply INR_eq; auto. |
| 56 | +Defined. |
| 57 | +Add Tify BinRel Op_eq_nat_eq_R. |
| 58 | + |
| 59 | + |
| 60 | +(* tify selects the right injection *) |
| 61 | + |
| 62 | +Goal forall (x y:nat), (x + y = y + x)%nat. |
| 63 | +Proof. |
| 64 | + intros. |
| 65 | + tify R. |
| 66 | + apply Rplus_comm. |
| 67 | +Qed. |
| 68 | + |
| 69 | +Goal forall (x y:nat), (x + y = y + x)%nat. |
| 70 | +Proof. |
| 71 | + intros. |
| 72 | + tify Z. |
| 73 | + apply Zplus_comm. |
| 74 | +Qed. |
| 75 | + |
| 76 | +(* The R instances do not break lia. *) |
| 77 | +From Stdlib Require Import Lia. |
| 78 | +Goal forall (x y:nat), (x + y = y + x)%nat. |
| 79 | +Proof. |
| 80 | + intros. |
| 81 | + lia. |
| 82 | +Qed. |
0 commit comments