对于依赖类型,可以为排序列表定义归纳类型,例如:
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中是可行的,还是只支持前一种方法?
此外,就我自己的理解而言:后一种情况是反映"的证据的一个例子,是否存在后一种方法优于前者的情况?
答案 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);