Я пытаюсь доказать эту функцию в 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))))))
Какие значения вы используете для переполнения стека? – DavidC
Я не. ACL2s имеет автоматический теоретический прорыв, который пропускает входы в него, но я не вижу, что это такое, но один из них вызывает переполнение стека, поэтому он отвергает эту функцию. – b33k3rz