Тактика apply
пытается использовать функцию / лемму / и т.д.доказать текущую цель.В вашем случае текущая цель была ev 4
, поэтому для использования ev_SS
нам нужно сопоставить вывод из ev_SS
с целью.ev_SS : forall n : nat, ev n -> ev (S (S n)).
, поэтому вывод ev (S (S n))
.Чтобы сопоставить это с ev 4
, n
должно быть 2.
Как только apply
выяснит, что вам еще нужно доказать, это сделает эти вещи новыми целями.В этом случае ev_SS
принимает в качестве помещения натуральное число n
и что-то типа ev n
.Так как выяснилось, что n
должно быть 2, цель остается ev 2
.Следующее использование apply
использует n := 0
, поэтому оставшаяся цель - ev 0
.Наконец, ev_0
не имеет никаких предпосылок, поэтому использование apply ev_0
не оставляет оставшихся целей.
Если это не поможет, подумайте о том, как будет выглядеть неофициальное доказательство этого.По определению ноль - четное число, а если n - четное число, n + 2 - четное.Как мы докажем, что 4 четно?Ну, это даже потому, что 2 четный.Зачем?2 четное, потому что 0 четное.Зачем?0 по определению четно.
Теорема ev_4'
содержит сразу весь доказательский член.apply
видит, что доказывать нечего, поэтому новых целей нет.Это применение apply точно так же, как и тактика exact
.
. Чтобы узнать подробности работы тактики, я рекомендую прочитать документацию .Однако, поскольку документация часто носит технический характер и не содержит примеров, важно прочитать сценарии Coq других людей и просто поэкспериментировать самостоятельно.
По поводу ваших комментариев:
в математике IЯ больше привык к достижению цели из гипотезы, а затем к такому выводу.Но похоже, что в Coq мы обычно начинаем с цели, которая кажется задом наперед (хотя и правильной).Это правда в целом для Coq или только для этого примера?
Можно работать из помещения, а не из цели, используя что-то вроде set (ev_2 := ev_SS ev_0)
, затем exact (ev_SS ev_2)
.Это может составить хороший отдельный вопрос.
и почему ev_0: ev 0 рассматривается как истинное предложение?Это потому, что это часть индуктивного определения?
Да.Помните, что ev
определяется как
Inductive ev : nat -> Prop :=
| ev_0 : ev 0
| ev_SS : forall n : nat, ev n -> ev (S (S n)).
, поэтому ev_0 : ev 0
по определению.
Вы также можете объяснить мне, какой синтаксис применяется (ev_SS 2 (ev_SS 0 ev_0)).средства?
Это означает "вызвать тактику apply
с аргументом (ev_SS 2 (ev_SS 0 ev_0))
. Если вы еще не поняли, Coq использует синтаксис f x
вместо того, что обычно пишется f(x)
в математике. Coq также использует curry для представления функций с несколькими аргументами. Вместо f(x, y)
мы пишем f x y
. Это действительно означает что-то вроде f(x)(y)
, так что f(x)
- это функция, котораяпринимает в качестве аргумента y
. Если бы мы переписали эту строку с использованием более обычного синтаксиса, это было бы apply(ev_SS(2, ev_SS(0, ev_0)))
.