如何编写Ltac以将等式的两边乘以Coq中的组元素

时间:2018-01-28 21:34:36

标签: coq ltac

使用组的这个定义:

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).

2 个答案:

答案 0 :(得分:2)

answer given by larsr的基础上,您可以使用use std::collections::HashMap; struct Bar; impl Bar { fn get(&self) -> i32 { 100 } } struct Foo { chars: HashMap<char, i32>, b: Bar, } impl Foo { fn run(&mut self) { let b = &self.b; self.chars.entry('c').or_insert_with(|| b.get() * 100); } } fn main() { let mut m = Foo { chars: HashMap::new(), b: Bar, }; m.run(); } 来编写

Tactic Notation

使用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(“在呼叫站点检查这个问题,并用evars填充漏洞”)。)

答案 1 :(得分: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