VDMSL递归函数序列的最小值

时间:2014-06-02 21:55:01

标签: recursion sequence formal-methods vdm++ vdm-sl

我认为这应该相对简单,想知道是否有人知道如何回答这个问题:

定义递归函数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)

感谢您的帮助!

2 个答案:

答案 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;

这具有简短直观(并且具有单一功能)的优点。当在这样的案例表达中将规范写成一组“模式”时,规范可以非常清晰,因为每个案例都被明确地“解释”。