-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path1-Addition.agda
More file actions
75 lines (66 loc) · 1.95 KB
/
Copy path1-Addition.agda
File metadata and controls
75 lines (66 loc) · 1.95 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import Relation.Binary.PropositionalEquality as Eq
open Eq using (_≡_; refl; cong; sym)
open Eq.≡-Reasoning using (begin_; _≡⟨⟩_; _≡⟨_⟩_; _∎)
open import Data.Nat using (ℕ; zero; suc)
_+_ : ℕ → ℕ → ℕ
zero + n = n
suc m + n = suc (m + n)
+-suc : ∀ (m n : ℕ) → m + suc n ≡ suc (m + n)
+-suc zero n =
begin
zero + suc n
≡⟨⟩
suc n
≡⟨⟩
suc (zero + n)
∎
+-suc (suc m) n =
begin
suc m + suc n
≡⟨⟩
suc (m + suc n)
≡⟨ cong suc (+-suc m n) ⟩
suc (suc (m + n))
≡⟨⟩
suc (suc m + n)
∎
+-assoc′ : ∀ m n p -> (m + n) + p ≡ m + (n + p)
+-assoc′ zero n p = refl
+-assoc′ (suc m) n p rewrite +-assoc′ m n p = refl
+-identity′ : ∀ (n : ℕ) → n + zero ≡ n
+-identity′ zero = refl
+-identity′ (suc n) rewrite +-identity′ n = refl
+-suc′ : ∀ (m n : ℕ) → m + suc n ≡ suc (m + n)
+-suc′ zero n = refl
+-suc′ (suc m) n rewrite +-suc′ m n = refl
+-comm′ : ∀ (m n : ℕ) → m + n ≡ n + m
+-comm′ m zero rewrite +-identity′ m = refl
+-comm′ m (suc n) rewrite +-suc′ m n | +-comm′ m n = refl
+-swap′ : ∀ m n p -> m + (n + p) ≡ n + (m + p)
+-swap′ zero n p rewrite +-comm′ zero (n + p) = refl -- have no idea how it changed "(zero + (n + p)) ≡ (n + (zero + p))" to "((n + p) + 0) ≡ ((n + p) + 0)"
+-swap′ (suc m) n p rewrite +-suc′ m n | +-suc′ n (m + p) | +-swap′ m n p = refl
+-swap : ∀ m n p -> m + (n + p) ≡ n + (m + p)
+-swap zero n p =
begin
zero + (n + p)
≡⟨⟩
n + p
≡⟨⟩
n + (zero + p)
∎
+-swap (suc m) n p =
begin
suc m + (n + p)
≡⟨ +-comm′ (suc m) (n + p) ⟩
(n + p) + suc m
≡⟨ +-suc′ (n + p) m ⟩
suc ((n + p) + m)
≡⟨ cong suc (+-comm′ (n + p) m) ⟩
suc (m + (n + p))
≡⟨ cong suc (+-swap m n p) ⟩
suc (n + (m + p))
≡⟨ sym (+-suc′ n (m + p)) ⟩
(n + suc (m + p))
≡⟨⟩
n + (suc m + p)
∎