[英]Disjunction Commutavity in Coq
我想有一個Ltac策略來執行Disjunction Commutavity的工作。 主要是,如果我在假設H
某處有一個子項P \\/ Q
, Ltac 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.