[英]Agda Theorems for Powers
我正在嘗試證明以下內容:
1-pow : ∀ {n : ℕ} → 1 pow n ≡ 1
1-pow {zero} = refl
1-pow {suc x} = {!!}
我是Adga的新手,甚至都不知道從哪里開始。 有什么建議或指導嗎? 顯然很容易在紙上證明,但我不確定該告訴阿格達什么。
我將pow函數定義如下:
_pow_ : ℕ → ℕ → ℕ
x pow zero = 1
x pow (suc zero) = x
x pow (suc y) = x * (x pow y)
當您在1-pow
中對n
進行模式匹配並發現其zero
,Agda將查看_pow_
的定義,並檢查其中一個功能子句是否匹配。 第一個這樣做,因此它將應用該定義,並且1 pow zero
變為1
。 1
顯然等於1
,所以refl
將適用於證明。
那當n
是suc x
時又如何呢? 這里的問題:阿格達不能承諾第二條(因為x
可能是zero
),也不是第三個子句(因為x
可能是suc y
一些y
)。 因此,您必須進一步確保Agda應用_pow_
的定義:
1-pow : ∀ {n : ℕ} → 1 pow n ≡ 1
1-pow {zero} = refl
1-pow {suc zero} = {!!}
1-pow {suc (suc x)} = {!!}
讓我們檢查一下第一個孔的類型。 阿格達(Agda)告訴我們1 ≡ 1
,所以我們可以再次使用refl
。 最后一個有點棘手,我們應該產生類型1 * 1 pow (suc x) ≡ 1
。 假設您正在使用_*_
的標准定義(即,左側參數上的遞歸和左側的重復加法,例如標准庫中的一個),則應減小為1 pow (suc x) + 0 ≡ 1
。 歸納假設(即,對suc x
施加1-pow
)告訴我們1 pow (suc x) ≡ 1
。
所以我們幾乎到了,但是我們不知道n + 0 ≡ n
(這是因為加法是通過對左參數的遞歸定義的,因此我們無法簡化該表達式)。 一種選擇是證明這一事實,我留作練習。 不過,這里有個提示:您可能會發現此功能很有用。
cong : ∀ {a b} {A : Set a} {B : Set b}
(f : A → B) {x y} → x ≡ y → f x ≡ f y
cong f refl = refl
它已經是Relation.Binary.PropositionalEquality
模塊的一部分,因此您無需自己定義它。
因此,回顧一下:我們知道n + 0 ≡ n
和1 pow (suc x) ≡ 1
,我們需要1 pow (suc x) + 0 ≡ 1
。 這兩個事實非常吻合-相等是可傳遞的,因此我們應該能夠將1 pow (suc x) + 0 ≡ 1 pow (suc x)
和1 pow (suc x) ≡ 1
合並為一個證明,實際上,是這樣的:
1-pow {suc (suc x)} = trans (+0 (1 pow suc x)) (1-pow {suc x})
就是這樣!
讓我提及其他一些方法。
整個證明也可以使用證明1 * x ≡ x
來完成,盡管這與我們之前所做的幾乎沒有什么不同。
您可以將_pow_
簡化為:
_pow_ : ℕ → ℕ → ℕ
x pow zero = 1
x pow (suc y) = x * (x pow y)
使用起來稍微方便些。 證明將進行相應的更改(即,它將沒有原始證明的第二子句)。
最后,您可以執行以下操作:
1-pow : ∀ {n : ℕ} → 1 pow n ≡ 1
1-pow {zero} = refl
1-pow {suc zero} = refl
1-pow {suc (suc x)} = cong (λ x → x + 0) (1-pow {suc x})
嘗試找出原因。 如果您有任何問題,請在評論中讓我知道,我們將為您提供幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.