Z3 Solver Java API:意外行为

2023-12-22

通过向求解器添加条件,我想使用“solver.check()”检查是否存在解。因此,我创建了一个简单的示例来寻找 t1 的解决方案。我知道 t1 有一个解,即 t1 = 0。然而,求解器的状态不是“SATISFIABLE”。

public static void main(String[] args) {
        int h_max = 7;
        HashMap<String, String> cfg = new HashMap<String, String>();
        cfg.put("model", "true");
        Context ctx = new Context(cfg);
        FPSort s = ctx.mkFPSort(5, 20);
        Solver solver = ctx.mkSolver();
        Model model = null;

        // Initialize constants
        RealExpr half = ctx.mkFPToReal(ctx.mkFP(0.5, s));
        RealExpr g = ctx.mkFPToReal(ctx.mkFP(9.81, s));
        RealExpr hmax = ctx.mkInt2Real(ctx.mkInt(h_max));
        RealExpr v = ctx.mkFPToReal(ctx.mkFP((Math.sqrt(2*h_max*9.81)), s));

        // Create query Information
        RealExpr q2 = ctx.mkReal(1);
        RealExpr q2Min = (RealExpr) ctx.mkSub(q2, half);
        RealExpr q2Max = (RealExpr) ctx.mkAdd(q2, half);

        // Initialize constraints 
        RealExpr tmax = ctx.mkFPToReal(ctx.mkFP((Math.sqrt(2*h_max/9.81)), s));
        RealExpr t0 = ctx.mkReal(0);

        // Initialize sampling interval
        RealExpr ts = ctx.mkFPToReal(ctx.mkFP(Math.sqrt(2*h_max/9.81)+0.1, s));

        // Variable t1
        RealExpr t1 = ctx.mkRealConst("t1");

        // 0 <= t1 <= tmax
        BoolExpr c1 = ctx.mkGe(t1, t0);
        BoolExpr c2 = ctx.mkLe(t1,tmax);

        // Elapsed Times
        RealExpr tE = (RealExpr) ctx.mkAdd(ts, t1);

        // Add conditions to solver
        solver.add(c1);
        solver.add(c2);

        // Calculating tE2 % tmax, since tE2 > tmax
        RealExpr quotient = (RealExpr) ctx.mkDiv(tE, tmax);
        IntExpr factor = ctx.mkReal2Int(quotient);
        RealExpr t2 = (RealExpr) ctx.mkSub(tE, ctx.mkMul(factor, tmax));

        // Calculating the observation h2 with t2.
        RealExpr h2 = (RealExpr) ctx.mkSub(ctx.mkMul(v,t2), ctx.mkMul(half, t2, t2, g));

        // Defining constraint q2Min <= h2 < q2Max
        BoolExpr c3 = ctx.mkAnd(ctx.mkGe(h2, q2Min),ctx.mkLt(h2, q2Max));

        solver.add(c3);

        //System.out.println("solver c1: " + solver.check(c1));
        //System.out.println("solver c2: " + solver.check(c2));
        //System.out.println("solver c3: " + solver.check(c3));

        if (solver.check() == Status.SATISFIABLE) {
            model = solver.getModel();
            System.out.println("System is Satisfiable");
        }
        else {
            System.out.println("Unsatisfiable");
        }

    ctx.close();
    }

我发现了一些意想不到的行为。 例如,如果我尝试在执行“solver.check()”之前检查条件

System.out.println("solver c2: " + solver.check(c2));
System.out.println("solver c3: " + solver.check(c3));

它输出:

solver c2: UNKNOWN
solver c3: UNKNOWN

突然间,求解器的状态变为“可满足”。但如果我事先只检查一个条件,状态仍然是“无法满足”。

除此之外,如果我改变

t1 = ctx.mkRealConst("t1");

to

t1 = ctx.mkReal(0);

求解器也找到了一个解,并且求解器状态为“SATISFIABLE”。

为什么求解器有这种行为,我怎样才能让求解器找到解决方案?我可以尝试其他方法吗?


一般来说,当你写:

solver.check(c1)

