什么有效
如果将固定点的定义嵌套在树上固定点的定义内的列表上,则结果类型正确。当您以归纳类型嵌套递归时,即当递归通过类似的构造函数时,这是一个通用原则list
。
Fixpoint size (t : LTree) : nat :=
let size_l := (fix size_l (l : list LTree) : nat :=
match l with
| nil => 0
| h::r => size h + size_l r
end) in
match t with Node l =>
1 + size_l l
end.
或者,如果您希望更简洁地编写此代码:
Fixpoint size (t : LTree) : nat :=
match t with Node l =>
1 + (fix size_l (l : list LTree) : nat :=
match l with
| nil => 0
| h::r => size h + size_l r
end) l
end.
(我不知道我是从谁那里听到的;这肯定是多次独立发现的。)
通用递归谓词
通常,您可以LTree
手动定义“适当的”归纳原理。自动生成的归纳原理LTree_rect
忽略了列表中的假设,因为归纳原理生成器仅了解归纳类型的非嵌套严格正出现。
LTree_rect =
fun (P : LTree -> Type) (f : forall l : list LTree, P (Node l)) (l : LTree) =>
match l as l0 return (P l0) with
| Node x => f x
end
: forall P : LTree -> Type,
(forall l : list LTree, P (Node l)) -> forall l : LTree, P l
让我们在列表上添加归纳假设。为了在递归调用中实现它,我们调用列表归纳原理,并将其传递给列表内较小树上的树归纳原理。
Fixpoint LTree_rect_nest (P : LTree -> Type) (Q : list LTree -> Type)
(f : forall l, Q l -> P (Node l))
(g : Q nil) (h : forall t l, P t -> Q l -> Q (cons t l))
(t : LTree) :=
match t as t0 return (P t0) with
| Node l => f l (list_rect Q g (fun u r => h u r (LTree_rect_nest P Q f g h u)) l)
end.
为什么
原因的答案在于接受递归函数的精确规则。这些规则有些微妙,因为在允许复杂的情况(例如这种情况,在数据类型中具有嵌套递归)和不健全之间存在微妙的平衡。该勒柯克参考手册介绍了语言(感应结构的演算,它是勒柯克的证明语言),大多与正式精确的定义,但如果你想关于诱导和coinduction你需要去研究论文的具体规则,关于这个话题,爱德华多·吉米内斯(EduardoGiménez)[1]。
从Coq手册开始,在Fix
规则符号中,我们有的定点定义。˚F 我X ˚F一世{ ˚F1个:A1个:= 吨1个;F2:A2:=吨2}
Γ1个Γ2= (x :L T r e e)= (升:升我小号吨大号Ť ř ë ë)一种1个一种2= n a t= n a tŤ1个Ť2= c a s e(x ,L T r e e, λ ÿ。G1个(f2ÿ))= c a s e(l ,l i s t大号Ť ř ë ë,λ ħ[R 。G2(f1个ħ )(˚F2r ))
FĴŤ一世F一世
- 我= 1j = 2
l
t
size
- 我= 2j = 1
h
l
size_l
- 我= 2j = 2
r
l
size_l
我在h
结构上不小于l
Coq解释器的原因尚不清楚。据我从Coq-club列表[1] [2]的讨论中了解到,这是解释器中的一个限制,原则上可以解除限制,但要非常小心,以免引起不一致。
参考文献
Cocorico,无止境的Coq Wiki:互归
Coq-Club邮件列表:
Coq开发团队。Coq证明助手:参考手册。版本8.3(2010)。[ 网络 ] 频道 4。
爱德华多(EduardoGiménez)。用递归方案整理保护的定义。在Types'94:证明和程序的类型,LNCS 996中。Springer-Verlag,1994年。doi:10.1007 / 3-540-60579-7_3 [ Springer ]
爱德华多(EduardoGiménez)。类型理论中的结构递归定义。在ICALP'98中:第25届自动机,语言和程序设计国际学术研讨会论文集。施普林格出版社,1998年。 [ PDF ]