我有一个存在主义假设,例如:
H : exists (a : A) (b : B) (c : C), P a b c
我想分解为:
a : A
b : B
c : C
H0 : P a b c
策略decompose [ex] H; clear H
正是这样做的,除了变量的名称变为x
,x0
和x1
而不是a
,{{1 },b
。有没有办法分解这个假设,自动生成"好"名称(c
与intros
目标相同的方式?
答案 0 :(得分:5)
以下策略(Vinz解决方案的简化,整理和修正版本)实现了预期的结果。
Ltac decompose_ex H :=
repeat match type of H with
| ex (fun x => _) =>
let x := fresh x in
destruct H as [x H]
end.
答案 1 :(得分:4)
好吧,我认为我设法(有一些帮助:D)做你想做的事情:
Parameter A B C : Type.
Parameter P : A -> B -> C -> Prop.
Parameter Q : Prop.
(* This will try to match an hypothesis named h with 'exists u: T, P'
and return the name of 'u' *)
Ltac extract_name h :=
match goal with
| [h : ?A |- _ ] =>
match A with
| @ex ?T ?P => match P with
| fun u => _ => u
end
end
end.
(* 'smart' destruct using the name we just computed *)
Ltac one_destruct h :=
let a := extract_name h in
destruct h as [a h].
Goal (exists (a:A) (b:B) (c:C), P a b c) -> Q.
intros H.
repeat (one_destruct H).
(* the goal is now
1 subgoals
a : A
b : B
c : C
H : P a b c
______________________________________(1/1)
Q
*)
我不是一个熟练的Ltac用户,所以这可能不完全是完美的。使用风险自负:)
最佳, 诉
答案 2 :(得分:1)
可以手动提供名称。
Goal forall (t : Type) (p : t -> Prop) (q : Prop), (exists x : t, p x) -> q.
Proof. intros ? ? ? h1. elim h1. intros x h2. Abort.
Goal forall (t : Type) (p : t -> Prop) (q : Prop), (exists x : t, p x) -> q.
Proof. intros ? ? ? h1. inversion h1 as [x h2]. Abort.
Goal forall (t : Type) (p : t -> Prop) (q : Prop), (exists x : t, p x) -> q.
Proof. intros ? ? ? h1. destruct h1 as [x h2]. Abort.
Goal forall (t : Type) (p : t -> Prop) (q : Prop), (exists x : t, p x) -> q.
Proof. intros ? ? ? h1. induction h1 as [x h2]. Abort.
Goal forall (t : Type) (p : t -> Prop) (q : Prop), (exists x : t, p x) -> q.
Proof. intros ? ? ? [x h]. Abort.
答案 3 :(得分:0)
它没有直接链接,但它只是让你知道,使用emacs compagny模式为coq你可以实现intros
类似的东西(我不确定它适用于destruct
思考)
这样做,只需使用this doc安装compagny-coq(它真的很有效,你应该尝试一下)。然后,当您在文件中添加一些介绍时,只需编写intros!
然后按<Tab>
,它就会自动完成。我不确定这个名字是否总是最好的,但至少它是确定性的,如果你在之后添加几行就不会破坏。
答案 4 :(得分:-1)
可以生成一个保证不与任何现有名称冲突的名称。你不会事先知道这个名字是什么,但你仍然可以在战术中使用它。我认为它不合格。您可以使用idtac
进行打印。
Goal forall (t : Type) (p : t -> Prop) (q : Prop), (forall x : t, p x -> q) -> (exists x : t, p x) -> q.
Proof.
intros ? ? ? h.
let h := fresh "h" in idtac h; intros h; case h.
let h := fresh "h" in idtac h; intros x h.
firstorder.
Qed.