Ответ
Есть несколько проблем в строке
do 4 constructor 3; 2: {apply eqb_neq. auto. }
Прежде всего, вы не можете использовать 2:
или {}
после оператора цепочки ;
,Самое близкое, что вы можете использовать, это последовательность с локальным приложением tac; [tac1 | tac2]
.Поскольку мы хотим что-то сделать только для второй ветви, мы можем опустить tac1
здесь.
Кроме того, вы не можете использовать точки внутри тактики.Точка отмечает конец оператора, но все выражение do
является одним оператором.Вы должны всегда использовать оператор последовательности ;
для объединения нескольких тактик.
Наконец, do n tac; tac
работает как (do n tac); tac
.Вы можете обернуть тактическое выражение в круглые скобки, например, do n (tac; tac)
, чтобы изменить поведение.
Так что это должно работать:
do 4 (constructor 3; [ | apply eqb_neq; auto ]).
Отступление
Мыможет упростить линию несколькими способами.
auto
могут быть предоставлены дополнительные теоремы для автоматизации.Любая цель, решаемая с помощью apply eqb_neq; auto
, также может быть решена с помощью auto using eqb_neq
.
do 4 (constructor 3; [ | auto using eqb_neq ]).
- Тактика
auto
никогда не заканчивается, поэтому ее можно безопасно использовать на обеих ветвях.
do 4 (constructor 3; auto using eqb_neq).
repeat
повторяется до тех пор, пока что-то не выйдет из строя или не останется никаких подцелей.Следующее будет повторяться до тех пор, пока третий конструктор больше не будет применим.
repeat (constructor 3; auto using eqb_neq).
- Мы можем позволить Coq выбрать, какой конструктор применить.Это может закончить (или почти закончить) доказательство.
repeat (constructor; auto using eqb_neq).
- Мы также можем сделать конструкторы
nostutter
автоматизированными с помощью auto
с помощью команды Hint Constructors
.Теперь мы можем auto
все это.(Вы можете поместить команду подсказки сразу после определения nostutter
, затем вы можете auto
ее везде.)
Hint Constructors nostutter.
auto using eqb_neq.
(* if the above fails, the following increases the search depth so it should succeed. *)
auto 6 using eqb_neq.
- На самом деле, теорема
eqb_neq
ужезарегистрирован на auto
.Так что мы можем просто:
auto 6.