you are not要求 z3 检查c1是可以满足的。您要求 z3 做的是检查您输入的所有断言是否可满足,假设c1是真的。这称为“根据假设进行检查”并记录在此处:https://z3prover.github.io/api/html/classcom_1_1microsoft_1_1z3_1_1_solver.html#a71882930969215081ef020ec8fec45f3 https://z3prover.github.io/api/html/classcom_1_1microsoft_1_1z3_1_1_solver.html#a71882930969215081ef020ec8fec45f3

一开始这可能会相当令人困惑,但它允许检查假设下的可满足性,而不必在全局范围内断言这些假设。

关于你为什么得到UNKNOWN。您正在使用浮点运算,并将其与实数混合并匹配。这会产生很多非线性约束,而 z3 并不能很好地处理这些约束。尽量保持逻辑分离:如果可以的话,不要将实数与浮点数混合。 (如果您对如何建模有疑问,请提出单独的问题。)

最后,写t1 = ctx.mkReal(0)与写作有很大不同t1 = ctx.mkRealConst("t1")。第一个问题处理起来要简单得多:t1只是 0。在第二种情况下,它是一个变量。因此,前者会导致 z3 更容易处理问题,这一点也不奇怪。再说一次,没有灵丹妙药,但首先不要以这种方式混合逻辑:如果你想在浮点上工作,请将所有内容保留在该区域中。如果你想以真正的价值观工作,那就让一切都保持真正的价值。这样你会获得更多的里程。如果你必须混合两者,那么你很可能会看到UNKNOWN结果。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Z3 Solver Java API:意外行为 的相关文章

  • Eclipse 在源代码管理中保存操作

    我们希望找到一种在签入之前执行代码标准的 轻量级 方法 我们真的很喜欢使用 Eclipse 内置的想法保存操作 go to Preferences gt gt Java gt gt Editor gt gt Save Actions 其中有
  • 在文本文件中写入多行(java)

    下面的代码是运行命令cmd并使用命令行的输出生成一个文本文件 下面的代码在 Eclipse 的输出窗口中显示了正确的信息 但在文本文件中只打印了最后一行 谁能帮我这个 import java io public class TextFile
  • 如何在android上的python kivy中关闭应用程序后使服务继续工作

    我希望我的服务在关闭应用程序后继续工作 但我做不到 我听说我应该使用startForeground 但如何在Python中做到这一点呢 应用程序代码 from kivy app import App from kivy uix floatl
  • 插入最大日期(独立于数据库)

    在我的本地设置中 我使用一个简单的 H2 数据库 托管 解决方案将有另一个 类似但不相同 数据库 我需要将最大可能日期插入到日期时间列中 我尝试使用 Instant MAX 但是 这会导致列中出现 169104626 12 11 20 08
  • 使用 JPA Criteria API 进行分页的总行数

    我正在系统中为实体实现 高级搜索 功能 以便用户可以使用该实体的属性上的多个条件 eq ne gt lt 等 来搜索该实体 我正在使用 JPA 的 Criteria API 动态生成 Criteria 查询 然后使用setFirstResu
  • 是什么决定了从 lambda 创建哪个函数式接口?

    请考虑这个例子 import java util function Consumer public class Example public static void main String args Example example new
  • org.apache.sling.api.resource,version=[2.3,3) -- 无法解析

    您好 我无法访问我的项目内容 我已经上传了从 CQ 访问内容所需的所有包 我唯一能看到的是 org apache sling api resource version 2 3 3 无法解析 这是否是异常的原因 如果是 请告诉我如何解决 中Q
  • Android在排序列表时忽略大小写

    我有一个名为路径的列表 我目前正在使用以下代码对字符串进行排序 java util Collections sort path 这工作正常 它对我的 列表进行排序 但是它以不同的方式处理第一个字母的情况 即它用大写字母对列表进行排序 然后用
  • 比较两个文本文件的最快方法是什么,不将移动的行视为不同

    我有两个文件非常大 每个文件有 50000 行 我需要比较这两个文件并识别更改 然而 问题是如果一条线出现在不同的位置 它不应该显示为不同的 例如 考虑这个文件A txt xxxxx yyyyy zzzzz 文件B txt zzzzz xx
  • 运行具有外部依赖项的 Scala 脚本

    我在 Users joe scala lib 下有以下 jar commons codec 1 4 jar httpclient 4 1 1 jar httpcore 4 1 jar commons logging 1 1 1 jar ht
  • 很好地处理数据库约束错误

    再一次 它应该很简单 我的任务是在我们的应用程序的域对象中放置一个具有唯一约束的特定字段 这本身并不是一个很大的挑战 我刚刚做了以下事情 public class Location more fields Column unique tru
  • react-native run-android 失败并出现错误:任务 ':app:dexDebug' 执行失败

    我使用的是 Windows 8 1 和react native cli 1 0 0 and react native 0 31 0 添加后react native maps对于该项目 我运行了命令react native upgrade并给
  • java.lang.NumberFormatException: Invalid int: "3546504756",这个错误是什么意思?

    我正在创建一个 Android 应用程序 并且正在从文本文件中读取一些坐标 我在用着Integer parseInt xCoordinateStringFromFile 将 X 坐标转换为整数 Y 坐标的转换方法相同 当我运行该应用程序时
  • 测试弱引用

    在 Java 中测试弱引用的正确方法是什么 我最初的想法是执行以下操作 public class WeakReferenceTest public class Target private String value public Targe
  • Cucumber Java 与 Spring Boot 集成 - Spring @Autowired 抛出 NullPointer 异常

    我正在为 Spring boot 应用程序编写 cucumber java 单元测试来测试每个功能 当我与 Spring Boot 集成时 Autowired 类抛出 NullPointer 异常 Spring Boot应用程序类 Spri
  • 游戏内的java.awt.Robot?

    我正在尝试使用下面的代码来模拟击键 当我打开记事本时 它工作正常 但当我打开我想使用它的游戏时 它没有执行任何操作 所以按键似乎不起作用 我尝试模拟鼠标移动和点击 这些动作确实有效 有谁知道如何解决这个问题 我发现这个问题 如何在游戏中使用
  • 替换后增量

    我自己已经有一个问题了 但我想扩展它后增量示例 https stackoverflow com questions 51308967 post increment with example char a D int b 5 System o
  • javafx android 中的文本字段和组合框问题

    我在简单的 javafx android 应用程序中遇到问题 问题是我使用 gradle javafxmobile plugin 在 netbeans ide 中构建了非常简单的应用程序 其中包含一些文本字段和组合框 我在 android
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • 带有 Maven Wrapper 的 Java 17 导致无法识别的 VM 选项“MaxPermSize=512m”

    I use OpenJDK 17 https jdk java net 17 使用 Maven Wrapper 3 8 2 从春季初始化 https start spring io Maven项目 JAR打包 Java 17 Spring

