簡體   English   中英

證明一個包含不存在的定理

[英]Proving a theorem containing not exists

我試圖從我正在閱讀的一篇論文中證明一個定理(Bennett,Having a Part Twice Over,2013 年),但我不知道如何解決子目標。

這是我應該用於證明的代碼:

Parameter Entity: Set.
Parameter F : Entity -> Entity -> Prop.
Parameter Ps : Entity -> Entity -> Prop.
Definition P x y := exists s, F x s /\ Ps s y.
Definition PP x y := P x y /\ ~ P y x.
Definition PPs x y := Ps x y /\ ~ F y x.
   
(* Mutual Occupancy is Identity *)
Axiom A6 : forall x y z1 z2,
  (Ps z1 y /\ F x z1) /\ (Ps z2 x /\ F y z2) -> x = y.

(* Single Occupancy *)
Axiom A7 : forall x y,
  Ps x y -> exists! z, F z x.

(* Anti-Symmetry *)
Theorem T8 : forall x y,
  (P x y /\ P y x) -> x = y.
Proof.
  unfold P.
  firstorder.
  apply A6 with (z1 := x1) (z2 := x0).
  auto.
Qed.

這是定理和我不完整的證明:

(* Composites <-> Slot-Composites *)
Theorem T12 : forall y,
  ((exists x, PP x y) <-> (exists z, PPs z y)).
Proof.
  unfold PP; unfold PPs; unfold P.
  intro b.
  split.
  (* left to right *)
  - intro Ea.
    destruct Ea as (a, PPab).
    destruct PPab as (Pab, nPba).
    destruct Pab as (c, Pab).
    destruct Pab as (Fac, Pscb).
    exists c.
    split.
    -- apply Pscb.
    -- admit.           (* Here! *)
  (* right to left *)
  - intro Ea.
    destruct Ea as (a, PPsab).
    destruct PPsab as (Psab, nFba).
    apply A7 in Psab as Ec.
    destruct Ec as (c, Fca).
    destruct Fca as (Fca, Uc).
    exists c.
    split.
    -- exists a.
       split.
       --- apply Fca.
       --- apply Psab.
    -- admit.            (* And here! *)
Admitted.

所以有兩個子目標我無法證明。 在每一個中,都有~ (exists s: Entity, F bs /\ Ps sa)作為假設或子目標。 我被困在這一點上。 根據論文中的證明,我應該在某個時候使用定理 T8,但我不明白如何。

第一個未解決的子目標上的 state 是

1 subgoal
b, a, c : Entity
Fac : F a c
Pscb : Ps c b
nPba : ~ (exists s : Entity, F b s /\ Ps s a)
______________________________________(1/1)
~ F b c

關於第二個:

1 subgoal
b, a : Entity
Psab : Ps a b
c : Entity
Fca : F c a
Uc : forall x' : Entity, F x' a -> c = x'
nFba : ~ F b a
______________________________________(1/1)
~ (exists s : Entity, F b s /\ Ps s c)

作為指導,以下是論文中寫的證明: 在此處輸入圖像描述 在此處輸入圖像描述

那我該怎么辦? (如果答案可以使用簡單的戰術而不是超級強大的自動戰術,那就更好了。這樣我可以理解。)

事實證明,您擁有完成目標所需的一切。 這是你定理的證明,不是自動的。 一些見解:

  • 非公式~P實際上等於P -> False ,您可以這樣對待它們(使用 intros、apply 等)。 如果您嘗試not展開自身,您會看到這一點。
  • 您可以分組展開: unfold P, PP, PPs
  • 您可以同時進行introsdestructintros [AB]等效於intros H. destruct H as (A,B)
  • 您可以將戰術與; tactic1; tactic2. tactic1; tactic2. 如果tactic1創建了多個子目標,則tactic2將應用於每個子目標。
  • 當一個策略(如split )創建多個子目標時,您還可以使用split; [ tactic1 | tactic2 ]. split; [ tactic1 | tactic2 ]. 如果您的策略創造了超過 2 個目標,也可以使用。
  • pose proof允許您將結果添加到您的假設中,而無需將其直接應用於目標(相反,您apply
  • assert (H: _)assert _ as H允許您進行正向推理:您可以 state 得到您想要的結果。 它將創建兩個目標,一個用於陳述的結果,一個用於先前的目標,結果作為附加假設H
(* Composites <-> Slot-Composites *)
Theorem T12 : forall y,
  ((exists x, PP x y) <-> (exists z, PPs z y)).
Proof.
  unfold PP, PPs, P. (* you can group unfolds *)
  intros b.
  split.
  - intros [a [[c [Fac Pscb]] nPba]]. (* using brackets allows you to destruct and intros at the same time *)
    exists c.
    split; [ assumption |]. 
    pose proof (A7 _ _ Pscb) as [d [Fdc Uc]].
    intros Fbc. 
    pose proof (Uc a Fac). subst.
    pose proof (Uc b Fbc). subst. 
    apply nPba.
    exists c; split.
    + apply Fbc.
    + apply Pscb.
  - intros [a [Psab nFba]].
    pose proof (A7 _ _ Psab) as [c [Fca Uc]].
    exists c.
    split.
    + exists a; split; eauto.
    + intros [d [Fbd Psdc]].
      apply nFba.
      assert (b = c) as Heqbc.
      * (* proof of a = c *)
        eapply A6 with (z1 := d) (z2 := a).
        repeat split; assumption.
      * rewrite Heqbc in *.
        apply Fca.        
Qed.

如果您圍繞這些結果進行大型開發,您可能會發現為您經常遇到的目標(或重寫)定義自己的自動化策略很有用。 一些 Coq 庫還旨在幫助您縮短證明,例如 SSReflect ( https://coq.inria.fr/refman/proof-engine/ssreflect-proof-language.html# ) 或 LibTactics ( https: //softwarefoundations. .upenn.edu/sf-4.0/UseTactics.html )例如。 它們需要比普通 Coq 學習更多的關鍵字和技術,但非常有用。 出於示例的目的,使用 SSReflect 的自動化證明可能看起來像這樣:

(* Composites <-> Slot-Composites *)
Theorem T12 : forall y,
  ((exists x, PP x y) <-> (exists z, PPs z y)).
Proof.
  unfold PP, PPs, P => b; split.
  - move => [a [[c [Fac Pscb]] nPba]].
    move : (A7 Pscb) => [d [Fdc Uc]].
    exists c; split => // => Fbc.
    apply nPba.
    exists c; split => //.
    rewrite -(Uc _ Fac) (Uc _ Fbc) => //.
  - move => [a [Psab nFba]].
    move: (A7 Psab) => [c [Fca Uc]].
    exists c; split; eauto.
    move => [d [Fbd Psdc]].
    assert (b = c) ; subst; eauto using A6.
Qed.

隨意評論您可能有的其他問題!

克萊門特

我不知道您可能已經擁有的所有其他公理或引理,並且可能需要這些公理或引理來證明這一點,但是在這里進行否定的一種方法可能是使用對立。 在 ssreflect 中,您會將nPba推到目標上,然后apply contra_not引理:

contra_not
     : ∀ P Q : Prop, (Q → P) → ¬ P → ¬ Q.

事情可能會更容易從那里取得進展。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM