如何确定SML中递归函数的变量?

如何确定SML中递归函数的变量?,sml,variant,Sml,Variant,我在理解SML中的变量以及如何确定递归函数的变量时遇到了一些困难。我得到了解释: (递归)函数的变量是函数参数上的任何表达式,它接受某个集合中的值,从而 A是(完全)有序的;此外,A中没有无限的下降链v0>v1>…和 对于任何递归调用,变量都会严格减小。” 但这对我帮助不大。一个更具体的例子会更好 假设递归函数生成一个长度为n的列表,其中所有元素均为零 这可能看起来像这样: fun foo 0 = [] | foo n = 0::(foo (n - 1)) 在这种情况下,变量是函数的参

我在理解SML中的变量以及如何确定递归函数的变量时遇到了一些困难。我得到了解释:

(递归)函数的变量是函数参数上的任何表达式,它接受某个集合中的值,从而

  • 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)
,因此列表在减少

一个变量的要点是,它是一个可以用来证明函数行为的量。因为没有无限递减链,所以必须有一个最小元素,它可以作为归纳的基本情况,总的顺序给出了一种归纳的方式,从一个元素到比它大的元素

这也可以通过没有无限递减链的偏序来实现,这可以保证存在最小元素(如果不一定是最小元素的话)。然后可以将这些作为基本情况使用,并进行类似的归纳论证,尽管可能采用多种方法构造更大的元素