随机推荐

  • 定位轴标签

    如何在下图中将 y 轴标签从绘图区域的左侧移动到右侧 以及将 x 轴标签从绘图区域的下方移动到上方 谢谢 xleft lt c 1 2 2 5 xright lt c 2 2 5 2 75 ybottom lt c 1 2 2 5 ytop
  • prototype.constructor 的实际目的是什么[重复]

    这个问题在这里已经有答案了 在将其标记为重复之前我已阅读设置prototype constructor的目的是什么 https stackoverflow com questions 32961964 what is the purpose
  • 使用 iframe 嵌入视频 url 时出现 Chrome 错误 [重复]

    这个问题在这里已经有答案了 当我使用 iframe 将一些 url 嵌入到页面中时 我在 chrome 控制台中收到以下错误 为什么会发生这种情况 GET chrome extension boadgeojelhgndaghljhdicfk
  • 没有参数传递给自定义 DataTemplateSelector 的 SelectTemplate()。为什么?

    我正在使用一个CellTemplateSelector有条件地在 DataGrid 列中显示复选标记 方法SelectTemplate object item DependencyObject container of my DataTem
  • PHP:iCal 创建,如何在描述中换行

    我正在使用以下内容为 PHP 脚本创建 Outlook 日历邀请 然而 n 并没有在 Outlook 中给我一个新行 有没有办法做到这一点 如果你不能的话 那就显得很愚蠢了 function addToCalendar calEmail c
  • 选择影子根中的元素

    我想更改隐藏在影子根中的元素的属性 由于项目的性质 我无法直接引用 JS 中的文档 我只能使用自定义类 不适用于影子根 或 jQuery 但我不知道如何编写指向该文件的路径元素 该元素没有 部分 因此我无法在选择器中使用它 我已经尝试过的
  • PHP:回调函数

    PHP 中的某些函数需要回调函数 我如何自己在函数中执行此操作 首先 如何定义需要回调函数的函数 其次 如何提供自定义函数作为回调函数 如何提供常规函数 实例函数和静态函数 使用内置的call user func http php net
  • 使用Python从设备获取MAC地址

    我正在寻找一种方法 使用python 来获取layer II来自我本地网络上的设备的地址 Layer III地址是已知的 目标是构建一个脚本 定期轮询 IP 地址数据库 确保 MAC 地址没有更改 如果更改 则通过电子邮件向我发出警报 使用
  • 嵌入带有参数的 svg 对象

    谁有想法或提示 我想在 die svg 标签中嵌入一个 svg 对象并更改此参数 HTML SVG 未进行
  • 如何使用 Javascript 截断/切片/修剪字符串中的最后一个字符?

    我有一根绳子 12345 00 我希望它返回12345 0 我看过trim 但看起来它只是修剪空白并且slice我不明白这是如何运作的 有什么建议么 您可以使用子串 https developer mozilla org en US doc
  • 在 SQL Server 2008 R2 脚本向导中缺少脚本数据

    在我的 SQL Server 2008 R2 中 脚本向导的脚本选项屏幕在 表 视图选项 部分下查找我找到 脚本数据 行并希望将该选项设置为 True 但失败了 我没有找到任何脚本数据选项 为什么我的 SQL Server 2008 R2
  • PHP检查文件是否为音频文件

    我正在编写代码来上传音频文件 可以是任何格式 mp3 mp4 wav 等等 我不想编写所有 mime 类型的所有条件 然后检查上传的文件以验证 mime 类型 因为 我想接受所有音频文件 不仅仅是一两种格式 那么 有没有什么简单的方法来检查
  • Ionic 2 存储在卸载时不会清理 - 仅适用于已签名的 APK

    我正在使用 Ionic 2 存储来存储用户凭据 卸载应用程序时 存储不会清除 因此重新安装后 应用程序将获取先前用户的用户凭据 此问题仅发生在签名的 APK 中 在 Samsung on7 和 lenovo vivi 型号上进行了测试 卸载
  • iOS如何根据其中的UILabel制作UIView的动态宽度/自动布局

    我可能正在努力解决一些菜鸟问题 我有一个UIView其中我显示一些价格 我想要UIView根据价格具有动态宽度 如果是 1 欧元 那么它将是例如20pt 如果是 2300 欧元 那么就会像50pt宽度 我试图利用故事板的限制 但没有成功 是
  • Spring 和 /* url 模式

    我们有一个 的 url 模式并且请求到达我们的控制器 但我们总是得到 404 这是我们的 web xml
  • 谷歌面积图线下可变不透明度?

    我正在使用谷歌图表中的面积图 我想知道是否有办法设置每条线的不透明度 看这个例子 https developers google com chart interactive docs gallery areachart hl nl Simp
  • 如果参数为 NULL,如何从 WHERE 子句中删除条件

    我将 2 个参数传递给 PL pgSQL 函数 这是查询 SELECT FROM table WHERE col1 param1 AND col2 param2 两个参数都可以为 NULL 在这种情况下 应从WHERE clause 我怎样
  • 带 2 个按钮的警报

    我将在我的应用程序中添加一个指向网站的链接 用户将单击一个显示 网站 的按钮 然后将出现一个带有 2 个按钮的警报 其中一个按钮只是取消按钮 另一个按钮将打开网站 你能帮我解决这个问题吗 Thanks 将其放入您的头文件中 interfac
  • 使用互斥锁时尝试引用已删除的函数

    我在处理项目时遇到奇怪的错误 我创建了一个超级简单的示例来重现错误 我创建了一个类 我想在这个类中做的是为我的类提供一种 getter 函数来填充 a 的值struct 在主应用程序中 用户将实例化这个struct 将其传递给成员函数 并能
  • Z3 Solver Java API:意外行为

    通过向求解器添加条件 我想使用 solver check 检查是否存在解 因此 我创建了一个简单的示例来寻找 t1 的解决方案 我知道 t1 有一个解 即 t1 0 然而 求解器的状态不是 SATISFIABLE public static