Вы не показали нам свое определение len
, и в вашем коде есть куча ошибок syntacti c. Но вы, кажется, на правильном пути. Я бы закодировал вашу spe c следующим образом:
(declare-datatypes (T) ((Lst nil (cons (hd T) (tl Lst)))))
(define-fun-rec len ((l (Lst Int))) Int
(ite (= l nil) 0 (+ 1 (len (tl l)))))
(define-fun isFull ((l (Lst Int))) Bool
(> (len l) 10))
(define-fun-rec isMember ((i Int) (l (Lst Int))) Bool
(and (distinct l nil)
(or (= i (hd l))
(isMember i (tl l)))))
(define-fun funnyInsert ((i Int) (l (Lst Int))) (Lst Int)
(ite (or (isMember i l) (isFull l))
l
(cons i l)))
Я назвал вашу вставку funnyInsert
, поскольку то, что она делает, довольно забавно.
Обратите внимание, что в то время как z3 будет принять эту программу как есть, вряд ли вы сможете доказать что-нибудь интересное с этими определениями. Свойства рекурсивных функций обычно доказываются с помощью индукции, а SMT-решатели обычно не выполняют индукцию. По крайней мере, не из коробки без большого количества поворотов с тактикой и тому подобным. Желаем удачи!