众所周之,一颗二叉树的定义是:
空的,或
一个元素,加上两颗二叉树树(一个结点)
Inductive Tree T := | Empty | Node : Tree T -> T -> Tree T -> Tree T. T可以是任何东西,比如说自然数,链表,字符串,另一个Tree等等...
那T可不可以是unit,不带有任何信息?换句话说,可不可能T的所有元素皆相等于一个常数?在此之下,Tree有没有意义?
Inductive Tree := | Empty | Node : Tree -> Tree -> Tree. 当然可以!那没,既然树没有保留任何关于元素的信息,有什么意义?
尽管树不保存元素,就如同list unit并不是毫无意义,而是跟自然数同构一样,树自身的结构已经保留了一定的信息.
那这棵树有什么特别的地方吗?他跟一个结构有着很简单的同构关系(一一映射).
跟他自己.不,跟7个他自己 .换句话说,Tree~=Tree^7.
具体证明在Seven Trees in One at Steven Landsburg ,我们今天要试着把这个用Coq证明一遍.
我们先给出一个简写:
Notation "[ a , b ]" := (Node a b). Notation "0" := Empty. 这里是把七棵树合并的定义:
Definition Combine_helper (T1 T2 T3 T4 T5 T6 T7 : Tree) : Tree := match (T1, T2, T3, T4) with | (Empty, Empty, Empty, Empty) => match T5 with | Node T5a T5b => [[[[Empty, T7], T6], T5a], T5b] | Empty => match T6 with | Node _ _ => [[[[[T6, T7], Empty], Empty], Empty], Empty] | Empty => match T7 with | [[[[T7a, T7b], T7c], T7d], T7e] => [[[[[Empty, T7a], T7b], T7c], T7d], T7e] | _ => T7 end end end | _ => [[[[[[T7, T6], T5], T4], T3], T2], T1] end....