什么输入会导致此功能无法终止?

 何丽-Hely 发布于 2023-02-13 12:38

我试图在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))))))

zck.. 5

那不是任何积极xy造成这种溢出?我们来看看吧(foo 1 1).

既不是x也不y是零,所以它到达tcond 的分支,并调用:

(foo 0
     (foo 1 2))

好吧,让我们评估一下内部foo呼叫:

(foo 1 2)

同样,它到达tcond 的分支,并调用:

(foo 0
     (foo 1 3))

让我们评估内心foo:

(foo 1 3)

你可以看到它的发展方向.该t分公司电话:

(foo 0
     (foo 1 4))

等等.这将在任何时候发生x,y并且非零.你从哪里得到这段代码?你想用它做什么?运行它也是一个好主意,看看溢出了什么.在这种情况下,几乎每个可能的调用都会出现堆栈溢出.

1 个回答
  • 那不是任何积极xy造成这种溢出?我们来看看吧(foo 1 1).

    既不是x也不y是零,所以它到达tcond 的分支,并调用:

    (foo 0
         (foo 1 2))
    

    好吧,让我们评估一下内部foo呼叫:

    (foo 1 2)
    

    同样,它到达tcond 的分支,并调用:

    (foo 0
         (foo 1 3))
    

    让我们评估内心foo:

    (foo 1 3)
    

    你可以看到它的发展方向.该t分公司电话:

    (foo 0
         (foo 1 4))
    

    等等.这将在任何时候发生x,y并且非零.你从哪里得到这段代码?你想用它做什么?运行它也是一个好主意,看看溢出了什么.在这种情况下,几乎每个可能的调用都会出现堆栈溢出.

    2023-02-13 12:40 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有