在“Draft Dafny 参考手册”4.0.2 中,它描述了为相互递归函数定义减少子句,但两个函数中减少的变量都是类型nat
。我试图做同样的事情,但没有奏效。一个区别是变量不是同一类型。
datatype Trie = Trie(letters : map<char,Trie>, word : bool)
function size(t:Trie) :(r:nat)
decreases t
{
1 + sum_setT(t.letters.Values)
}
function sum_setT(xs: set<Trie>) : (z:nat)
decreases xs
{
var working := xs; //Needed!
if (|working| == 0) then 0
else (
var x:Trie :| x in working;
var sofar:nat := sum_setT(working-{x});
sofar + size(x)
)
}
任何想法如何定义减少子句都非常感谢。