【发布时间】:2017-09-30 22:45:16
【问题描述】:
如何让 Idris 自动证明两个值不相等?
p : Not (Int = String)
p = \Refl impossible
如何让 Idris 自动生成此证明? auto 似乎无法证明涉及 Not 的陈述。我的最终目标是让 Idris 自动证明向量中的所有元素都是唯一的,并且两个向量是不相交的。
namespace IsSet
data IsSet : List t -> Type where
Nil : IsSet []
(::) : All (\a => Not (a = x)) xs -> IsSet xs -> IsSet (x :: xs)
namespace Disjoint
data Disjoint : List t -> List t -> Type where
Nil : Disjoint [] ys
(::) : All (\a => Not (a = x)) ys -> Disjoint xs ys -> Disjoint (x :: xs) ys
f : (xs : List Type) -> (ys: List Type) -> {p1 : IsSet xs} -> {p2 : IsSet ys} -> {p3 : Disjoint xs ys} -> ()
f _ _ = ()
q : ()
q = f ['f1, 'f2] ['f3, 'f4]
【问题讨论】:
-
我认为可以通过使用带有自定义脚本的默认参数来查找证明。您必须将 f 的类型写为
f: (xs: List Type) -> (ys: List Type) -> {default (%runElab prfFinder) p1: IsSet xs} -> {default (%runElab prfFinder) p2: IsSet ys} -> {default (%runElab prfFinder) p3: Disjoint xs ys} -> (),其中prfFinder: Elab ()。但是不知道prfFinder的值怎么看。