This post показывает, как аксиоматизировать функцию длины для встроенных списков Z3. Однако функция специфична для сортировки (здесь Int) и не относится к спискам bools или пользовательских сортов.Функция длины для общих списков
; declare len as an uninterpreted function
(declare-fun len ((List Int)) Int)
; assert defining equations for len as an axiom
(assert (forall ((xs (List Int)))
(ite (= nil xs)
(= 0 (len xs))
(= (+ 1 (len (tail xs))) (len xs)))))
Что было бы самым умным способом кодирования сортировочных функций списка? (Если я правильно помню, функции не могут быть общими сами по себе).
Похоже, что мне нужно перейти от stdio к программному API раньше, чем я думал ... спасибо! –
Что-то еще: нужно ли охранять такие определяющие уравнения с узорами? Как я обычно делал с количественными аксиомами. Кроме того, в руководстве говорится, что кванторы, определяющие псевдомакросы, автоматически обнаруживаются с помощью Finder модели. Я предполагаю, что для этого требуется: mbqi быть истинным (что не в моем случае). Не могли бы вы немного рассказать об этом? –
Если мы не предоставим шаблоны, Z3 вычислит их для нас. Аксиома «Лен» не является псевдомакро, потому что это «рекурсивное» определение. Опция: mbqi по умолчанию является true. –