伊德里斯的公设

Postulates in Idris

是否有任何关于 Idris 中 postulate 结构的性质和用途的最新信息? tutorial/manual 中没有关于该主题的任何内容,我似乎也无法在 wiki 中找到任何内容。 TIA.

我想我们要把 wiki 发展成更多的此类事情的参考: https://github.com/idris-lang/Idris-dev/wiki/Manual

postulate 的语法是:

postulate identifier : type

postulate n : Nat

postulate whyNot : 5 = 6

它引入了该类型的未指定值。当您需要一个您不知道如何引入的类型的实例时,这会很有用。 假设你想实现一些需要证明的东西,比如这个 Semigroup 类型类需要证明操作是结合的才能被认为是有效的半群:

class Semigroup a where
  op : a -> a -> a
  semigroupOpIsAssoc : (x, y, z : a) -> op (op x y) z = op x (op y z)

对于像 Nats 和 Lists 这样的东西来说,这很容易证明,但是对于像 machine int 这样的操作是在语言之外定义的东西呢?您需要证明 semigroupOpIsAssoc 给出的类型签名是有人居住的,但在语言中缺乏这样做的方法。所以你可以假设存在这样的东西,作为一种告诉编译器的方式 "just trust me on this one".

instance Semigroupz Int where
    op = (+)
    semigroupOpIsAssoc x y z = intAdditionIsAssoc
      where postulate intAdditionIsAssoc : (x + y) + z = x + (y +  z)

具有类似假设的程序仍然可以 运行 并使用,只要任何假设的 "values" 都无法从 运行 时间值(它们的值是多少?) .这对于相等项来说很好,除了类型检查外,它们不会在任何地方使用,并在 运行 时间被删除。一个例外是其值可以被删除的术语,例如单身人士 Unit 类型:

postulate foo : Unit

main : IO ()
main = print foo

仍然编译和 运行s(打印“()”); Unit 类型的值实际上并不是 show.

的实现所需要的