如何证明在agda中存在一个小于某种理性的理性?

时间:2015-06-16 08:50:02

标签: agda

我想证明存在一种理性而不是某种理性。例如......

v : ℚ
v = + 1 ÷ 2

thm : (Σ[ x ∈ ℚ ] (x Data.Rational.≤ v))
thm = ?

在第二行写什么?

x∈ℚ的含义是什么,它会给出ℚ或什么的元素。

它定义在Set上,因为我在Stream中找到了它,并在那里定义了流。

1 个答案:

答案 0 :(得分:3)

您只需要遵循这些定义。

首先,我们来看看Σ的{​​{1}}部分是什么。此数据类型在模块Σ[ x ∈ ℚ ] x ≤ v中定义为Data.ProductΣ的全部内容只是一个语法糖,从以下几行可以看出:

所以我们真正需要构建的是syntax Σ-syntax A (λ x → B) = Σ[ x ∈ A ] B 类型。看一下Σ ℚ λ x → x ≤ v

的定义
Σ

这是一对,使用record Σ {a b} (A : Set a) (B : A → Set b) : Set (a ⊔ b) where constructor _,_ field proj₁ : A proj₂ : B proj₁ 构建。第一个元素是数字(见证),第二个元素是第一个元素满足给定命题(_,_)的证据。因此,应如下所示:

thm

我们已经知道第一个元素是一个数字(或者更确切地说,类型为thm = ? , ? )。所以我们在这里选择一个合适的号码 - 我选择,希望小于+ 1 ÷ 3

+ 1 ÷ 2

这给我们留下了第二个问号。在那里,我们需要thm = + 1 ÷ 3 , ? 类型的东西。我们再次看一下+ 1 ÷ 3 ≤ v

的定义

好的,这很容易:唯一的构造函数是data _≤_ : ℚ → ℚ → Set where *≤* : ∀ {p q} → ℚ.numerator p ℤ.* ℚ.denominator q ℤ.≤ ℚ.numerator q ℤ.* ℚ.denominator p → p ≤ q 所以我们不可能选错了:

*≤*

thm = + 1 ÷ 3 , *≤* ? 现在有这种类型:?(其中+ 2 ≤ + 3来自)。再说一次,我们来看看Data.Integer

的定义

这有点有趣,因为有三种可能的构造函数。但是,仔细看看,唯一相关的是data _≤_ : ℤ → ℤ → Set where -≤+ : ∀ {m n} → -[1+ m ] ≤ + n -≤- : ∀ {m n} → (n≤m : ℕ._≤_ n m) → -[1+ m ] ≤ -[1+ n ] +≤+ : ∀ {m n} → (m≤n : ℕ._≤_ m n) → + m ≤ + n ,因为双方的数字都是正数。

+≤+

唯一剩下的就是写一个thm = + 1 ÷ 3 , *≤* (+≤+ ?) 类型的术语(来自2 ≤ 3的{​​{1}})。我将把它作为读者的练习。

如果构造函数的选择是明确的,您可以使用Agda的Emacs模式为您完成大部分工作 - 您只需按(精炼),Agda就会为您编写证明条件。

我不喜欢写那样愚蠢的证据,计算机应该能够为我写Data.Nat证明 - 毕竟,C-c C-R 可判决

x ≤ v在标准库中定义:

因此,如果您可以编写二进制函数(让我们调用参数DecidableDecidable : ∀ {a b ℓ} {A : Set a} {B : Set b} → REL A B ℓ → Set _ Decidable _∼_ = ∀ x y → Dec (x ∼ y) data Dec {p} (P : Set p) : Set p where yes : ( p : P) → Dec P no : (¬p : ¬ P) → Dec P ),二元关系~是可判定的,它返回{{1}的证据}或反驳x(即y)。

幸运的是,x ~ y的可判定性证明可以在标准库中找到,可以在名称x ~ y下找到 - 我只需要编写相当简单的机制来提取证据来自那里(如果存在):

x ~ y → ⊥

≤?中提取证据;如果证据不存在(即某些open import Relation.Nullary FromDec : ∀ {A : Set} → Dec A → Set FromDec {A = A} (yes p) = A FromDec (no ¬p) = ⊤ fromDec : ∀ {A : Set} (d : Dec A) → FromDec d fromDec (yes p) = p fromDec (no ¬p) = _ 的参数为fromDec),则只返回空元组。

现在我们可以让计算机弄清楚Dec A是否成立。如果确实如此 - 那么我们只需用no ¬p提取计算出的证据就可以了;如果没有,¬p返回空元组,我们得到一个类型错误。

+ 1 ÷ 3 ≤ v