Трудно сказать, не глядя на внутренности z3.Но я хочу отметить, что хотя эти две конструкции очень похожи, между ними есть небольшая разница.
Если вы посмотрите на страницу 62 стандарта (http://smtlib.cs.uiowa.edu/papers/smt-lib-reference-v2.6-r2017-07-18.pdf),, там написано:
(define-fun f ((x1 σ1) · · · (xn σn)) σ t)
with n ≥ 0 and t not containing f is semantically equivalent to the command sequence
(declare-fun f (σ1 · · · σn) σ)
(assert (forall ((x1 σ1) · · · (xn σn)) (= ( f x1 · · · xn) t)).
Итак, когда вы используете форму define-fun
, вы явно вводите квантифицированную формулу. Когда вы используете declare-const
/ assert
, как вы делали вручную, это количественное определение не существует.
Теперь вы можете утверждать, что не имеют параметров в вашем случае, поэтому не должно быть никакой разницы, и я бы с вами согласился. Но вы также используете совершенно новые функции, такие как match
,define-fun-rec
и т. Д., Поэтому очевидно, что z3 спотыкается о чем-то здесь. Так как у вас уже есть минимальный пример, почему бы не опубликовать его на сайте вопросов о github z3 и получить некоторую обратную связь там. Я подозреваю, что, возможно, макросоискатель пропускает случайи не может создать экземпляр этого конкретного случая, но на самом деле это трудно сказать, и для этого также может быть веская причина.
Если вы пишете там и получаете хороший ответ, обновите этот вопрос, чтобы мыТеперь, что происходит!