【发布时间】:2019-03-29 17:44:58
【问题描述】:
根据一些定理,我们知道类型A 等于类型B。在类型检查期间如何告诉 Coq 编译器?
我想实现一个非空树,这样每个节点都知道它的大小:
Inductive Struct: positive -> Type :=
| Leaf : Struct 1%positive
| Inner: forall {n m}, Struct n -> Struct m -> Struct (n + m).
我想创建一个函数来生成一个给定大小的对数深度的树。例如
7 -> 6 + 1 -> (3 + 3) + 1 -> ((2 + 1) + (2 + 1)) + 1 -> (((1 + 1) + 1) + ((1 + 1) + 1)) + 1
Fixpoint nat2struct n : (Struct n) :=
match n with
| xH => Leaf
| xO n => Inner (nat2struct n) (nat2struct n)
| xI n => Inner Leaf (Inner (nat2struct n) (nat2struct n))
end.
但是,我得到了错误:
术语“Inner Leaf (Inner (nat2struct n0) (nat2struct n0))”的类型为“Struct (1 + (n0 + n0))”,而预期的类型为“Struct n0~1”。
我该如何解决这个问题?我们知道(1 + n + n) = xI n,但 Coq 不知道。如果我之前陈述过这个定理,它不会改变任何东西:
Theorem nBy2p1: forall n, Pos.add 1%positive (n + n) = xI n. Proof. Admitted.
Hint Resolve nBy2p1.
是否有一些提示可以让 Coq 了解这个定理?
PS1:这个定理是否已经在标准库中得到证明?没找到。
PS2:其实我想更自然地分裂:7 -> 4 + 3 -> (2 + 2) + (2 + 1) -> ((1 + 1) + (1 + 1)) + ((1 + 1) + 1)。是否可以?不知道怎么写才能让 Coq 明白函数收敛。
【问题讨论】:
标签: types coq typechecking