Idris 中的复杂量词?

问题描述

现在我知道了,可以通过依赖类型来表达量词。所以我为此写了一个简单的实现“for all (a,b: N): exists (c: N): c = a + b”:

f : (a : Nat) -> (b : Nat) -> (c : Nat ** c = a + b)
f a b = (a + b ** Refl)

它有效。

现在我想知道,我可以表达这个“for all (a,b: N): exists (c: N): c > a and c

解决方法

对于 subdir3 比较,您可以使用 Data.Nat's Nat(大于)、GT(大于等于)、GTE(小于)、 LT(小于)。所以 LTEGT c a 代表 LT c bc > a

对于 c < b,您可以将两个证明放入一个元组:and。例如,如果您希望 (GT c a,LT c b) 它们,则可以使用 or

因此:

Either (GT c a) (LT c b)

(但是,这个确切的示例不起作用,因为您无法定义 import Data.Nat f : (a,b : Nat) -> (c : Nat ** (GT c a,LT c b)) ,因为没有 f 所以 c。)