我想证明Inox / Welder上集合的一些属性,但我缺乏帮助我弄清楚如何做到这一点的示例。说我想证明:
content(y::xs).contains(x) && x != y ==> content(xs).contains(x)
我定义属性:
def property(xs: Expr) =
forall("x"::A,"y"::A){case (x,y)
content(ConsA(y,xs)).contains(x) && x !== y ==> content(xs).contains(x)
}
但事实证明这个属性不会编译,因为它没有很好地制定(显然错误的部分是 .contains, &&, !==...)
那么,什么是制定财产的正确方法呢?在这里,我假设我有一个内容函数定义为:
val contentFunction = mkFunDef(contentID)("A") { case Seq(aT) => (
Seq("l" :: T(list)(aT)), SetType(aT), { case Seq(l) =>
if_ (l.isInstOf(T(cons)(aT))) {
SetAdd(E(contentID)(aT)(l.asInstOf(T(cons)(aT)).getField(tail)), l.asInstOf(T(cons)(aT)).getField(head))
} else_ {
FiniteSet(Seq.empty, aT)
}
})
}
关于证明部分,假设我被赋予了以下功能:
def without(x: A, xs: List[A]) = xs match{
case Nil() => Nil()
case y :: ys if(x == y) => without(x,ys)
case y :: ys if(x != y) => y :: without(x,ys)
}
这应该从列表 xs 中删除 x 并说我想证明
内容(没有(x,l))==内容(l)--设置(x)
你能给出一个如何做的草图吗?我应该使用诸如SetDifference 之类的 BuiltInNames 吗?