我想证明存在一种理性而不是某种理性。例如......
v : ℚ
v = + 1 ÷ 2
thm : (Σ[ x ∈ ℚ ] (x Data.Rational.≤ v))
thm = ?
在第二行写什么?
x∈ℚ的含义是什么,它会给出ℚ或什么的元素。
它定义在Set上,因为我在Stream中找到了它,并在那里定义了流。
答案 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
可判决} EM>
x ≤ v
在标准库中定义:
≤
因此,如果您可以编写二进制函数(让我们调用参数Decidable
和Decidable : ∀ {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