Насколько я понимаю, вызовы функций в Coq непрозрачны. Иногда мне нужно использовать unfold
, чтобы применить его, а затем fold
, чтобы вернуть определение / тело функции к ее имени. Это часто бывает утомительно. Мой вопрос: есть ли более простой способ применить конкретный экземпляр вызова функции?
В качестве минимального примера для списка l
, чтобы доказать, что правое добавление []
не меняет l
:
Theorem nil_right_app: forall {Y} (l: list Y), l ++ [] = l.
Proof.
induction l.
reflexivity.
Это оставляет:
1 subgoals
Y : Type
x : Y
l : list Y
IHl : l ++ [] = l
______________________________________(1/1)
(x :: l) ++ [] = x :: l
Теперь мне нужно применить определение ++
(т.е. app
) один раз (притворившись, что в цели есть другие ++
, которые я не хочу применять / расширять). В настоящее время единственный известный мне способ реализовать это одноразовое приложение - сначала развернуть ++
, а затем свернуть его:
unfold app at 1. fold (app l []).
давая:
______________________________________(1/1)
x :: l ++ [] = x :: l
Но это неудобно, так как мне нужно выяснить форму термина для использования в fold
. Я выполнял вычисления, а не Coq. Мой вопрос сводится к следующему:
Есть ли более простой способ реализовать это одноразовое функциональное приложение с таким же эффектом?
Qed
. ВместоDefined
при определении функции с использованием тактики). - person Vinz   schedule 12.10.2015