[英]How to define Xor in Coq and prove its properties
這應該是一個簡單的問題。 我是 Coq 的新手。
我想在 Coq 中定義獨占或(據我所知,這不是預定義的)。 重要的部分是允許多個命題(例如 Xor AB C D)。
我還需要兩個屬性:
(Xor A1 A2 ... An)/\~A1 -> Xor A2... An
(Xor A1 A2 ... An)/\A1 -> ~A2/\.../\~An
我目前無法為未定義數量的變量定義 function。 我試圖為兩個、三個、四個和五個變量手動定義它(這就是我需要的數量)。 但是隨后證明這些屬性是一件痛苦的事情,而且似乎效率很低。
好吧,我建議你從 2 arguments 的 Xor 開始並證明它的屬性。
然后,如果你想概括它,你可以定義 Xor 並獲取 arguments 的列表——你應該能夠定義它並使用你的 2 參數 Xor 證明它的屬性。
我可以提供更多細節,但我認為自己做會更有趣,讓我知道它是怎么回事:)。
給定您的第二個屬性,我假設您對排他性或更高數量的定義是“這些命題中的一個是正確的”(而不是“這些命題中有一個奇數是正確的”或“這些命題中至少有一個是正確的並且至少有一個是錯誤的”,這是其他可能的概括)。
此排他或不是關聯屬性。 這意味着您不能將更高元數的 xor 定義為 xor(A1,…,An)=xor(A1,xor(A2,…))。 您需要一個全局定義,這意味着類型構造函數必須采用 arguments 的列表(或其他一些數據結構,但列表是最明顯的選擇)。
Inductive xor : list Prop -> Prop := …
您現在有兩個合理的選擇:從第一原理歸納地構建 xor 的定義,或者調用列表謂詞。 列表謂詞將是“列表中存在與該謂詞匹配的唯一元素”。 由於標准列表庫沒有定義這個謂詞,並且定義它比定義 xor 稍微難一些,我們將構建 xor 歸納。
參數是一個列表,所以讓我們分解案例:
(cons AL)
為真:
這意味着我們需要在命題列表nand
上定義一個輔助謂詞,以表征假命題列表。 這里有很多可能性:折疊/\
運算符、手動歸納或調用列表謂詞(同樣,不在標准列表庫中)。 我將手動感應,但折疊/\
是另一個合理的選擇。
Require Import List.
Inductive nand : list Prop -> Prop :=
| nand_nil : nand nil
| nand_cons : forall (A:Prop) L, ~A -> nand L -> nand (A::L).
Inductive xor : list Prop -> Prop :=
| xor_t : forall (A:Prop) L, A -> nand L -> xor (A::L)
| xor_f : forall (A:Prop) L, ~A -> xor L -> xor (A::L).
Hint Constructors nand xor.
您要證明的屬性是反轉屬性的簡單推論:給定構造類型,分解可能性(如果您有xor
,它是xor_t
或xor_f
)。 這是第一個的手動證明; 第二個非常相似。
Lemma xor_tail : forall A L, xor (A::L) -> ~A -> xor L.
Proof.
intros. inversion_clear H.
contradiction.
assumption.
Qed.
您可能需要的另一組屬性是nand
和內置連詞之間的等價關系。 例如,這里證明了nand (A::nil)
等價於~A
。 證明nand (A::B::nil)
等價於~A/\~B
等等只是更多的相同。 在正向方向上,這又是一個反轉屬性(分析nand
類型的可能構造函數)。 在向后的方向上,這是構造函數的簡單應用。
Lemma nand1 : forall A, nand (A::nil) <-> ~A.
Proof.
split; intros.
inversion_clear H. assumption.
constructor. assumption. constructor.
Qed.
在某些時候,您可能還需要替換和重新排列屬性。 這里有一些你可能想要證明的關鍵引理(這些應該不是很難,只要歸納正確的東西):
forall A1 B2 L, (A1<->A2) -> (xor (A1::L) <-> xor (A2::L))
forall K L1 L2, (xor L1 <-> xor L2) -> (xor (K++L1) <-> xor (K++L2))
forall KABL, xor (K++A::B::L) <-> xor (K::B::A::L)
forall KLMN, xor (K++L++M++N) <-> xor (K++M++L++N)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.