我在假设中有一些平等(=
)和不平等(<>
),例如:
e : x2 = x1
n : x3 <> x1
我想使用像assumption
这样的策略,但有时目标中的预期(非)平等是在另一个方向,如:
x1 = x2
x1 <> x3
我的问题是:
是否有可能在上述假设中自动引入(un)相等的对称形式?
如果没有,是否可以使用Notation编写一个战术来执行此操作。
到目前为止,我可以像这样手动执行此操作:
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).
但它真的很乏味和嘈杂。我不知道如何自动化这个或者有更好的方法。
答案 0 :(得分: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