関数は 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)))
関数内の 2 つの再帰呼び出しに基づいて、測定関数の else ケースが含まれると判断できました。しかし、その残りの部分と、このメジャー関数を理解するためのプロセスは理解できていません。
参考までに、メジャー関数:
- m は、f のパラメーターで定義された許容関数です。
- m は f と同じ入力契約を持っています。
- m には、常に自然数を返すことを示す出力コントラクトがあります。と
- 再帰呼び出しごとに、その再帰呼び出しの引数に適用される m は、再帰呼び出しにつながった条件下で減少します。
この測定関数を決定するに至ったプロセスは何ですか?