伊德里斯的定理证明

时间:2018-03-28 07:27:39

标签: idris theorem-proving

我正在阅读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使用等式证明来转换谓词。

我的问题是:

  1. 哪一个是平等证据? (Z = S n)?

  2. 哪一个是谓词? disjointTy功能?

  3. disjointTy的目的是什么? disjointTy Z =()表示Z在一个类型“land”()和(S k)在另一个土地Void

  4. Void输出以什么方式表示矛盾?

  5. 聚苯乙烯。我所知道的证明是“所有事情都没有匹配,那就是假的。”或者“发现一件相互矛盾的事情”......

2 个答案:

答案 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

回想一下,我们pZ = S n,因此上述类型的xZyS n。要致电replace,我们需要构建P x类型的术语,即P Z。这意味着类型P Z返回必须易于构造,例如单位类型是理想的候选者。我们已经证明了disjointTy Z = ()定义的disjointTy条款。当然,它不是唯一的选择,我们可以使用任何其他有人居住(非空)类型,如BoolNat等。

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)

  1. 是的,p : x = y是一个相等的证据。所以p是一个相等证明,Z = S k是一个相等类型。
  2. 同样是,通常任何P : a -> Type都称为谓词,如IsSucc : Nat -> Type。在布尔逻辑中,谓词会将Nat映射为true或false。如果我们可以为它构建证明,那么谓词就成立了。如果我们能够构建它(prf : ItIsSucc 4),那就确实如此。如果我们不能构建它(没有ItIsSucc Z的成员),那就错了。
  3. 最后,我们想要Void。阅读replace来电Z = S k -> disjointTy Z -> disjointTy (S k),即Z = S K -> () -> Void。因此,替换需要两个参数:证明p : Z = S k和单位() : (),而且,我们有一个空白。顺便说一句,您可以使用您可以构建的任何类型,而不是(),例如disjointTy Z = Nat然后使用Z代替()
  4. 在依赖型理论中,我们构建了像prf : IsSucc 4这样的证明。我们会说,我们有prf证明IsSucc 4是真的。 prf也被称为IsSucc 4的见证人。但仅凭这一点,我们才能证明事情是真的。这是Void

    的定义

    data Void : Type where

    没有构造函数。因此,我们无法构建Void所持有的证人。如果你以某种方式得到了prf : Void,那么就会出现问题并且你有一个矛盾。