类似的事情可能会奏效,但很难遵循 - 我们正在编写规范,所以如果它很清楚,它会有所帮助。以下是我的第一个想法。它通过使用两个函数稍微作弊,但我希望它相对清楚:
seq_min: seq of nat -> nat
seq_min(s) ==
minrec(tl s, hd s)
pre len s > 0;
minrec: seq of nat * nat -> nat
minrec(s, min) ==
if s = []
then min
else if hd s < min
then minrec(tl s, hd s)
else minrec(tl s, min);
请注意,这不会尝试在比较中使用成对的值,因此没有“tl tl seq”表达式等。以下测试再次使用 VDMJ:
> p seq_min([])
Error 4055: Precondition failure: pre_seq_min in 'DEFAULT' (z.vdm) at line 5:15
Stopped in 'DEFAULT' (z.vdm) at line 5:15
5: pre len s > 0;
>
> p seq_min([1])
= 1
Executed in 0.002 secs.
> p seq_min([2,1])
= 1
Executed in 0.014 secs.
> p seq_min([5,2,3,7,6,9,8,3,5,5,2,7,2])
= 2
Executed in 0.004 secs.
>