簡體   English   中英

如何在 Coq 中定義 Xor 並證明其性質

[英]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)為真:
    • A 為真且 L 的所有元素都不為真;
    • A 為假,而 L 的元素之一為真。

這意味着我們需要在命題列表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_txor_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.

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