[Agda] Integer lemmata

Arseniy Alekseyev arseniy.alekseyev at gmail.com
Thu Jan 9 02:03:35 CET 2014


It looks like the -* and *- lemmata correspond to
Algebra.Props.Ring.-‿*-distribˡ and Algebra.Props.Ring.-‿*-distribʳ.

On 8 January 2014 21:51, Sergei Meshveliani <mechvel at botik.ru> wrote:
> People,
>
> this is on  Standard library lib-0.7.
>
> I need to use 15-20 trivial lemmata for  Integer,  like these:
>
>        x * (+ 0) ≡ + 0
>        x * (- y) ≡ - (x * y)
>
> For this, I use  Data.Integer.Properties.commutativeRing,
> and still write the code shown below.
>
> I suspect that I write for this too much code of my own.
> Consider, for example,  `-*' below.
> Can this be simplified? (may be, by taking something from library).
>
> Thanks,
>
> ------
> Sergei
>
>
> -------------------------------------------------------------------------------
> open import Data.Integer as Int using (ℤ; module ℤ; sign; _◃_; ∣_∣)
> open import Data.Integer.Properties as IntProp using (commutativeRing)
> ...
> natCommSemir = NatProp.commutativeSemiring
> open CommutativeSemiring natCommSemir using ()
>                                  renaming (*-comm to *comm-nat)
> intCommRing = IntProp.commutativeRing
> open CommRing' intCommRing
>                using (+-isAbelianGroup; _+_; -_; _-_; _*_; +-assoc;
>                       +-comm; *-assoc; *-comm; distrib; *-identity)
>
> open IsAbelianGroup +-isAbelianGroup using ()
>                       renaming (identity to zero; inverse to opposite)
> open ℤ
>
> +0≢+m' : ∀ {m} → + 0 ≢ + (sucN m)
> +0≢+m' ()
>
> +m≢- : {m n : ℕ} → (+ m) ≢ -[1+ n ]
> +m≢- ()
>
> 0+ : (x : ℤ) → (+ 0) + x ≡ x
> 0+ = proj₁ zero
>
> +0 : (x : ℤ) → x + (+ 0) ≡ x
> +0 = proj₂ zero
>
> x+-x : (x : ℤ) → x + (- x) ≡ (+ 0)
> x+-x = proj₂ opposite
>
> -x+x : (x : ℤ) → (- x) + x ≡ (+ 0)
> -x+x = proj₁ opposite
>
> *1 : (x : ℤ) → x * (+ 1) ≡ x
> *1 = proj₂ *-identity
>
> *0 : (x : ℤ) → x * (+ 0) ≡ + 0   -- *** where to take it from?
> *0 x =
>        ≡begin  x * (+ 0)          ≡[ PE.refl ]
>                sg ◃ (∣ x ∣ *n 0)  ≡[ PE.cong (_◃_ sg) $ Nat2.*0 ∣ x ∣ ]
>                sg ◃ 0             ≡[ PE.refl ]
>                + 0
>        ≡end
>
> 0* :  (x : ℤ) → (+ 0) * x ≡ + 0
> 0* x =  PE.trans (*-comm (+ 0) x) $ *0 x
>
> +◃ : (m : ℕ) → (Sign.+ ◃ m) ≡ + m
> +◃ 0        = PE.refl
> +◃ (sucN _) = PE.refl
>
> -◃ : (m : ℕ) → (Sign.- ◃ m) ≡ - (+ m)
> -◃ 0        = PE.refl
> -◃ (sucN _) = PE.refl
>
> +m*+n= : (m n : ℕ) → (+ m) * (+ n) ≡ + (m *n n)
> +m*+n= m n =
>              ≡begin  (+ m) * (+ n)       ≡[ PE.refl ]
>                      Sign.+ ◃ (m *n n)   ≡[ +◃ (m *n n) ]
>                      + (m *n n)
>              ≡end
> --
> -- ** where to take them?
> --
> +m*-n'= :  (m n : ℕ) →  (+ m) * -[1+ n ] ≡ - (+ (m *n sucN n))
> +m*-n'= m n =
>              ≡begin  (+ m) * -[1+ n ]        ≡[ PE.refl ]
>                      Sign.- ◃ (m *n sucN n)  ≡[ -◃ (m *n sucN n) ]
>                      - (+ (m *n sucN n))
>              ≡end
>
> negneg : (x : ℤ) → - (- x) ≡ x   -- **
> negneg (+ 0)      = PE.refl
> negneg (+ sucN _) = PE.refl
> negneg -[1+ _ ]   = PE.refl
>
>
> -* : (x y : ℤ) → (- x) * y ≡ - (x * y)
>
> -* (+ 0)      _     =  PE.refl
> -* x          (+ 0) =
>                 ≡begin (- x) * (+ 0)    ≡[ *0 (- x) ]
>                        (+ 0)            ≡[ PE.refl ]
>                        - (+ 0)          ≡[ PE.cong -_ $ PE.sym $ *0 x ]
>                               - (x * (+ 0))
>                 ≡end
> -* (+ sucN _) (+ sucN _) =  PE.refl
> -* (+ sucN _) -[1+ _ ]   =  PE.refl
> -* -[1+ _ ]   (+ sucN _) =  PE.refl
> -* -[1+ _ ]   -[1+ _ ]   =  PE.refl
>
>
> *- : (x y : ℤ) → x * (- y) ≡ - (x * y)
> *- x y =
>          ≡begin  x * (- y)    ≡[ *-comm x (- y) ]
>                  (- y) * x    ≡[ -* y x ]
>                  - (y * x)    ≡[ PE.cong -_ $ *-comm y x ]
>                  - (x * y)
>          ≡end
>
> -*- : (x y : ℤ) → (- x) * (- y) ≡ x * y
> -*- x y =
>           ≡begin  (- x) * (- y)   ≡[ -* x (- y) ]
>                   - (x * (- y))   ≡[ PE.cong -_ $ *- x y ]
>                   - (- (x * y))   ≡[ negneg _ ]
>                   x * y
>           ≡end
>
>
> _______________________________________________
> Agda mailing list
> Agda at lists.chalmers.se
> https://lists.chalmers.se/mailman/listinfo/agda


More information about the Agda mailing list