我认为这应该相对简单,想知道是否有人知道如何回答这个问题:
定义递归函数seq-min:N + - > N,返回自然数序列中的最小值。
我正在思考...... ...
if hd seq < hd tl seq then seq-min([hd seq] concat tl tl seq)
else if hd seq > hd tl seq then seq-min(tl seq)
else if hd seq = hd tl seq then seq-min(tl seq)
感谢您的帮助!
答案 0 :(得分:1)
这样的东西可能有用,但很难遵循 - 而且我们正在编写规范,所以如果它很清楚就会有所帮助。以下是我的第一个想法。它使用两个函数略微欺骗,但我希望它相对清楚:
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);
请注意,这不会尝试在比较中使用值对,因此没有&#34; tl tl seq&#34;以下测试再次使用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.
>
答案 1 :(得分:1)
这是一种略有不同的方法,使用单一功能:
seq_min: seq of nat -> nat
seq_min(s) ==
cases s:
[x] -> x,
[x] ^ rest ->
let min = seq_min(rest) in
if x < min then x else min
end
pre len s > 0;
这具有简短直观(并且具有单一功能)的优点。当在这样的案例表达中将规范写成一组“模式”时,规范可以非常清晰,因为每个案例都被明确地“解释”。