Неверно говорить о «максимальной рекурсивной границе» в контексте решателя SMT.Я вижу вашу склонность называть это так;как вы надеетесь, это просто развернет определения по мере необходимости.Но это просто не то, как работает SMT-решатель.
В общем, когда у вас есть рекурсивная функция, она индуцирует набор количественных аксиом.(Вы можете найти перевод на странице 63 из http://smtlib.cs.uiowa.edu/papers/smt-lib-reference-v2.6-r2017-07-18.pdf.) Итак, то, что вы можете рассматривать как «функцию», на самом деле является сокращением для написания набора количественных аксиом.
Обратите внимание, что вытакже есть ваши собственные количественные аксиомы, и все эти ограничения собираются вместе, и решатель начинает работать. К сожалению, это делает логику полуразрешимой; это означает, что процедуры принятия решения не существует. (Процедура принятия решений - это процедура, которая всегда завершается и отвечает правильно.) Теоретически это означает, что он всегда может найти «доказательство», если оно существует в конце концов, но может зацикливаться бесконечно, если что-то не так. Однако на практике это обычно означает, что в обоих случаях цикл будет достаточно продолжительным,Ваше терпение или память вашего компьютера истощатся первыми.
Существуют алгоритмы (такие как поиск макросов и электронное сопоставление), которые имеют дело с квантификаторами, но все они обязательно неполные, и, по моему опыту, довольно хрупкие.Вы также можете попытаться помочь z3, предоставив шаблоны для квантификатора i.nstantiation, см. здесь: https://rise4fun.com/z3/tutorialcontent/guide#h28. Но метод не прост в использовании и не масштабируется на практике.
Короче говоря, решатели SMT просто не годятся для рассуждений с квантификаторами.А рекурсивные определения подразумевают количественную оценку.Существуют как теоретические ограничения на то, что они могут сделать, так и практические соображения относительно удобства использования, производительности и честного возврата инвестиций: если вы хотите рассуждать о рекурсивных функциях и рекурсивных типах данных, решатели SMT, возможно, просто не подходятинструмент.Вместо этого используйте доказательство теорем, таких как HOL, Изабель, Coq, Agda, Lean;и т. д., которые предназначены для работы с такими конструкциями.(Большинство из этих инструментов могут автоматически вызывать SMT-решатель от вашего имени для упрощенных целей; поэтому вы получаете лучшее из обоих миров.)
Надеюсь, это объяснение понятно.Практическое правило состоит в том, что рассуждение о рекурсивных функциях требует индукции, а индуктивные доказательства требуют изобретения необходимых инвариантов.Решатели SMT не могут придумать для вас требуемые инварианты и не позволяют вам указать, что это за инварианты, даже если вы готовы их предоставить.Но доказатели теорем могут помочь вам сформулировать и доказать эти инварианты;и должен быть предпочтительным для таких проблем.