使用组的这个定义:
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).
答案 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
。