簡體   English   中英

計算AGDA中自然數的子集

[英]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.

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