我如何才能说服Coq以下给出的递归函数终止?该函数带有两个归纳参数。从直觉上讲,由于任何一个参数都已分解,因此递归终止。
具体来说,该函数将两棵树作为输入。
Inductive Tree :=
| Tip: Tree
| Bin: Tree -> Tree -> Tree.
在“树”上,我喜欢执行以下归纳样式。
Inductive TreePair :=
| TipTip : TreePair
| TipBin : Tree -> Tree -> TreePair
| BinTip : Tree -> Tree -> TreePair
| BinBin : TreePair -> TreePair -> TreePair.
Fixpoint pair (l r: Tree): TreePair :=
match l with
| Tip =>
match r with
| Tip => TipTip
| Bin rl rr => TipBin rl rr
end
| Bin ll lr =>
match r with
| Tip => BinTip ll lr
| Bin rl rr => BinBin (pair l rl) (pair lr r)
end
end.
接受TreePair的定义,但是函数对的定义会产生错误消息:
Error: Cannot guess decreasing argument of fix.
因此,我对如何说服Coq终止感兴趣。
1
您是否尝试过将l和r一起作为一种产品而不是使用currying?这应该可以帮助它。
—
Per Vognsen
有人认为这个问题与编程有关,超出了本网站的范围。虽然我不确定是否同意,但您可能想了解潜在的问题。如果有人对适当性有话要说,请写在我链接到的元讨论中。
—
伊藤刚(Tsuyoshi Ito)2010年
这个问题实际上是关于在数据结构上指定单调递减的界限,以确保操作
—
戴夫·克拉克2010年
pair
定义良好。Coq仅仅是交通工具。