Я изучал тактику Coq и знакомился с системой, укоряя основные факты о натуральных числах.
Я пытался избежать использования теорем, уже доказанных в библиотеке, и обличать такие вещи, как ассоциативность умножения и т. Д.
Однако я был в тупике в нескольких случаях, когда у меня есть свойство для nm: nat, которое я хочу доказать, но когда я пытаюсь сделать индукцию по n и m, структура индуктивных гипотез бесполезно пытаться доказать собственность.
Я доказал n = m -> o * n = o * m очень легко:
Theorem times_alg_left : forall n m o:nat, n = m -> o * n = o * m.
intros n m o H.
rewrite H; reflexivity.
Defined.
Но попытка доказать, что S o * n = S o * m -> n = m, полностью меня расстроила. После значительных усилий я решил попытаться доказать, что 2 * n = 2 * m -> n = m, но это было не легче.
У меня возникают такие ситуации:
Theorem m2_eq : forall n m:nat, 2 * n = 2 * m -> n = m.
intros n m H.
induction n.
destruct m.
reflexivity.
discriminate.
induction m.
discriminate.
1 subgoal
n, m : nat
H : 2 * S n = 2 * S m
IHn : 2 * n = 2 * S m -> n = S m
IHm : 2 * S n = 2 * m -> (2 * n = 2 * m -> n = m) -> S n = m
______________________________________(1/1)
S n = S m
У меня есть 2 * S n = 2 * S м, но мои индуктивные предпосылки говорят о 2 * n = 2 * S м и 2 * S n = 2 * м.
Я ничего не могу сделать из этой ситуации.
Точно так же я начал пытаться доказать, что такое Nat.sub и меньше или равно, чтобы обойти это ограничение, но я столкнулся с той же ситуацией.
Theorem sub0_imp_le : forall n m:nat, n - m = 0 -> n <= m.
intros n m H.
induction n; induction m.
apply le_n.
apply le_0.
rewrite sub0 in H.
discriminate.
1 subgoal
n, m : nat
H : S n - S m = 0
IHn : n - S m = 0 -> n <= S m
IHm : S n - m = 0 -> (n - m = 0 -> n <= m) -> S n <= m
______________________________________(1/1)
S n <= S m
Но я в том же рассоле, где мои индуктивные помещения бесполезны.
Как мне структурировать свою тактику для решения теорем такого типа, с 2 переменными nat и какой-то ситуацией равенства или вычитания?