我正在阅读Idris tutorial。我无法理解以下代码。
disjoint : (n : Nat) -> Z = S n -> Void
disjoint n p = replace {P = disjointTy} p ()
where
disjointTy : Nat -> Type
disjointTy Z = ()
disjointTy (S k) = Void
到目前为止,我发现的是......
Void
是空类型,用于证明某些事情是不可能的。
替换:(x = y) - > P x - > P y replace使用等式证明来转换谓词。
我的问题是:
哪一个是平等证据? (Z = S n)?
哪一个是谓词? disjointTy
功能?
disjointTy
的目的是什么? disjointTy Z =()表示Z在一个类型“land”()和(S k)在另一个土地Void
?
Void输出以什么方式表示矛盾?
聚苯乙烯。我所知道的证明是“所有事情都没有匹配,那就是假的。”或者“发现一件相互矛盾的事情”......
答案 0 :(得分:2)
哪一个是平等证据? (Z = S n)?
p
参数是此处的相等证明。 p
的类型为Z = S n
。
哪一个是谓词?
disjointTy
函数?
是的,你是对的。
disjointTy
的目的是什么?
让我在此重复disjointTy
的定义:
disjointTy : Nat -> Type
disjointTy Z = ()
disjointTy (S k) = Void
disjointTy
的目的是谓词replace
函数需要。这种考虑决定了disjointTy
的类型,即。 [domain] -> Type
。由于我们在自然数之间具有相等性,[domain]
为Nat
。
要了解身体是如何构建的,我们需要再看一遍replace
:
replace : (x = y) -> P x -> P y
回想一下,我们p
为Z = S n
,因此上述类型的x
为Z
,y
为S n
。要致电replace
,我们需要构建P x
类型的术语,即P Z
。这意味着类型P Z
返回必须易于构造,例如单位类型是理想的候选者。我们已经证明了disjointTy Z = ()
定义的disjointTy
条款。当然,它不是唯一的选择,我们可以使用任何其他有人居住(非空)类型,如Bool
或Nat
等。
disjointTy
第二个子句中的返回值现在很明显 - 我们希望replace
返回Void
类型的值,因此P (S n)
必须为{ {1}}。
接下来,我们像这样使用Void
:
disjointTy
作为奖励,这是另一种证明:
replace {P = disjointTy} p ()
^ ^ ^
| | |
| | the value of `()` type
| |
| proof term of Z = S n
|
we are saying "this is the predicate"
我使用了disjoint : (n : Nat) -> Z = S n -> Void
disjoint n p = replace {P = disjointTy} p False
where
disjointTy : Nat -> Type
disjointTy Z = Bool
disjointTy (S k) = Void
,但可以使用False
- 这并不重要。重要的是我们能够构建True
类型的术语。
Void输出以什么方式表示矛盾?
disjointTy Z
的定义如下:
Void
它没有构造函数!无论如何都无法创建这种类型的术语(在某些条件下:像Idris'实现是正确的,Idris的基本逻辑是理智的等等)。因此,如果某些函数声称它可以返回data Void : Type where
类型的术语,那么必定会有一些可疑的东西。我们的函数说:如果你给我一个Void
的证明,我将返回一个空类型的术语。这意味着Z = S n
无法首先构建,因为它会导致矛盾。
答案 1 :(得分:1)
p : x = y
是一个相等的证据。所以p
是一个相等证明,Z = S k
是一个相等类型。P : a -> Type
都称为谓词,如IsSucc : Nat -> Type
。在布尔逻辑中,谓词会将Nat
映射为true或false。如果我们可以为它构建证明,那么谓词就成立了。如果我们能够构建它(prf : ItIsSucc 4
),那就确实如此。如果我们不能构建它(没有ItIsSucc Z
的成员),那就错了。Void
。阅读replace
来电Z = S k -> disjointTy Z -> disjointTy (S k)
,即Z = S K -> () -> Void
。因此,替换需要两个参数:证明p : Z = S k
和单位() : ()
,而且,我们有一个空白。顺便说一句,您可以使用您可以构建的任何类型,而不是()
,例如disjointTy Z = Nat
然后使用Z
代替()
。在依赖型理论中,我们构建了像prf : IsSucc 4
这样的证明。我们会说,我们有prf
证明IsSucc 4
是真的。 prf
也被称为IsSucc 4
的见证人。但仅凭这一点,我们才能证明事情是真的。这是Void
:
data Void : Type where
没有构造函数。因此,我们无法构建Void
所持有的证人。如果你以某种方式得到了prf : Void
,那么就会出现问题并且你有一个矛盾。