Idris 中的复杂量词?

Complex quantifiers in 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 < b”吗?

对于Nat比较你可以使用Data.Nat'sGT(大于),GTE(大于等于),LT(小于), LTE(小于等于)。所以 GT c aLT c b 对于 c > ac < 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 所以 c > 5 and c < 5。)