- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我最近问了这个问题:
An agda proposition used in the type -- what does it mean?
并获得了关于如何使类型隐式和获得真正的编译时错误的深思熟虑的答案。
但是,我仍然不清楚如何创建具有依赖类型的值。
考虑:
div : (n : N) -> even n -> N
div zero p = zero
div (succ (succ n)) p= succ (div n p)
div (succ zero) ()
even : N -> Set
even zero = \top
even (succ zero) = \bot
even (succ (succ n)) = even n
data \bot : Set where
record \top : Set where
f : N -> N
f n = if even n then div n else div (succ n)
g : (n:N) -> (even n) -> (even (succ n)) -> N
g n p q = if evenB n then (div n p) else (div (succ n) q)
g 5 _ _
f n = g n ? ?
if evenB n then (div n q) else (whatever)
if evenB n then div (succ n) q else div n p
g : (n : N) -> (even n) -> N
g n p = if evenB n then (div n p) else (div (succ n) (odd p))
g : N -> N
g n =
let p = proofthat n is even
in
if evenB n then div n p else (div (succ n) (odd p))
g : N -> N
g n = if evenB n then let p = proofThatEven n in div n p else let q = proofThatEven succ n in div n q
最佳答案
功能和主张
将事物编码为命题和函数之间存在关键区别。让我们看一下作为数字关系和函数实现的_+_
。
功能当然是微不足道的:
_+_ : (m n : ℕ) → ℕ
zero + n = n
suc m + n = suc (m + n)
_+_
作为命题是数字的三元关系。对于数字
m
,
n
和
o
,它应精确地位于
m + n = o
时:
data _+_≡_ : ℕ → ℕ → ℕ → Set where
zero : ∀ { n } → zero + n ≡ n
suc : ∀ {m n o} → m + n ≡ o → suc m + n ≡ suc o
2 + 3 ≡ 5
:
proof : 2 + 3 ≡ 5
proof = suc (suc zero)
2 + 3 = 5
,程序员必须参与其中。
if
的显示限位器:您需要能够计算其第一个参数!
even
命题对于每个自然数实际上都是可计算的(我应该说是可确定的)。我们如何证明这一点?通过编写一个函数来决定它。
data ⊥ : Set where
¬_ : Set → Set
¬ A = A → ⊥
data Dec (P : Set) : Set where
yes : P → Dec P
no : ¬ P → Dec P
even
的含义:
EvenDecidable : Set
EvenDecidable = ∀ n → Dec (even n)
even
是可确定的,如果对于任何自然数
n
,我们可以显示
even n
或
¬ (even n)
。让我们证明这确实是正确的:
isEven : EvenDecidable
isEven zero = yes _
isEven (suc zero) = no λ ()
isEven (suc (suc n)) = isEven n
Dec
到
Bool
data Bool : Set where
true false : Bool
if_then_else_ : {A : Set} → Bool → A → A → A
if true then t else _ = t
if false then _ else f = f
isEven
,它返回
Dec
,而不是
Bool
。我们可以通过简单地忘记里面的证明来从
Dec
转换为
Bool
(
⌊
可以通过
\clL
输入,
⌋
可以通过
\clR
输入):
⌊_⌋ : {P : Set} → Dec P → Bool
⌊ yes _ ⌋ = true
⌊ no _ ⌋ = false
isEven
中使用
if
:
if ⌊ isEven n ⌋ then ? else ?
g
函数:您需要
even n
和
even (suc n)
的证明。这是行不通的,因为没有人可以同时提供这两种方式。实际上,我们甚至可以使用以下内容得出矛盾:
bad : ∀ n → even n → even (suc n) → ⊥
bad zero p q = q
bad (suc zero) p q = p
bad (suc (suc n)) p q = bad n p q
bad₂ : ∀ n → even n → even (suc n) → ℕ
bad₂ n p q = div (suc n) q
bad₃ : ∀ n → even n → even (suc n) → ℕ
bad₃ n p q = div n p
if
有问题。
odd
函数。如果我们知道该数字不是
even
,则应该能够证明后继者是
even
。我们将重用以前的否定。
agda-mode
可以只用
C-c C-a
填充右侧:
odd : ∀ n → ¬ even n → even (suc n)
odd zero p = p _
odd (suc zero) p = _
odd (suc (suc n)) p = odd n p
g
函数的所有要素:
g : ℕ → ℕ
g n = ?
even
函数询问数字是否为
isEven
:
g : ℕ → ℕ
g n with isEven n
... | isItEven = ?
isItEven
进行模式匹配,以找出结果是什么:
g : ℕ → ℕ
g n with isEven n
... | yes e = ?
... | no o = ?
e
是数字为
even
的证明,
o
是不是
even
(其类型为
¬ even n
)的证明。
e
可以直接与
div
一起使用,对于
o
,我们需要使用之前定义的
odd
函数:
g : ℕ → ℕ
g n with isEven n
... | yes e = div n e
... | no o = div (suc n) (odd n o)
if
的
Dec
if
来实现上述版本。
Bool
eans不携带任何其他信息。他们肯定没有提供我们需要的证据。我们可以编写
if
的变体,该变体可以使用
Dec
而不是
Bool
。这使我们能够将相关证明分发到
then
和
else
分支。
if-dec_then_else_ : {P A : Set} → Dec P → (P → A) → (¬ P → A) → A
if-dec yes p then t else _ = t p
if-dec no ¬p then _ else f = f ¬p
g : ℕ → ℕ
g n = if-dec isEven n
then (λ e → div n e)
else (λ o → div (suc n) (odd n o))
if
创建一个好的语法规则;在这种情况下,它几乎没有用:
if-syntax = if-dec_then_else_
syntax if-syntax dec (λ yup → yupCase) (λ nope → nopeCase)
= if-dec dec then[ yup ] yupCase else[ nope ] nopeCase
g : ℕ → ℕ
g n = if-dec isEven n
then[ e ] div n e
else[ o ] div (suc n) (odd n o)
with
?
with
构造。运作方式如下:
isEven
。为此,无需
with
,您实际上需要编写两个函数:
h₁ : (n : ℕ) → Dec (even n) → ℕ
h₁ n (yes e) = div n e
h₁ n (no o) = div (suc n) (odd n o)
h₂ : ℕ → ℕ
h₂ n = h₁ n (isEven n)
h₂
设置了我们要进行模式匹配的表达式,而
h₁
进行了实际的模式匹配。现在,在这样的中间表达式上进行模式匹配非常常见,因此Agda为我们提供了更为紧凑的表示法。
h : ℕ → ℕ
h n with isEven n
h n | yes e = div n e
h n | no o = div (suc n) (odd n o)
with
的行为就好像它添加了一个额外的参数,我们可以在其上进行模式匹配。您甚至可以同时在多个表达式上使用
with
:
i : ℕ → ℕ
i n with isCool n | isBig n
i n | cool | big = ?
cool
和
big
进行模式匹配,就好像该函数具有3个参数一样。现在,在大多数情况下,原始的左侧保持不变,如先前的功能所示(在某些情况下,它实际上可能有所不同,但我们目前无需处理)。对于这些情况,我们可以获得一个方便的快捷方式(尤其是在左侧较长时):
i : ℕ → ℕ
i n with isCool n | isBig n
... | cool | big = ?
关于 Agda (Agda):如何获得依赖类型的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18347542/
所以我试图理解为什么这段代码在 () data sometype : List ℕ → Set where constr : (l1 l2 : List ℕ)(n : ℕ) → sometype
我最近问了这个问题: An agda proposition used in the type -- what does it mean? 并获得了关于如何使类型隐式和获得真正的编译时错误的深思熟虑的
背景:我正在研究 Prabakhar Ragde 的 "Logic and Computation Intertwined" ,对计算直觉逻辑的绝妙介绍。在他的最后一章中,他介绍了使用 Agda 的一
我正在尝试了解 Categories 库,但我对 Agda 还很陌生,所以我正在寻找某种文档来解释在该库的实现中所做的选择。在自述文件中有一个链接到这样的东西,但它坏了。 最佳答案 对于将来登陆这里的
我目前正在 Agda 中实现常规数据结构的衍生物, 如 Conor McBride [5] 的 One-Hole Context 论文中所述。 Löh & Magalhães [3,4] 也在 OHC
阅读 this answer促使我尝试构造并证明多态容器函数的规范形式。构造很简单,但证明让我很困惑。以下是我尝试编写证明的简化版本。 简化版本证明了足够多态的函数,由于参数性,不能仅根据参数的选择来
我正在尝试遵循 McBride 的 How to Keep Your Neighbours in Order 的代码,并且无法理解为什么 Agda(我使用的是 Agda 2.4.2.2)给出以下错误信
在 Agda 中玩证明验证时,我意识到我对某些类型明确使用了归纳原则,而在其他情况下则使用模式匹配。 我终于在维基百科上找到了一些关于模式匹配和归纳原则的文字:“在 Agda 中,依赖类型模式匹配是该
我看到的所有否定,即 A -> Bottom in agda 形式的结论都来自荒谬的模式匹配。还有其他情况可以在agda中获得否定吗?依赖类型理论中是否还有其他可能的情况? 最佳答案 类型理论通常没有
我是 agda 的新手,正在阅读 http://www.cse.chalmers.se/~ulfn/papers/afp08/tutorial.pdf .我的浅薄知识以某种方式发现点阵图案不是很有必要
我有这样一个函数: open import Data.Char open import Data.Nat open import Data.Bool open import Relation.Bina
我是 Agda 的新手,我认为我在那个范式中仍然有问题需要思考。这是我的问题..我有一个类型 monoid 和一个类型 Group 实现如下: record Monoid : Set₁ where
我对类型理论和依赖类型编程还很陌生,最近正在试验 Agda 的各种功能。以下是我编写的记录类型 C 的一个非常简化的示例,它包含多个组件记录和一些我们可以用来证明事物的约束。 open import
我在 Cubical agda 工作,并试图为以后的证明建立一些通用的实用程序。其中之一是,对于任何类型 A,它与 Σ A (\_ -> Top) 类型“相同”,其中 Top是具有一个元素的类型。问题
我在学习 Agda by tutorial ,现在我正在阅读有关依赖对的信息。 所以,这是代码片段: data Σ (A : Set) (B : A → Set) : Set where _,_
我有以下几点: open import Agda.Builtin.Equality open import Agda.Builtin.Nat renaming (Nat to ℕ) open impo
我是 Agda 的新手,对此感到困惑。 open import Data.Vec open import Data.Nat open import Data.Nat.DivMod open impor
为什么函数组合 (∘) 和应用程序 ($) 有可用的实现 https://github.com/agda/agda-stdlib/blob/master/src/Function.agda#L74-L
我是第一次尝试 Agda,我已经定义了 Bool 数据类型及其基本函数,就像所有教程所说的那样: data Bool : Set where true : Bool false : Bool not
在下面的 Agda 程序中,我收到关于 one 定义中缺少大小写的警告,尽管 myList 仅适合 cons 案例。 open import Data.Nat data List (A : Set)
我是一名优秀的程序员,十分优秀!