Как автоматически ввести симметрии в гипотезу Coq?

У меня есть некоторые равенства (=) и неравенства (<>) в гипотезах, таких как:

e : x2 = x1
n : x3 <> x1

Я хочу использовать такую ​​тактику, как assumption, но иногда ожидаемое (не) равенство в цели происходит в другом направлении, например:

x1 = x2
x1 <> x3

Мой вопрос:

Можно ли автоматически вводить симметричные формы (не) равенства выше в гипотезы?

Если нет, то можно ли использовать нотацию, чтобы написать тактику для этого.

Пока что я могу сделать это вручную следующим образом:

assert (x1 = x2) by (symmetry in e; assumption).

assert (x1 <> x3) by (unfold not; intro Hnot; 
  symmetry in Hnot; unfold not in n; apply n in Hnot; inversion Hnot). 

Но это действительно утомительно и шумно. Я не знаю достаточно о том, как автоматизировать это или есть лучший способ.

1 ответ

Решение

Возможно, эта тактика может помочь:

Ltac maybe_intro_sym A B :=
  match goal with
    |[H:B=A|-_] => fail 1
    |[H:A=B|-_] => assert (B=A) by auto
  end.

Ltac maybe_intro_sym_neg A B :=
  match goal with
    |[H:B<>A|-_] => fail 1
    |[H:A<>B|-_] => assert (B<>A) by auto
  end.

Ltac intro_sym :=
  repeat match goal with
    |[H:?A=?B|-_] => maybe_intro_sym A B
    |[H:?A<>?B|-_] => maybe_intro_sym_neg A B
  end.

Вот пример:

Parameters a b c d:nat.
Goal a=b -> c=d -> c<>d -> True.
intros.
intro_sym.

Теперь контекст

  H : a = b
  H0 : c = d
  H1 : c <> d
  H2 : d = c
  H3 : b = a
  H4 : d <> c
  ============================
   True
Другие вопросы по тегам