Выполненное вами ручное доказательство объясняет, почему auto
не может этого сделать. Вы провели доказательство по индукции, а затем несколько раз переписали. auto
tacti c не позволяет себе такой шаг.
tacti c auto
предназначен для поиска доказательства, если для ручного доказательства используется только apply
с ограниченным набором теорем. Здесь ограниченный набор теорем взят из базы подсказок core
. Для краткости предположим, что эта база данных содержит только le_S
, le_n
, plus_n_O
и plus_n_Sm
.
Для упрощения предположим, что мы работаем с целью a <= 2 ^ a
. Главный предикат этого утверждения - _ <= _
, поэтому tacti c будет рассматривать только теоремы, основное утверждение которых выражено с помощью _ <= _
. Это исключает plus_n_O
и plus_n_Sm
. Ваша инициатива по их добавлению идет насмарку.
Если мы посмотрим на le_n
, выражение будет forall n : nat, n <= n
. Если мы заменим универсальную количественную оценку переменной шаблона , этот шаблон будет ?1 < ?1
. Объединяется ли это с a <= 2 ^ a
? Ответ - нет. поэтому эта теорема не будет использоваться auto
. Теперь, если мы посмотрим на le_S
, образец главного оператора будет ?1 <= S ?2
. Если объединить этот шаблон с a <= 2 ^ a
, это потребует, чтобы ?1
было a
. Каким может быть значение ?2
? Нам нужно символически сравнить выражения 2 ^ a
и S ?2
. С левой стороны символ функции - _ ^ _
или 2 ^ _
, в зависимости от того, как вы sh смотрите на него, но в любом случае это не S
. Итак, auto
распознает, что эти функции не совпадают, лемма неприменима. auto
терпит неудачу.
Я повторяю: когда ставится цель, auto
сначала смотрит только на главный символ цели и выбирает из своей базы данных теоремы, которые позволяют получить доказательства для этого главного символа. В вашем примере символ головы - _ <= _
. Затем он смотрит только на заключение этих теорем и проверяет, соответствует ли заключение синтаксически поставленной цели. Если он действительно совпадает, то это должно предоставить значения для универсально определяемых количественных переменных теоремы, а предпосылки теоремы - это новые цели, которые следует решать на более низком уровне. Как было упомянуто @Elazar, глубина по умолчанию ограничена 5.
Директива Hint unfold
будет полезна, только если вы сделали определение следующей формы:
Definition myle (x y : nat) := x <= y.
Тогда Hint Unfold myle : core.
было бы полезно убедиться, что теоремы базы данных для _ <= _
также используются для доказанных экземпляров myle
, как в следующем примере (он не работает, если у нас есть 4 вхождения S
, из-за ограничение глубины).
Lemma myle3 (x : nat) : myle x (S (S (S x))).
Proof. auto with core. Qed.
Обратите внимание, что следующее утверждение логически эквивалентно (согласно определению сложения), но не доказуемо с помощью auto
. Даже если вы добавите Hint unfold plus : core.
в качестве директивы, это не поможет, потому что plus
не является главным символом цели.
Lemma myleplus3 (x : nat) : myle x (3 + x).
Proof.
auto. (* the goal is unchanged. *)
simpl. auto.
Qed.
Я часто использую автоматические c тактики от Coq, для instance lia
, но я всегда так делаю, потому что могу предсказать, является ли цель частью предполагаемой области действия tacti c.