簡體   English   中英

阿格達冪定理

[英]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將適用於證明。

那當nsuc 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 ≡ n1 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM