1

使用这个组的定义:

Structure group :=
  {
    G :> Set;

    id : G;
    op : G -> G -> G;
    inv : G -> G;

    op_assoc_def : forall (x y z : G), op x (op y z) = op (op x y) z;
    op_inv_l : forall (x : G), id = op (inv x) x;
    op_id_l : forall (x : G), x = op id x
  }.

(** Set implicit arguments *)
Arguments id {g}.
Arguments op {g} _ _.
Arguments inv {g} _.

Notation "x # y" := (op x y) (at level 50, left associativity).

并证明了这个定理:

Theorem mult_both_sides (G : group) : forall (a b c : G),
    a = b <-> c # a = c # b.

我如何编写一个 Ltac 来自动将给定的等式(目标本身或假设)乘以给定项的过程?

理想情况下,在证明中使用这个 Ltac 应该是这样的:

left_mult (arbitrary expression).
left_mult (arbitrary expression) in (hypothesis).
4

2 回答 2

2

基于larsr 给出的答案,您可以使用Tactic Notations 来编写

Tactic Notation "left_mult" uconstr(arbitrary_expression) :=
  apply (mult_both_sides _ _ _ arbitrary_expression).
Tactic Notation "left_mult" uconstr(arbitrary_expression) "in" hyp(hypothesis) :=
  apply (mult_both_sides _ _ _ arbitrary_expression) in hypothesis.

使用uconstr表示“延迟对该术语的类型检查,直到我们将其插入apply”。(其他选项包括constr("typecheck this at the call site") 和open_constr("typecheck this at the call site and fill in hole with evas")。)

于 2018-01-30T07:16:49.383 回答
1

你真的需要一个特定的策略吗?如果你只是习惯apply这个

Goal forall (G:group) (a b c: G), a = b.
  intros.
  apply (mult_both_sides _ _ _ c).

现在你的目标是

  G0 : group
  a, b, c : G0
  ============================
  c # a = c # b

如果你想修改一个假设H,那就去做吧apply ... in H

于 2018-01-29T09:10:04.407 回答