Algebra 如何在Agda中证明setoid中的正确标识
我想证明整数上的群属性。我发现整数的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 我想证
ℤ代码>定义为(ℕ , ℕ)编码>使得(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,
部分:ifx≡ 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₁代码>。