如何确定SML中递归函数的变量?
我在理解SML中的变量以及如何确定递归函数的变量时遇到了一些困难。我得到了解释: (递归)函数的变量是函数参数上的任何表达式,它接受某个集合中的值,从而如何确定SML中递归函数的变量?,sml,variant,Sml,Variant,我在理解SML中的变量以及如何确定递归函数的变量时遇到了一些困难。我得到了解释: (递归)函数的变量是函数参数上的任何表达式,它接受某个集合中的值,从而 A是(完全)有序的;此外,A中没有无限的下降链v0>v1>…和 对于任何递归调用,变量都会严格减小。” 但这对我帮助不大。一个更具体的例子会更好 假设递归函数生成一个长度为n的列表,其中所有元素均为零 这可能看起来像这样: fun foo 0 = [] | foo n = 0::(foo (n - 1)) 在这种情况下,变量是函数的参
- A是(完全)有序的;此外,A中没有无限的下降链v0>v1>…和
- 对于任何递归调用,变量都会严格减小。”
但这对我帮助不大。一个更具体的例子会更好 假设递归函数生成一个长度为
n
的列表,其中所有元素均为零
这可能看起来像这样:
fun foo 0 = []
| foo n = 0::(foo (n - 1))
在这种情况下,变量是函数的参数n
。n
是一个自然数,自然数是完全有序的,没有无限的降序链,因为没有链可以低于零。此外,
n
随着每次递归调用而严格减少
另一个例子:假设函数接受两个参数,x
和y
,如果x>y
则返回true,否则返回false
fun bar 0 y = false
| bar x 0 = true
| bar x y = bar (x - 1) (y - 1)
在这种情况下,变体有几个选项。您可以将其视为x
或y
,如前一示例所示,也可以将其视为x+y
。在任何一种情况下,它都采用自然数值并严格减小
现在,举个例子,参数是非整数——查找列表的和
fun sum [] = 0
| sum (x::xs) = x + (sum xs)
在这种情况下,变量可以被视为列表的长度(同样是一个自然数),也可以被视为列表本身,其中列表的顺序如下:
l1
iff有一些有限的元素序列x1,x2,…,xn
,这样
x1::x2:::::xn::l1=l2
在这种比较下,很容易证明列表集是部分有序的,没有无限的降序链,尤其是从某个列表开始的递归调用生成的列表集是完全有序的
此外,在任何递归调用中,根据定义,xs<(x::xs)
,因此列表在减少
一个变量的要点是,它是一个可以用来证明函数行为的量。因为没有无限递减链,所以必须有一个最小元素,它可以作为归纳的基本情况,总的顺序给出了一种归纳的方式,从一个元素到比它大的元素
这也可以通过没有无限递减链的偏序来实现,这可以保证存在最小元素(如果不一定是最小元素的话)。然后可以将这些作为基本情况使用,并进行类似的归纳论证,尽管可能采用多种方法构造更大的元素