作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 Idris 中写了以下命题:
total
plusOneCommutes : (n : Nat) -> (m : Nat) -> (n + S m = S n + m)
plusOneCommutes Z k = Refl
plusOneCommutes (S k) j =
let inductiveHypothesis = plusOneCommutes k j in
rewrite inductiveHypothesis in Refl
Prelude.Nat
的灵感源代码,我理解为什么使用递归调用(在第二种情况下)作为归纳假设来证明这种情况是有意义的。然而,通过漏洞重写的细节,我并没有真正理解发生了什么以及为什么会这样。
plusOneCommutes (S k) j = ?hole
- + HolyGrail.hole [P]
`-- k : Nat
j : Nat
------------------------------------------------------
HolyGrail.hole : S (plus k (S j)) = S (S (plus k j))
plusOneCommutes
的签名这个洞应该有类型
(plus (S k) (S j)) = (plus (S (S k)) j)
.
plusOneCommutes (S k) j =
let inductiveHypothesis = plusOneCommutes k j in
?hole
hole
变成:
- + HolyGrail.hole [P]
`-- k : Nat
j : Nat
inductiveHypothesis : k + S j = S k + j
-------------------------------------------------------------------------
HolyGrail.hole : S (plus k (S j)) = S (S (plus k j))
inductiveHypothesis
给出的重写规则
- + HolyGrail.hole [P]
`-- k : Nat
j : Nat
inductiveHypothesis : k + S j = S k + j
_rewrite_rule : k + S j = S k + j
-------------------------------------------------------------------------
HolyGrail.hole : (\replaced => S replaced = S (S (plus k j))) (S k + j)
S (plus (S k) j) = S (S (plus k j))
这是预期的类型,Idris 可以自动完成证明替换
?hole
与
Refl
.
- + Errors (1)
`-- HolyGrail.idr line 121 col 16:
When checking right hand side of plusOneCommutes with expected type
S k + S j = S (S k) + j
Type mismatch between
S (S (plus k j)) = S (S (plus k j)) (Type of Refl)
and
S (plus k (S j)) = S (S (plus k j)) (Expected type)
Specifically:
Type mismatch between
S (plus k j)
and
plus k (S j)
Type mismatch...
部分与上述步骤一致但不是
When checking ...
部分给出了我期望的类型。
最佳答案
编译器的以下内容实际上是有道理的:
- + HolyGrail.hole [P]
`-- k : Nat
j : Nat
------------------------------------------------------
HolyGrail.hole : S (plus k (S j)) = S (S (plus k j))
=
的左侧您拥有的类型
n + S m
.在
n
上进行模式匹配后你有
(S k)
并且应该有
S k + S j
类型为
plus (S k) (S j)
.在
this question我解释了一个重要的点:从事实如何
plus
函数已编写,事实上编译器可以在您看到的类型中执行模式匹配
S (plus k (S j))
刚刚申请
plus
至
(S k)
和
(S j)
.与
S n + m
类似的情况.
rewrite
.在 Agda 编程语言中
rewrite
只是
Refl
上模式匹配的语法糖.有时您可以替换
rewrite
在 Idris 中使用模式匹配,但在这种情况下不是。
total
plusOneCommutes : (n : Nat) -> (m : Nat) -> (n + S m = S n + m)
plusOneCommutes Z k = Refl
plusOneCommutes (S k) j = case plusOneCommutes k j of
prf => ?hole
- + HolyGrail.hole [P]
`-- k : Nat
j : Nat
prf : k + S j = S k + j
------------------------------------------------------
HolyGrail.hole : S (plus k (S j)) = S (S (plus k j))
prf
是证明
k + S j = S k + j
的东西这是有道理的。使用后
rewrite
:
plusOneCommutes (S k) j = case plusOneCommutes k j of
prf => rewrite prf in ?hole
- + HolyGrail.hole [P]
`-- k : Nat
j : Nat
prf : k + S j = S k + j
_rewrite_rule : k + S j = S k + j
-------------------------------------------------------------------------
HolyGrail.hole : (\replaced => S replaced = S (S (plus k j))) (S k + j)
rewrite
在 Idris 中的行为方式如下:
Refl : left = right
对象和 expr : t
. left
在 t
. left
与 right
在 t
. t
是 S (plus k (S j)) = S (S (plus k j))
Refl : plus k (S j) = plus (S k) j
left
是 plus k (S j)
right
是 plus (S k) j
plus k (S j)
(左)与 plus (S k) j
(右)在 t
我们得到 S (plus (S k) j) = S (S (plus k j))
. Idris 可以执行它所做的模式匹配。和 S (plus (S k) j)
自然变成S (S (plus k j))
. 关于dependent-type - 重写在 Idris 中究竟是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43013887/
Feel free to skip straight to TL/DR if you're not interested in details of the question 简短的序言: 我最近决定
我一直在阅读 A Tour of Go学习Go-Lang到目前为止一切顺利。 我目前在 Struct Fields类(class),这是右侧的示例代码: package main import "fm
Last time I got confused顺便说一下PowerShell急切地展开集合,基思总结了它的启发式如下: Putting the results (an array) within a
我是一名优秀的程序员,十分优秀!