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 a
和 LT c b
对于 c > 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
所以 c > 5 and c < 5
。)
现在我知道了,可以通过依赖类型来表达量词。所以我为此写了一个简单的实现“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 a
和 LT c b
对于 c > 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
所以 c > 5 and c < 5
。)