我正在证明椭圆曲线上的某些属性,为此我依赖于一些处理现场操作的函数。但是,我不希望 Inox 对这些函数的实现进行推理,而只是假设它们具有某些属性。
比如说我证明点的加法p1 = (x1,y1) and p2 = (x2,y2)
是可交换的。为了实现点的加法,我需要一个在其组件(即字段的元素)上实现加法的函数。
添加将具有以下形状:
val addFunction = mkFunDef(addID)() { case Seq() =>
val args: Seq[ValDef] = Seq("f1" :: F, "f2" :: F)
val retType: Type = F
val body: Seq[Variable] => Expr = { case Seq(f1,f2) =>
//do the addition for this field
}
(args, retType, body)
}
对于这个函数,我可以声明如下属性:
val addAssociative: Expr = forall("x" :: F, "y" :: F, "z" :: F){ case (x, y, z) =>
(x ^+ (y ^+ z)) === ((x ^+ y) ^+ z)
}
where^+
只是与 add 相对应的中缀运算符,如另一个问题中所示。
插入正文中的正确表达式是什么,以便 Inox 在展开时不会在其上假设任何内容?