Agda學習筆記1

Agda學習筆記1

好久沒寫博客了,詐屍一波。

說句題外話,期中有點小爆炸,開始後悔選實驗班了。要讀信科的後輩諸君,我勸你選計概A普通班拿4.0。

開學的時候老是想着多學點東西,現在:績點績點績點

快捷鍵

  • C-c C-l : 加載,把問號轉換成goal
  • C-c C-f/C-b : 在goal之間切換
  • C-c C-, : goal&context
  • C-c C-. : goal&context&type
  • C-c C-r : refine 有時可以自動填充
  • C-c C-c spilt:
    • 直接回車:補上變量
    • 輸入變量:把這個變量解釋成所有定義
  • C-c C-a : 自動填充(一般用不上)

refl

表示左右相等

Natural Number

自然數集合

data \(ℕ\) : Set where

zero : \(ℕ\)

suc : \(ℕ \rightarrow ℕ\)

即只能從這兩條推出其他的性質

解釋一個 ℕ 變量的時候就會展開成這兩個元素

operations

  1. \(\_+\_ : ℕ → ℕ → ℕ\)

    zero + n = n

    suc m + n = suc (m + n)

  2. \(\_*\_ : ℕ → ℕ → ℕ\)

    zero * n = zero

    suc m * n = n + (m * n)

  3. \(pred : ℕ → ℕ\)

    pred 0 = 0

    pred (suc n) = n

rewrite

大概是用於遞歸的一個東西,相當於把rewrite的東西帶入原式

cong

cong f : 把 f 添加到左右兩邊

例:

+0 : ∀ (y : ℕ) -> y ≡ y + zero 
+0 zero = refl
+0 (suc y) = cong suc (+0 y)

加法結合律

+assoc : ∀ (x y z : ℕ) → x + (y + z) ≡ (x + y) + z
+assoc zero y z = refl
+assoc (suc x) y z rewrite +assoc x y z = refl

就是運用suc對+的結合律

加法交換律

依舊是利用suc遞歸...

+suc : ∀ (x y : ℕ) → suc x + y ≡ x + suc y
+suc zero y = refl
+suc (suc x) y rewrite +suc x y = refl 

+comm : ∀ (x y : ℕ) → x + y ≡ y + x
+comm zero y = +0 y
+comm (suc x) y rewrite +comm x y = +suc y x

也可以用rewrite這樣寫:

+comm : ∀ (x y : ℕ) → x + y ≡ y + x
+comm zero y = +0 y
+comm (suc x) y rewrite +comm x y | +suc y x = refl

rewrite加豎線就是從左到右替換

乘法分配律

同上

*distribr : ∀ (x y z : ℕ) → (x + y) * z ≡ x * z + y * z
*distribr zero y z = refl
*distribr (suc x) y z rewrite *distribr x y z | +assoc z (x * z) (y * z) = refl

比較大小

_<_ : ℕ → ℕ → 𝔹
0 < 0 = ff
0 < (suc y) = tt
(suc x) < (suc y) = x < y
(suc x) < 0 = ff
_=ℕ_ : ℕ → ℕ → 𝔹
0 =ℕ 0 = tt
suc x =ℕ suc y = x =ℕ y
_ =ℕ _ = ff
_≤_ : ℕ → ℕ → 𝔹
x ≤ y = (x < y) || x =ℕ y
_>_ : ℕ → ℕ → 𝔹
a > b = b < a
_≥_ : ℕ → ℕ → 𝔹
a ≥ b = b ≤ a

注意相等是 _=ℕ_

衍生的一些證明

其實上面的定義不用記,反正也會忘

寫作業和考試前看看就好了

<-0 : ∀ (x : ℕ) → x < 0 ≡ false
<-0 0 = refl
<-0 (suc y) = refl
𝔹-contra : false ≡ true → ∀{ℓ} {P : Set ℓ} → P
𝔹-contra ()

<-trans : ∀ {x y z : ℕ} → x < y ≡ true → y < z ≡ true → x < z ≡ true
<-trans {x} {0} p1 p2 rewrite <-0 x = 𝔹-contra p1
<-trans {0} {suc y} {0} p1 ()
<-trans {0} {suc y} {suc z} p1 p2 = refl
<-trans {suc x} {suc y} {0} p1 ()
<-trans {suc x} {suc y} {suc z} p1 p2 = <-trans {x} {y} {z} p1 p2

其中 () 代表荒謬匹配,即出現 false==true 時就可以直接寫 (),也可以像第一條一樣,用大括號加上(必要的)參數之後用定義的 𝔹-contra(有點搞不懂原理)

=ℕ-refl : ∀ (x : ℕ) → (x =ℕ x) ≡ tt
=ℕ-refl 0 = refl
=ℕ-refl (suc x) = =ℕ-refl x

=ℕ-from-≡ : ∀ {x y : ℕ} → x ≡ y → x =ℕ y ≡ tt
=ℕ-from-≡ {x} refl = =ℕ-refl x

也可以用 refl 替換一個等式

begin-qed

一種語法,如下:

+0 : ∀ (y : ℕ) -> y ≡ y + zero 
+0 zero = refl
+0 (suc y) = 
    begin
        suc y
    ≡⟨ cong suc (+0 y) ⟩
        suc (y + zero)
    ≡⟨⟩
        suc y + zero
    ∎

<>裏的是依據,某些根據定義的依據可以不用寫(如zero+x=x)

作業題

乘法交換律

慘淡的證明:

+assoc' : ∀ (x y z : ℕ) → (x + y) + z ≡ x + (y + z)
+assoc' x y z rewrite +assoc x y z = refl

*0 : ∀ (x : ℕ) → zero ≡ x * zero
*0 zero = refl
*0 (suc x) = *0 x

*suc : (x y : ℕ) → x + x * y ≡ x * suc y 
*suc zero y = refl
*suc (suc x) y rewrite +assoc x y (x * y) | +comm x y | +assoc' y x (x * y) | *suc x y = refl

*-comm : (x y : ℕ) → x * y ≡ y * x
*-comm zero zero = refl
*-comm zero (suc y) = *-comm zero y
*-comm (suc x) y rewrite *-comm x y = *suc y x

優化:使用 sym x == y -> y == x,即把+assoc' y x (x * y) 換成 sym ( +assoc y x (x * y) )

乘法結合律

精簡的證明:

*-assoc : (x y z : ℕ) → (x * y) * z ≡ x * (y * z)
*-assoc zero y z = refl
*-assoc (suc x) y z rewrite *distribr y (x * y) z | *-assoc x y z = refl

一些比較大小

n≮n : (n : ℕ) → n < n ≡ false
n≮n zero = refl
n≮n (suc x) = n≮n x

-- problem 2.2
<-antisym : (x y : ℕ) → x < y ≡ true → y < x ≡ false
<-antisym zero (suc y) p1 = refl
<-antisym (suc x) (suc y) = <-antisym x y 


-- problem 2.3
<-trichotomy : (x y : ℕ) → x < y ∨ x =ℕ y ∨ y < x ≡ true
<-trichotomy zero zero = refl
<-trichotomy zero (suc y) = refl
<-trichotomy (suc x) zero = refl
<-trichotomy (suc x) (suc y) = <-trichotomy x y
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章