[英]Computing the subsets of natural numbers in AGDA
我正在使用AGDA做一些經典的數學證明。 我想證明一組基數n的子集數量等於2 ^ n(即pow(2,n))。 為此,我的策略如下:
1)編寫一個函數sub n,給定每個自然數,它返回一個小於或等於n的自然數所有可能子集的列表。
2)編寫兩個函數“ length”和“ pow”,分別計算列表的長度和2 ^ n
3)將這三個函數放在一起以證明該陳述。
但是,我在解決點1時遇到了麻煩。 我的想法是使函數返回類型為“ list Nat”的列表,但是實現遞歸時遇到了一些問題。 基本上,我對歸納步驟的想法是將“ n”的每個子集與兩個新的子集相關聯:其本身和通過添加“ n + 1”而獲得的子集。
您認為這是有效的策略嗎? 而且,如何解決第1點的麻煩? 謝謝
順便說一句,我已經使用我提出的策略解決了我的問題。 為了定義計算子集數量的函數,我使用了標准映射函數和附加的輔助函數添加到列表:
add-to-list : ℕ → List ℕ → List ℕ
add-to-list n x = n ∷ x
subℕ : ℕ → List ( List ℕ )
subℕ zero = [ 0 ] ∷ []
subℕ (suc x) = subℕ x ++ ( map ( add-to-list x ) ( subℕ x ) )
然后,我證明以下兩個基本引理:
l-aux : ∀ {A : Set } { x y : List A } → ( length ( x ++ y ) )≡( ( length x ) + ( length y ))
l-aux {A} {[]} {y} = refl
l-aux {A} {x ∷ x₁} {y} rewrite l-aux {A} { x₁} {y} = refl
l-aux-1 : ∀ {A : Set } { x : List A } { f : A → A } → ( length ( map f x ) ) ≡ ( length x )
l-aux-1 {A} {[]} {f} = refl
l-aux-1 {A} {x ∷ x₁} {f} rewrite l-aux-1 {A} { x₁} {f} = refl
證明被簡化為基本遞歸:
number-of-subsets : ∀ ( n : ℕ ) → ( length ( subℕ n ) ) ≡ ( pow 2 n )
number-of-subsets zero = refl
number-of-subsets (suc n ) rewrite l-aux {List ℕ} {subℕ n} { map ( add-to-list n ) (subℕ n)} | l-aux-1 {List ℕ} {subℕ n} {add-to-list n } | number-of-subsets n | +0 (pow 2 n ) = refl
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.