acl2 эквациональное рассуждение, доказывающее равенство

Я пытаюсь доказать, что следующая функция верна, и у меня возникают проблемы с ее выяснением, хотя это кажется очевидным!

(implies (and (listp x)
              (listp y))
         (equal (app (rev x) (rev y))
                (rev (app x y))))

при этом мне просто нужно показать, что (app (rev x) (rev y)) эквивалентно (rev (app xy)))), используя функции:

(defunc len (x)
  :input-contract t
  :output-contract (natp (len x))
  (if (atom x)
    0
    (+ 1 (len (rest x)))))

(defunc atom (x)
  :input-contract t
  :output-contract (booleanp (atom x))
  (not (consp a)))

(defunc not (a)
  :input-contract (booleanp a)
  :output-contract (booleanp (not a))
  (if a nil t))

(defunc listp (l)
  :input-contract t
  :output-contract (booleanp (listp l))
  (or (equal l ())
      (consp l)))

(defunc endp (a)
  :input-contract (listp a)
  :output-contract (booleanp (endp a))
  (not (consp a)))

(defunc twice (l)
  :input-contract (listp l)
  :output-contract (listp (twice l))
  (if (endp l)
    nil
    (cons (first l) (cons (first l) (twice (rest l))))))

(defunc app (a b)
  :input-contract (and (listp a) (listp b))
  :output-contract (listp (app a b))
  (if (endp a)
    b
    (cons (first a) (app (rest a) b))))

(defunc rev (x)
  :input-contract (listp x)
  :output-contract (and (listp (rev x)) (equal (len x) (len (rev x))))
  (if (endp x)
    nil
    (app (rev (rest x)) (list (first x)))))

Вот как я сделал еще один (надеюсь, правильно)

(implies (listp y)
         (equal (len (rev (cons x y)))
                (+ 1 (len (rev y)))))

"обратное добавление"

(rev (app (rev y) (rex x))) = (app x y)

(len (rev (cons x y))

= def of rev

len (app (rev y) (list x))

= выходной контракт оборотов

(len (rev (app (rev y) (list x))))

= "обратное добавление"

(len (rev (cons x y))

= выходной контракт оборотов

(len (cons x y))

= лен

(+ 1 (len y))

= выходной контракт оборотов

(+ 1 (len (rev y)))

0 ответов

Другие вопросы по тегам