繁体   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