Idris是否支持展开函数定义?

时间:2017-07-07 15:57:18

标签: coq dependent-type idris type-theory

对于依赖类型,可以为排序列表定义归纳类型,例如:

data IsSorted : {a: Type} -> (ltRel: (a -> a -> Type)) -> List a -> Type where
  IsSortedZero : IsSorted {a=a} ltRel Nil
  IsSortedOne : (x: a) -> IsSorted ltRel [x]
  IsSortedMany : (x: a) -> (y: a) -> .IsSorted rel (y::ys) -> .(rel x y) -> IsSorted rel (x::y::ys)

然后可以用它来推断排序列表。

在Coq中,还可以编写函数Fixpoint is_sorted: {A: Type} (l: List A) : bool,然后通过is_sorted someList = true unfold的定义,使用类似is_sorted的类型来证明事物。 。后一种方法在Idris中是可行的,还是只支持前一种方法?

此外,就我自己的理解而言:后一种情况是反映"的证据的一个例子,是否存在后一种方法优于前者的情况?

1 个答案:

答案 0 :(得分:2)

我认为以下部分可以满足您的需求(我将添加一些警告,我没有使用Coq的经验):

is_sorted : {a: Type} -> (ltRel: a -> a -> Bool) -> List a -> Bool
is_sorted ltRel [] = True
is_sorted ltRel (x :: []) = True
is_sorted ltRel (x :: y :: xs) with (ltRel x y)
  | True = is_sorted ltRel (y :: xs)
  | False = False

is_sorted_true_elim : {x : a} -> is_sorted ltRel (x :: y :: xs) = True -> (ltRel x y = True, 
                                                                           is_sorted ltRel (y :: xs) = True)
is_sorted_true_elim {x} {y} {xs} {ltRel} is_sorted_x_y_xs with (ltRel x y) proof x_lt_y_value
  | True = ?hole
  | False = ?hole2

重要的细节是,如果你的函数定义是一组简单的方程式,那么当需要时,统一将在某种程度上神奇地将方程的一方替换为另一方。 (我使用效率较低的非短路版逻辑"和"运算符,因为标准"&&"或" if / then / else&#34 ;操作员引入懒惰的并发症。)

理想情况下,应该有一些简单的方法展开包含基于'的模式匹配的定义,但我不知道如何做到这一点,例如:

if (!int.TryParse("123", out var parsedNumber))
{
    return;
}

Console.WriteLine(parsedNumber);