Scheme 什么输入会导致此功能不终止?

Scheme 什么输入会导致此功能不终止?,scheme,lisp,stack-overflow,termination,Scheme,Lisp,Stack Overflow,Termination,我试图在ACL2s/Lisp中证明这个函数,但是它返回了一个堆栈溢出错误,尽管我看不到代码中的缺陷 (defunc foo (x y) :input-contract (and (natp x) (natp y)) :output-contract (natp (foo x y)) (cond ((equal 0 x) (+ y 1)) ((equal 0 y) (foo (- x 1) 1)) (t (foo (- x 1) (foo x (+ y 1))))

我试图在ACL2s/Lisp中证明这个函数,但是它返回了一个堆栈溢出错误,尽管我看不到代码中的缺陷

(defunc foo (x y)
 :input-contract (and (natp x) (natp y))
 :output-contract (natp (foo x y))
 (cond ((equal 0 x) (+ y 1))
       ((equal 0 y) (foo (- x 1) 1))
       (t (foo (- x 1) (foo x (+ y 1))))))

任何正的
x
y
都不会导致溢出吗?让我们看看
(foo11)

x
y
都不为零,因此它到达cond的
t
分支,并调用:

(foo 0
     (foo 1 2))
(foo 0
     (foo 1 3))
好的,让我们评估一下内部的
foo
调用:

(foo 1 2)
类似地,它到达cond的
t
分支,并调用:

(foo 0
     (foo 1 2))
(foo 0
     (foo 1 3))
让我们评估一下内部的
foo

(foo 1 3)
你可以看到这是怎么回事。
t
分支调用:

(foo 0
     (foo 1 4))

等等。只要
x
y
都不为零,就会发生这种情况。你从哪里得到这个密码的?你想用它做什么?运行它还可以查看溢出的内容。在这种情况下,几乎所有可能的调用都会导致堆栈溢出。

任何正的
x
y
不会导致堆栈溢出吗?让我们看看
(foo11)

x
y
都不为零,因此它到达cond的
t
分支,并调用:

(foo 0
     (foo 1 2))
(foo 0
     (foo 1 3))
好的,让我们评估一下内部的
foo
调用:

(foo 1 2)
类似地,它到达cond的
t
分支,并调用:

(foo 0
     (foo 1 2))
(foo 0
     (foo 1 3))
让我们评估一下内部的
foo

(foo 1 3)
你可以看到这是怎么回事。
t
分支调用:

(foo 0
     (foo 1 4))

等等。只要
x
y
都不为零,就会发生这种情况。你从哪里得到这个密码的?你想用它做什么?运行它还可以查看溢出的内容。在这种情况下,几乎每一个可能的调用都会导致堆栈溢出。

您为堆栈溢出传递的值是什么?我不是。ACL2s有一个自动定理证明器,它会将输入传递给它,但我看不出它们是什么,但其中一个导致堆栈溢出,因此它拒绝该函数。你传递的堆栈溢出值是什么?我没有。ACL2s有一个自动定理证明器,可以将输入传递给它,但我看不出它们是什么,但其中一个导致堆栈溢出,因此它拒绝该函数。