Вместо использования инверсии в каждом доказательстве, я считаю, что доказательства в большей степени поддерживаются в долгосрочной перспективе, если вы используете булево отражение. В библиотеках есть много полезных лемм, которые вы можете использовать, они часто называются чем-то со словами «refle», «решить», «dec» или «spec», как в спецификации, поэтому вы можете, например, искать леммы, связанные с <
, с помощью Search (_ < _) "spec".
Леммы об отражении предназначены для одновременного 1) уничтожения логического термина в вашем контексте доказательства и 2) добавления соответствующего Prop
в ваш контекст, что упрощает использование затем lia
, omega
и т. Д. Для завершения доказательства.
В вашем случае вы можете использовать Nat.eq_spec
(из Require Import PeanoNat.
). Do
destruct (Nat.eq_spec n 0).
Это создаст две ветви, в одной n ?= 0
заменяется на true
и n=0
добавляется в контекст, а в другом n =? 0
заменяется на false
и n<>0
добавляется в контекст. Теперь доказать доказательство очень легко, поскольку контекст первой цели содержит противоречие n=0
и n<>0
, а вторая цель - false=false
. Вы можете использовать тактику автоматизации now
, поэтому полное доказательство будет
now destruct (Nat.eq_spec n 0).
Если вы хотите использовать целые числа Z
, вместо этого доказательство становится now destruct (Z.eq_spec n 0).
. поскольку модуль Z
имеет много соответствующих лемм с соответствующими именами.