如何自动生成" good"分解存在假设时的名称

时间:2014-03-14 12:00:07

标签: coq

我有一个存在主义假设,例如:

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正是这样做的,除了变量的名称变为xx0x1而不是a,{{1 },b。有没有办法分解这个假设,自动生成"好"名称(cintros目标相同的方式?

5 个答案:

答案 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.