如何使用.NET API在Z3中定义整数的加号函数?

时间:2013-10-11 07:32:21

标签: z3

使用 Z3 .NET API 我正在尝试做类似于以下示例的操作,我从Z3 Guide获取了

(define-sort A () (Array Int Int Int))
(define-fun bag-union ((x A) (y A)) A
  ((_ map (+ (Int Int) Int)) x y))
(declare-const s1 A)
(declare-const s2 A)
(declare-const s3 A)
(assert (= s3 (bag-union s1 s2)))
(assert (= (select s1 0 0) 5))
(assert (= (select s2 0 0) 3))
(assert (= (select s2 1 2) 4))
(check-sat)
(get-model)

如何定义+功能,以便我可以在MkMap中使用它?

1 个答案:

答案 0 :(得分:1)

MkMap需要一个函数声明,因此你需要获得对+函数声明的引用,你可以使用MkAdd并使用.FuncDecl获取对它的函数声明的引用。 Context z3 = new Context(); Sort twoInt = z3.MkTupleSort(z3.MkSymbol("twoInt"), new Symbol[] { z3.MkSymbol("a"), z3.MkSymbol("b") }, new Sort[] { z3.IntSort, z3.IntSort }); Sort A = z3.MkArraySort(twoInt, z3.IntSort); ArrayExpr x = z3.MkArrayConst("x", twoInt, z3.IntSort); ArrayExpr y = z3.MkArrayConst("y", twoInt, z3.IntSort); ArrayExpr map = z3.MkMap(z3.MkAdd(z3.MkIntConst("a"), z3.MkIntConst("b")).FuncDecl, x, y);

{{1}}