【发布时间】:2018-11-26 15:58:07
【问题描述】:
我目前正在尝试在 Coq 中实现希尔伯特几何。证明时,证明的一部分经常重复多次;例如,这里我试图证明存在 3 行彼此不同。
Proposition prop3_2 : (exists l m n: Line, (l<>m/\m<>n/\n<>l)).
Proof.
destruct I3 as [A [B [C [[AneB [BneC CneA]] nAlgn]]]].
destruct ((I1 A B) AneB) as [AB [incAB unAB]].
destruct ((I1 B C) BneC) as [BC [incBC unBC]].
destruct ((I1 C A) CneA) as [CA [incCA unCA]].
refine (ex_intro _ AB _).
refine (ex_intro _ BC _).
refine (ex_intro _ CA _).
split.
(* Proving AB <> BC through contradiction *)
case (classic (AB = BC)).
intros AB_e_BC.
rewrite AB_e_BC in incAB.
pose (conj incBC (proj2 incAB)) as incABC.
specialize (nAlgn BC).
tauto.
trivial.
split.
(* Proving BC <> CA through contradiction *)
case (classic (BC = CA)).
intros BC_e_CA.
rewrite BC_e_CA in incBC.
pose (conj incCA (proj2 incBC)) as incABC.
specialize (nAlgn CA).
tauto.
trivial.
(* Proving CA <> AB through contradiction *)
case (classic (CA = AB)).
intros CA_e_AB.
rewrite CA_e_AB in incCA.
pose (conj incAB (proj2 incCA)) as incABC.
specialize (nAlgn AB).
tauto.
trivial.
Qed.
如果在这些情况下有类似宏的东西,那就太好了。 我想在中途创建一个子证明:
Lemma prop3_2_a: (forall (A B C:Point) (AB BC:Line)
(incAB:(Inc B AB /\ Inc A AB)) (incBC:(Inc C BC /\ Inc B BC))
(nAlgn : forall l : Line, ~ (Inc A l /\ Inc B l /\ Inc C l)),
AB <> BC).
Proof.
...
但这很麻烦,而且我必须创建三个不同版本的 nAlgn 以不同的顺序排列,这很容易管理但很烦人。
代码可以在这里找到:https://github.com/GiacomoMaletto/Hilbert/blob/master/hilbert.v
(顺便说一句,任何其他 cmets 的风格或任何赞赏)。
【问题讨论】:
-
是否有可能有一个可编译的示例(可能是某个工作存储库的链接)?这看起来确实可以自动化,但如果没有看到证明状态就很难做到。
refine (ex_intro _ AB _). ...,这似乎是等价的:exists AB, BC, CA.。