ACL2 中定义了一个函数,我们的任务是创建一个度量函数来帮助证明终止。这是函数定义:
(defunc f (x a)
:input-contract (and (integerp x) (listp a))
:output-contract (integerp (f x a))
(cond
((endp a) 68)
((equal (len a) x) 71)
((equal (len a) (+ x 1)) 74)
((< x (len a)) (f (+ x 1) (rest a)))
(t (f (- x 1) (cons 1 a)))))
解决方案测量功能是这样的(简写):
(m x a) = (if (equal (len a) (+ x 1))
0
(abs (- (len a) x)))
基于函数中的两个递归调用,我们能够确定将包含测量函数的 else 情况。但是,我们不了解它的其余部分,以及找出这个度量函数的过程。
作为参考,一个测量函数:
- m 是在 f 的参数上定义的允许函数;
- m 与 f 有相同的输入契约;
- m 有一个输出契约,声明它总是返回一个自然数;和
- 在导致递归调用的条件下,在每次递归调用中,应用于该递归调用的参数的 m 都会减少。
导致确定此测量函数的过程是什么?