- 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/
我正在尝试编写一个相当多态的库。我遇到了一种更容易表现出来却很难说出来的情况。它看起来有点像这样: {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE
谁能解释一下这个表达式是如何工作的? type = type || 'any'; 这是否意味着如果类型未定义则使用“任意”? 最佳答案 如果 type 为“falsy”(即 false,或 undef
我有一个界面,在IAnimal.fs中, namespace Kingdom type IAnimal = abstract member Eat : Food -> unit 以及另一个成功
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: What is the difference between (type)value and type(va
在 C# 中,default(Nullable) 之间有区别吗? (或 default(long?) )和 default(long) ? Long只是一个例子,它可以是任何其他struct类型。 最
假设我有一个案例类: case class Foo(num: Int, str: String, bool: Boolean) 现在我还有一个简单的包装器: sealed trait Wrapper[
这个问题在这里已经有了答案: Create C# delegate type with ref parameter at runtime (1 个回答) 关闭 2 年前。 为了即时创建委托(dele
我正在尝试获取图像的 dct。一开始我遇到了错误 The function/feature is not implemented (Odd-size DCT's are not implemented
我正在尝试使用 AFNetworking 的 AFPropertyListRequestOperation,但是当我尝试下载它时,出现错误 预期的内容类型{( “应用程序/x-plist” )}, 得
我在下面收到错误。我知道这段代码的意思,但我不知道界面应该是什么样子: Element implicitly has an 'any' type because index expression is
我尝试将 SignalType 从 ReactiveCocoa 扩展为自定义 ErrorType,代码如下所示 enum MyError: ErrorType { // .. cases }
我无法在任何其他问题中找到答案。假设我有一个抽象父类(super class) Abstract0,它有两个子类 Concrete1 和 Concrete1。我希望能够在 Abstract0 中定义类
我想知道为什么这个索引没有用在 RANGE 类型中,而是用在 INDEX 中: 索引: CREATE INDEX myindex ON orders(order_date); 查询: EXPLAIN
我正在使用 RxJava,现在我尝试通过提供 lambda 来订阅可观察对象: observableProvider.stringForKey(CURRENT_DELETED_ID) .sub
我已经尝试了几乎所有解决问题的方法,其中包括。为 提供类型使用app.use(express.static('public'))还有更多,但我似乎无法为此找到解决方案。 index.js : imp
以下哪个 CSS 选择器更快? input[type="submit"] { /* styles */ } 或 [type="submit"] { /* styles */ } 只是好
我不知道这个设置有什么问题,我在 IDEA 中获得了所有注释(@Controller、@Repository、@Service),它在行号左侧显示 bean,然后转到该 bean。 这是错误: 14-
我听从了建议 registering java function as a callback in C function并且可以使用“简单”类型(例如整数和字符串)进行回调,例如: jstring j
有一些 java 类,加载到 Oracle 数据库(版本 11g)和 pl/sql 函数包装器: create or replace function getDataFromJava( in_uLis
我已经从 David Walsh 的 css 动画回调中获取代码并将其修改为 TypeScript。但是,我收到一个错误,我不知道为什么: interface IBrowserPrefix { [
我是一名优秀的程序员,十分优秀!