Z3有限域不';似乎没有什么意义

Z3有限域不';似乎没有什么意义,z3,sat,Z3,Sat,这是一个Z3程序,它创建了两个不相等的变量X和Y,并且有一个大小为2的域: var solver=ctx.MkSolver(); //A节 var T=ctx.mkFinitedOmansort(“T”,2); var a=ctx.mknumeric(0,T); var b=ctx.mknumeric(1,T); var x=ctx.MkConst(“x”,T); 变量y=ctx.MkConst(“y”,T); //B节 //var a=ctx.MkInt(0); //var b=ctx.MkI

这是一个Z3程序,它创建了两个不相等的变量X和Y,并且有一个大小为2的域:

var solver=ctx.MkSolver();
//A节
var T=ctx.mkFinitedOmansort(“T”,2);
var a=ctx.mknumeric(0,T);
var b=ctx.mknumeric(1,T);
var x=ctx.MkConst(“x”,T);
变量y=ctx.MkConst(“y”,T);
//B节
//var a=ctx.MkInt(0);
//var b=ctx.MkInt(1);
//var x=ctx.MkIntConst(“x”);
//变量y=ctx.MkIntConst(“y”);
//添加(ctx.MkLe(a,x),ctx.MkLe(x,b));
//添加(ctx.MkLe(a,y),ctx.MkLe(y,b));
//C节
//Assert(!ctx.MkEq(x,y));
//D节
Assert(ctx.MkImplies(ctx.MkEq(x,a),ctx.MkEq(y,b));
Assert(ctx.MkImplies(ctx.MkEq(x,b),ctx.MkEq(y,a));
Assert(ctx.MkImplies(ctx.MkEq(y,a),ctx.MkEq(x,b));
Assert(ctx.MkImplies(ctx.MkEq(y,b),ctx.MkEq(x,a));
//E节
//Assert(ctx.MkEq(x,a));
var status=solver.Check();
控制台写入线(状态);
Console.WriteLine(solver.Model);
Console.WriteLine(solver.Model.Eval(ctx.MkEq(x,a));
Console.WriteLine(solver.Model.Eval(ctx.MkEq(y,b));
//应该始终为true,但只有A和D部分未注释时不起作用?
Console.WriteLine(solver.Model.Eval(ctx.MkImplies(ctx.MkEq(x,a),ctx.MkEq(y,b));
我得到输出

SATISFIABLE
(define-fun y () T
  0)
(define-fun x () T
  0)
true
false
false
该模型显然不满足约束条件。我明确地计算了双重检查的第一个约束,事实上,它是错误的

如果我使用整数(第B节而不是第A节),或者添加其他约束(第C&E节),则不会出现相同的问题

我错过了什么?我想使用FiniteDomain,因为它比为整数添加边界更方便,但它的行为似乎完全不同。

解释说
FiniteDomain
仅用于数据日志引擎,在其他用途中被破坏

在Z3中使用枚举是在其他引擎中执行此操作的正确方法。

说明了
FiniteDomain
仅用于数据日志引擎,在其他用途中被破坏


在其他引擎的Z3中使用枚举是正确的方法。

这看起来确实很奇怪。请在上报告,并用您发现的内容更新此问题!如果
ctx.mknumeric
实际上没有实例化sort
FiniteDomain
的值,而是其他类型的值,则可以解释这一点。一些源代码注释建议使用
Context.FromInt
创建特定的有限域值。帕特里克:这也是我最初的想法,但在那些情况下,z3通常会抛出排序错误。(我使用Python接口复制了相同的内容,它的行为也很奇怪,就像OP发布的一样。)我想知道是否有某种潜在的假设,即有限域只能用于定点引擎(即horn子句),但如果是这样,z3仍然应该发出合理的错误消息。好奇。@alias让老师们存档了。这看起来确实很奇怪。请在上报告,并用您发现的内容更新此问题!如果
ctx.mknumeric
实际上没有实例化sort
FiniteDomain
的值,而是其他类型的值,则可以解释这一点。一些源代码注释建议使用
Context.FromInt
创建特定的有限域值。帕特里克:这也是我最初的想法,但在那些情况下,z3通常会抛出排序错误。(我使用Python接口复制了相同的内容,它的行为也很奇怪,就像OP发布的一样。)我想知道是否有某种潜在的假设,即有限域只能用于定点引擎(即horn子句),但如果是这样,z3仍然应该发出合理的错误消息。好奇,老师已经存档了。