簡體   English   中英

Coq中的析取交換性

[英]Disjunction Commutavity in Coq

我想有一個Ltac策略來執行Disjunction Commutavity的工作。 主要是,如果我在假設H某處有一個子項P \\/ QLtac Com H會將Q \\/ P作為另一個假設添加到上下文中。

我嘗試通過公理提供可交換性規則並apply它; 但是它僅適用於簡單的假設,例如在R -> (P \\/ Q)失敗; 它應該添加到上下文R -> (Q \\/ P)

您可以使用setoid重寫庫,該庫允許您使用除相等以外的其他關系進行重寫。 以下代碼段顯示了在假設中如何用B \\/ A替換A \\/ B

Require Import Setoid.

Variables A B C : Prop.

Goal ~ (A \/ B -> C).
intros H.
rewrite or_comm in H.
Abort.

要實施您想要的策略,我們只需要復制假設並重寫其中即可。 注意使用fresh策略,該策略將生成新的假設名稱。

Ltac Comm H :=
  let H' := fresh "H" in
  pose proof H as H';
  rewrite or_comm in H'.

這是一個實際的Comm演示。

Goal ~ (A \/ B -> C).
intros H.
Comm H.
Abort.

編輯 Coq手冊中有關於setoid重寫的部分。 粗略地說,只要您證明該假設中出現的運算與該關系兼容,就可以用假設中的任何關系R重寫。 例如,如果我們將R設為<-> ,則上面的重寫是有效的,因為標准庫中存在引理,表明邏輯對等受到隱含的尊重。


請注意,我通常建議不要讓Coq名稱假設本身:這些名稱往往非常不穩定,這通常會導致證明腳本中斷。 根據經驗,如果要編寫完全不涉及自動選擇名稱的全自動證明腳本,則應讓Coq自行選擇名稱。 這是避免該問題的Comm的另一個版本。

Ltac Comm' H H' :=
  pose proof H as H';
  rewrite or_comm in H'.

Goal ~ (A \/ B -> C).
intros H.
Comm H H'.
Abort.

暫無
暫無

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

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