Algebra 如何在Agda中证明setoid中的正确标识

Algebra 如何在Agda中证明setoid中的正确标识,algebra,agda,integer-arithmetic,Algebra,Agda,Integer Arithmetic,我想证明整数上的群属性。我发现整数的setoid表示使证明变得容易 ℤ定义为(ℕ , ℕ)使得(a,b)表示a-b zero : ℤ zero = 0 , 0 我已经证明了 leftIdZ : (a : ℤ) → zero + a ≡ a rightIdZ : (a : ℤ) → a + zero ≡ a zpre和zsuc定义为 zsuc : ℤ → ℤ zsuc (m , n) = suc m , n zpre : ℤ → ℤ zpre (m , n) = m , suc n 我想证

我想证明整数上的群属性。我发现整数的setoid表示使证明变得容易

定义为
(ℕ , ℕ)使得
(a,b)
表示
a-b

zero : ℤ
zero = 0 , 0
我已经证明了

leftIdZ : (a : ℤ) → zero + a ≡ a
rightIdZ : (a : ℤ) → a + zero ≡ a
zpre
zsuc
定义为

zsuc : ℤ → ℤ
zsuc (m , n) = suc m , n

zpre : ℤ → ℤ
zpre (m , n) = m , suc n
我想证明加法的交换性:

commZ-+ : (a b : ℤ) → a + b ≡ b + a
commZ-+ (ℕ.zero , ℕ.zero) b = sym (trans (rightIdZ b) (sym (leftIdZ b)))
commZ-+ (ℕ.zero , suc x₁) (ℕ.zero , ℕ.zero) = rightIdZ (ℕ.zero , suc x₁)
commZ-+ (ℕ.zero , suc x₁) (ℕ.zero , suc x₃) = cong zpre {!!}
commZ-+ (ℕ.zero , suc x₁) (suc x₂ , x₃) = cong zsuc {!!}
commZ-+ (suc x , x₁) (x₂ , x₃) = {!!}
我在某个地方发现他们正在使用agda库来证明这一点,但我尝试了这种方法(如上)

问题归结为证明
0,(x₁ ℕ.+ 苏克x₃) ≡ 0,(x₃ ℕ.+ 苏克x₁)

我有这个引理的证明:
lemma-+succ:∀ a b→ suc a+b≡ a+suc b
我知道如何使用这个引理来证明上述简化目标,但它的返回类型是
Set
,而上述引理是期望整数


有什么有效的方法吗?或者我应该如何做?请帮助。

您的问题描述可以简化为在以下代码中定义
问题

open import Data.Product
open import Data.Nat as ℕ
open import Relation.Binary.PropositionalEquality

postulate lemma-+succ : ∀ a b → suc a ℕ.+ b ≡ a ℕ.+ suc b

problem : ∀ x₁ x₃ → 0 ,′ (x₁ ℕ.+ suc x₃) ≡ 0 ,′ (x₃ ℕ.+ suc x₁)
problem = ?
首先,让我们去掉
0,
部分:if
x≡ y
,然后
0,x≡ 0,y
通过简单同余:

problem : ∀ x₁ x₃ → 0 ,′ (x₁ ℕ.+ suc x₃) ≡ 0 ,′ (x₃ ℕ.+ suc x₁)
problem x₁ x₃ = cong (λ y → 0 , y) ?
这就给我们留下了自然加法的交换性:空穴的类型是
x₁ + 苏克x₃ ≡ x₃ + 苏克x₁


这应该给你足够的提示来完成你想要做的事情:
lemma-+succ
不直接适用;你能证明
lemma-+comm:∀ a b→ A.ℕ.+ B≡ Bℕ.+ a

现在我得到了,如果任意边相等,我可以使用lambda表达式来减少它。但如果我们不能减少它,例如。
x₂ , (十)₁ ℕ.+ 0) ≡ (十)₂ ℕ.+ 0),x₁.这里我有每个部分的单独证明,但我不能在这里使用cong。所以你已经看过了,但没有找到它旁边的正确位置?而且,即使
cong₂不存在,您可以使用
trans
itivity从
x转到₂ , (十)₁ ℕ.+ 0)
x₂ , x₁
(x₂ ℕ.+ 0),x₁