- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我写了一小段 Haskell 来弄清楚 GHC 如何证明对于自然数,你只能将偶数减半:
{-# LANGUAGE DataKinds, GADTs, KindSignatures, TypeFamilies #-}
module Nat where
data Nat = Z | S Nat
data Parity = Even | Odd
type family Flip (x :: Parity) :: Parity where
Flip Even = Odd
Flip Odd = Even
data ParNat :: Parity -> * where
PZ :: ParNat Even
PS :: (x ~ Flip y, y ~ Flip x) => ParNat x -> ParNat (Flip x)
halve :: ParNat Even -> Nat
halve PZ = Z
halve (PS a) = helper a
where helper :: ParNat Odd -> Nat
helper (PS b) = S (halve b)
核心的相关部分变为:
Nat.$WPZ :: Nat.ParNat 'Nat.Even
Nat.$WPZ = Nat.PZ @ 'Nat.Even @~ <'Nat.Even>_N
Nat.$WPS
:: forall (x_apH :: Nat.Parity) (y_apI :: Nat.Parity).
(x_apH ~ Nat.Flip y_apI, y_apI ~ Nat.Flip x_apH) =>
Nat.ParNat x_apH -> Nat.ParNat (Nat.Flip x_apH)
Nat.$WPS =
\ (@ (x_apH :: Nat.Parity))
(@ (y_apI :: Nat.Parity))
(dt_aqR :: x_apH ~ Nat.Flip y_apI)
(dt_aqS :: y_apI ~ Nat.Flip x_apH)
(dt_aqT :: Nat.ParNat x_apH) ->
case dt_aqR of _ { GHC.Types.Eq# dt_aqU ->
case dt_aqS of _ { GHC.Types.Eq# dt_aqV ->
Nat.PS
@ (Nat.Flip x_apH)
@ x_apH
@ y_apI
@~ _N
@~ dt_aqU
@~ dt_aqV
dt_aqT
}
}
Rec {
Nat.halve :: Nat.ParNat 'Nat.Even -> Nat.Nat
Nat.halve =
\ (ds_dJB :: Nat.ParNat 'Nat.Even) ->
case ds_dJB of _ {
Nat.PZ dt_dKD -> Nat.Z;
Nat.PS @ x_aIX @ y_aIY dt_dK6 dt1_dK7 dt2_dK8 a_apK ->
case a_apK
`cast` ((Nat.ParNat
(dt1_dK7
; (Nat.Flip (dt2_dK8 ; Sym dt_dK6))_N
; Nat.TFCo:R:Flip[0]))_R
:: Nat.ParNat x_aIX ~# Nat.ParNat 'Nat.Odd)
of _
{ Nat.PS @ x1_aJ4 @ y1_aJ5 dt3_dKa dt4_dKb dt5_dKc b_apM ->
Nat.S
(Nat.halve
(b_apM
`cast` ((Nat.ParNat
(dt4_dKb
; (Nat.Flip
(dt5_dKc
; Sym dt3_dKa
; Sym Nat.TFCo:R:Flip[0]
; (Nat.Flip (dt_dK6 ; Sym dt2_dK8))_N
; Sym dt1_dK7))_N
; Sym dt_dK6))_R
:: Nat.ParNat x1_aJ4 ~# Nat.ParNat 'Nat.Even)))
}
}
end Rec }
我知道通过 Flip 类型系列的实例转换类型的一般流程,但有些事情我无法完全遵循:
@~ _N
是什么意思? ?它是 x 的 Flip 实例吗?这与 @ (Nat.Flip x_apH)
有什么不同?我对 < >
都感兴趣和_N
Vềhalve
中的第一个 Actor :
dt_dK6
, dt1_dK7
Vàdt2_dK8
代表?我知道它们是某种等价证明,但哪个是哪个?Sym
向后遍历等价;
有什么作用?的呢?等价证明只是按顺序应用吗?_N
Và_R
后缀?TFCo:R:Flip[0]
VàTFCo:R:Flip[1]
Flip 的实例?
1 Câu trả lời
@~
是强制应用。
尖括号表示其所包含类型的自反强制,其角色由下划线字母给出。
因此
是一个等式证明 Nat.Flip x_apH
bình đẳngNat.Flip x_apH
名义上(作为相同的类型而不仅仅是相同的表示)。
PS有很多争论。我们看一下智能构造函数$WPS
我们可以看到前两个分别是x和y的类型。我们有证据证明构造函数参数是 Flip x
(在本例中,我们有 Flip x ~ Even
。然后我们有证明 x ~ Flip y
Và y ~ Flip x
。最后一个参数的值是 ParNat x
.
我现在将介绍 Nat.ParNat x_aIX ~# Nat.ParNat 'Nat.Odd
类型的第一个转换
我们从 (Nat.ParNat ...)_R
开始。这是一个类型构造函数应用程序。它解除了 x_aIX ~# 'Nat.Odd
的证明至Nat.ParNat x_aIX ~# Nat.ParNat 'Nat.Odd
. R
意味着它代表性地执行此操作,意味着类型是同构但不相同(在本例中它们是相同的,但我们不需要这些知识来执行转换)。
现在我们看证明的主体(dt1_dK7 ; (Nat.Flip (dt2_dK8 ; Sym dt_dK6))_N; Nat.TFCo:R:Flip[0])
. ;
意味着传递性,即按顺序应用这些证明。
dt1_dK7
Đúng x_aIX ~# Nat.Flip y_aIY
的证明.
如果我们看 (dt2_dK8 ; Sym dt_dK6)
. dt2_dK8
trình diễny_aIY ~# Nat.Flip x_aIX
. dt_dK6
类型为'Nat.Even ~# Nat.Flip x_aIX
。所以Sym dt_dK6
类型为Nat.Flip x_aIX ~# 'Nat.Even
Và(dt2_dK8 ; Sym dt_dK6)
类型为y_aIY ~# 'Nat.Even
因此(Nat.Flip (dt2_dK8 ; Sym dt_dK6))_N
证明 Nat.Flip y_aIY ~# Nat.Flip 'Nat.Even
.
Nat.TFCo:R:Flip[0]
是翻转的第一条规则,即 Nat.Flip 'Nat.Even ~# 'Nat.Odd'
.
将这些放在一起,我们得到 (dt1_dK7 ; (Nat.Flip (dt2_dK8 ; Sym dt_dK6))_N; Nat.TFCo:R:Flip[0])
类型为x_aIX #~ 'Nat.Odd
.
第二个更复杂的 Actor 阵容有点难计算,但应该遵循相同的原则。
关于haskell - 如何读取这个GHC核心 "proof"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26524223/
我想知道是否有人可以帮我回答这个问题。它来自以前的试卷,我可以为今年的考试准备好答案。 这个问题看起来太简单了,我完全迷路了,它到底在问什么? Consider the following secti
我在想这样一个事实,即我们可以证明一个程序有错误。我们可以对其进行测试以评估它或多或少具有抗错误性。 但是有没有办法(甚至理论上)证明程序没有错误? 对于简单的程序,例如“Hello World”,我
有时,当我在写应用风格的证明时,我想要一种修改证明方法的方法foo到 Try foo on the first goal. If it solves the goal, good; if it doe
到目前为止,我在Isabelle中使用以下样式编写了矛盾的证明(使用Jeremy Siek的模式): lemma "" proof - { assume "¬ " then hav
有一个树数据结构和一个flip方法。我想写一个证明,如果你申请flip方法到一棵树两次你得到初始树。我有一个目标 ⊢ flip_mytree (flip_mytree (mytree.branch t
您好,我正在尝试在精益证明助手中做一些数学运算,看看它是如何工作的。我决定玩交换环的幂等函数应该很有趣。这是我尝试过的: variables (A : Type) (R : comm_ring A)
我写了group的定义在 idris : data Group: Type -> Type where Unit: (x: t) -> Group t (*): Group t ->
我在 Idris 上工作了一点,我写了一个概率类型 - Float 介于 0.0 和 1.0 之间: data Probability : Type where MkProbability :
优化编译器的最终目的是在程序空间中搜索与原始程序等效但速度更快的程序。这已在实践中针对非常小的基本块完成:https://en.wikipedia.org/wiki/Superoptimization
我会写函数 powApply : Nat -> (a -> a) -> a -> a powApply Z f = id powApply (S k) f = f . powApply k f 并简单
我正在考虑尽量减少对尚未编写的应用程序的 future 影响。我试图避免任何 3rd 方产品,甚至避免特定于操作系统的调用。任何人都可以建议 future 证明应用程序的其他方法。这个想法是不必在 1
我最近开始学习Isabelle,但我找不到一个非常重要的问题的答案:一个人如何看到Isabelle发现的“证明”的逐步推理?我对“自动”或“通过爆炸使用Theorem_A”这样的行不满意,我想检查逐步
我在上一个问题 Using the value of a computed function for a proof in agda 中看到了一个检查函数的例子。 ,但我仍然无法解决这个问题。 这是一
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 5年前关闭。 Improve t
我想在 Isabelle 中使用 nat 类型,但我想重载一些现有的定义,例如加法。我写了以下代码: theory Prueba imports Main HOL begin primrec suma
我写了一小段 Haskell 来弄清楚 GHC 如何证明对于自然数,你只能将偶数减半: {-# LANGUAGE DataKinds, GADTs, KindSignatures, TypeFamil
我在 Idris 中编写了以下证明: n : Nat n = S (k + k) lemma: n * n = ((k * n) + k) + (1 + (((k * n) + k) +
我对向量谓词有以下定义,用于标识一个集合是否为集合(没有重复元素)。我使用类型级 bool 值定义成员资格: import Data.Vect %default total data ElemBool
首先,我必须说我试过了。真的。但是我在这一点上停留了 3 天,我需要继续前进并完成它。 我在 man 中找不到任何引用资料。我在 bash 引用中找到了 No references。我在圣经中找不到任
我注意到,在使用 Isabelle/HOL Isar 时,有几种方法可以处理通用量化。我正在尝试以适合本科生理解和重现的风格编写一些证明(这就是我使用 Isar 的原因!),我对如何以一种好的方式表达
Tôi là một lập trình viên xuất sắc, rất giỏi!