induction
这一题如果直接写,非常麻烦
正确的做法
先证明
经验总结:
在遇到可重用的关键模块时,分离之。
关于 nat plus 熟练证明交换律、分配律、结合律、零加定律
常用规律
零加定律( n+0=n )( 0+n=n 是定义)
加法分配律
变种
加法交换律
加法结合律
其他
单射性
下面和加法类似,不表
零乘定律
乘法交换律
乘法分配律
乘法结合律
在证明过程中,如果碰到特别困难的式子,可以用 assert 提出假设,或者提前写好 Theorem 再证明
list( 主要考对 induction , fixpoint 以及各种操作的的定义 )
对 list 的操作(构造子 cons )
定义 list
nat :: list
list ++ list
repeat
长度
append
append 的性质
结合律 assoc
append length
取头
取尾
左为多态版本
去除 0
[![AcomG+yzEuAxAAAAAElFTkSuQmCC][18]][18]
提取奇数
[![D2Bf+MSt4S+fAAAAAElFTkSuQmCC][19]][19]
奇数个数
[![x+JXEcIKR8ymgAAAABJRU5ErkJggg==][20]][20]
法一:递归重新定义
法二:先求奇数数组,再计算新数组长度
提取奇数位(参考 alternative )
两个 list 交替插入
将两个列表交织成一个,在从第一个列表中抽取的元素和从第二个列表中抽取的元素之间交替进行。
递归,列表 ++ 列表
[![ukAAAAASUVORK5CYII=][21]][21]
删除某个元素
[![tV+6yae+i1eLT0h7nqmV3dz+k9Ni7d67bu98v7POF+uX+31bpL7OdysnAIAADXUW4wGIhBzrKOC4X7YgQAAGBDrKx8BgAAcIkQzwAAIAsQzwAAIAsQzwAAIAsQzwAAIAsQzwAAIAsQzwAAIAsQzwAAIAsQzwAAIAsQzwAAIAsQzwAAIAsQzwAAIAsQzwAAIAsQzwAAYPMR8v8B2i5kPaA1M9gAAAAASUVORK5CYII=][22]][22]
倒置
[![wcvlExmL2jM8AAAAABJRU5ErkJggg==][23]][23]
倒置的性质
倒置 l++[n]
双重倒置
排序( homework07- sort )
Fixpoint insert (i : nat) (l : list nat) :=
match l with
| nil => i::nil
| h::t => if i <=? h
then i::h::t
else h::insert i t
end.
Fixpoint sort (l : list nat) :=
match l with
| nil => nil
| h::t => insert h (sort t)
end.
【coq】函数语言设计 练习题induction&lists 总结
最新推荐文章于 2023-02-09 01:07:08 发布