我如何形容伊德里斯的可除性?

时间:2018-10-14 04:02:06

标签: idris

我想证明,如果b(整数)除以a(整数),那么b也将除以* c(其中c是整数)。首先,我需要将问题重新表述为计算机可理解的问题,这是一个尝试:

-- If a is divisible by b, then there exists an integer such that a = b * n
divisibleBy : (a, b : Integer) ->
              (n : Integer **
              (a = b * n))

-- If b | a then b | ac.
alsoDividesMultiples : (a, b, c : Integer) ->
                       (divisibleBy a b) ->
                       (divisibleBy (a * c) b)

但是,我得到TypeUnification failure。我不太确定哪里出了问题。

  |
7 | alsoDividesMultiples : (a, b, c : Integer) ->
  |                      ^
When checking type of Numbris.Divisibility.alsoDividesMultiples:
Type mismatch between
        (n : Integer ** a = b * n) (Type of divisibleBy a b)
and
        Type (Expected type)

Specifically:
        Type mismatch between
                (n : Integer ** a = prim__mulBigInt b n)
        and
                TypeUnification failure


In context:
        a : Integer
        b : Integer
        c : Integer
        {a_509} : Integer
        {b_510} : Integer

1 个答案:

答案 0 :(得分:3)

在Idris中,命题由类型表示,而命题证明由那些类型的元素表示。此处的基本问题是,您已将divisibleBy定义为一个函数,该函数返回元素(即证明)而不是类型(命题)。因此,正如您在此处定义的,divisbleBy实际上是证明所有整数都可以被所有其他整数整除的证明,这显然是不正确的!我认为您实际上正在寻找的是这样的东西。

DivisibleBy : Integer -> Integer -> Type
DivisibleBy a b = (n : Integer ** a = b * n)

alsoDividesMultiples : (a, b, c : Integer) ->
                       DivisibleBy a b ->
                       DivisibleBy (a * c) b