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を削除し、それを証明したいと言うはずです
content(without(x,l)) == content(l) -- セット(x)
それを行う方法のスケッチを教えてもらえますか? SetDifferenceなどの BuiltInNamesを使用する必要がありますか?