Cac*_*tus 6 recursion termination agda induction
我不能让Agda的终止检查器接受使用结构感应定义的函数.
我创建了以下内容作为我认为最简单的例子来展示这个问题.以下定义size
被拒绝,即使它总是在严格较小的组件上进行递归.
module Tree where
open import Data.Nat
open import Data.List
data Tree : Set where
leaf : Tree
branch : (ts : List Tree) ? Tree
size : Tree ? ?
size leaf = 1
size (branch ts) = suc (sum (map size ts))
Run Code Online (Sandbox Code Playgroud)
这个问题有通用的解决方案吗?我是否需要Recursor
为我的数据类型创建一个?如果是的话,我该怎么做?(我想如果有一个如何定义Recursor
for 的示例List A
,那会给我足够的提示吗?)
小智 7
你可以在这里做一个技巧:你可以在一个相互的块内手动内联和融合map和sum的定义.它非常反模块化,但它是我所知道的最简单的方法.其他一些总语言(Coq)有时可以自动执行此操作.
mutual
size : Tree ? ?
size leaf = 1
size (branch ts) = suc (sizeBranch ts)
sizeBranch : List Tree ? ?
sizeBranch [] = 0
sizeBranch (x :: xs) = size x + sizeBranch xs
Run Code Online (Sandbox Code Playgroud)