如何使 Z3 的 (Python) SAT 求解偏向某个标准,例如“更喜欢”具有更多否定文字

2023-12-08

在 Z3 (Python) 中,有什么方法可以将 SAT 搜索“偏向”“标准”吗?

一个案例:我想要Z3获取一个模型,但不是任何模型:如果可能的话,给我一个具有大量否定文字的模型。

因此,举例来说,如果我们必须搜索A or B一个可能的模型是[A = True, B = True],但我宁愿收到模型[A = True, B = False]或型号[A = False, B = True],因为他们有更多False作业。

当然,我想“标准”必须更加具体(比如说,如果可能的话:我更喜欢带有half字面量为 False),但我认为这个想法是可以理解的。

我不在乎该方法是否是本机的。有什么帮助吗?


z3 中有两种主要方法来处理此类问题。使用优化器,或者通过多次调用求解器来手动计算。

使用优化器

正如阿克塞尔指出的,处理这个问题的一种方法是使用优化求解器。您的示例将编码如下:

from z3 import *

A, B = Bools('A B')

o = Optimize()
o.add(Or(A, B))
o.add_soft(Not(A))
o.add_soft(Not(B))

print(o.check())
print(o.model())

这打印:

sat
[A = False, B = True]

您可以向软约束添加权重,这提供了一种在违反约束时关联惩罚的方法。例如,如果你想制作A如果可能的话是真的,但不太关心B,那么你就会将更大的惩罚与Not(B):

from z3 import *

A, B = Bools('A B')

o = Optimize()
o.add(Or(A, B))
o.add_soft(Not(A))
o.add_soft(Not(B), weight = 10)

print(o.check())
print(o.model())

这打印:

sat
[A = True, B = False]

思考这个问题的方法如下:你要求 z3:

  • 满足所有常规约束。 (即,您放入的那些add)
  • 满足尽可能多的软约束(即,您放入的软约束)add_soft。)如果不可能有一个解决方案能够满足所有这些条件,那么求解器就可以“违反”它们,尝试最小化所有违反约束的总成本(通过权重求和来计算)。
  • 当没有给出权重时,您可以假设它是1。您也可以对这些约束进行分组,尽管我怀疑您是否需要这种通用性。

所以,在第二个例子中,z3 违反了Not(A),因为这样做的成本为1,同时违反Not(B)将会产生以下费用10.

请注意,当您使用优化器时,z3 使用的引擎与其用于常规 SMT 求解的引擎不同:特别是,该引擎是not增加的。也就是说,如果你打电话check两次(在引入一些新的约束之后),它将从头开始解决整个问题,而不是从第一次的结果中学习。此外,优化求解器并不像优化作为常规求解器(双关语!),因此它通常在直接可满足性方面表现也较差。看https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/nbjorner-nuz.pdf了解详情。

手动接近

如果您不想使用优化器,您也可以使用跟踪变量的想法“手动”执行此操作。这个想法是识别软约束(即那些可能以一定成本违反的约束),并将它们与跟踪器变量相关联。

这是基本算法:

  • 列出你的软约束。在上面的例子中,他们将是Not(A) and Not(B)。 (也就是说,您希望这些满足给您负数文字,但显然您希望只有在可能的情况下才满足这些。)调用这些S_i。假设你有N其中。

  • 对于每个这样的约束,创建一个新的跟踪器变量,该变量将是一个布尔值。打电话给这些t_i.

  • Assert N常规约束,每种形式Implies(t_i, S_i),对于每个软约束。

  • 使用伪布尔约束,其形式为AtMostK,最多强制K这些跟踪器变量t_i是假的。然后使用类似于二分搜索的模式来找到最佳值K。请注意,由于您使用的是常规求解器,因此您可以在增量模式下使用它,即调用push and pop.

有关此技术的详细说明,请参阅https://stackoverflow.com/a/15075840/936310.

Summary

上述两种方法中哪一种有效取决于问题。从最终用户的角度来看,使用优化器是最简单的,但您会引入可能不需要的重型机械,因此可能会遭受性能损失。第二种方法可能更快,但存在编程更复杂(因此容易出错!)的风险。像往常一样,进行一些基准测试,看看哪种方法最适合您的特定问题。

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

如何使 Z3 的 (Python) SAT 求解偏向某个标准,例如“更喜欢”具有更多否定文字 的相关文章

  • 哪里可以找到 z3py 教程

    由于某些安全问题 rise4fun z3py 将在几周内不可用 我试图找到一些学习z3py的资源但徒劳无功 请推荐一些学习z3py的资源 我使用 Z3Py 教程源创建了一个 zip 文件 它基本上是一些 HTML 页面和一堆 python
  • 如何使用 z3py 进行增量求解

    我正在使用 Z3 求解器的 python API 来搜索优化的时间表 它工作得很好 除了有时即使对于小图也非常慢 但有时非常快 原因可能是我的调度问题的约束相当复杂 我试图加快速度 并偶然发现了一些关于增量解决方案的文章 据我了解 您可以使
  • 简化 CNF 公式,同时保留某些变量的所有解决方案

    有关的 CNF 简化 https stackoverflow com questions 23461191 cnf simplification 事实上 我认为这个问题的提交者可能是在追求我想要的东西 有许多工具可用于简化 或求解前 预处理
  • 如何阅读 Coq 对 proj1_sig 的定义?

    In Coq sig定义为 Inductive sig A Type P A gt Prop Type exist forall x A P x gt sig P 我读为 sig P 是一种类型 其中 P 是一个接受 A 并返回 Prop
  • Z3 对指数的支持

    我是 Z3 的新手 我试图了解它是如何工作的 以及它能做什么和不能做什么 我知道Z3至少有some通过幂 运算符支持指数 请参阅Z3py 使用 pow 函数返回未知方程 https stackoverflow com questions 3
  • 解决命题逻辑/布尔表达式的工具(SAT Solver?)

    我对命题逻辑和布尔表达式主题很陌生 所以这就是我需要帮助的原因 这是我的问题 在汽车行业 当您购买汽车时 有数千种不同的组件可供选择 并非每个组件都是可组合的 因此对于每辆车都存在许多用命题逻辑表达的规则 就我而言 每辆车都有 2000 到
  • 跟踪 z3::optimize unsat_core

    如何正确追踪z3 optimize未饱和核心 Z3 C z3 optimize当我添加时没有找到预期的解决方案不饱和核心跟踪 基于这些examples https github com Z3Prover z3 blob 9df6c10ad8
  • 在 Z3 中定义带有约束的代数数据类型

    我看过一些在线材料 用于定义代数数据类型 例如 Z3 中的 IntList 我想知道如何定义具有逻辑约束的代数数据类型 例如 如何定义代表正整数的 PosSort SMT中的全部功能 在 SMT 中函数总是完整的 这提出了如何对部分函数 例
  • 任意长度的通用位向量类型

    出于与此处描述相同的原因 用户定义的未解释函数 https stackoverflow com questions 7740556 equivalent of define fun in z3 api 我想定义我自己的未解释函数 bvred
  • 在 Mac OS X 上构建 z3

    我正在尝试建立Z3 http z3 codeplex com releases view 95640在 Mac OS X 上 按照 README 文件 我刚刚执行了 autoconf configure make 收到错误 omp h 文件
  • z3 是否支持有理算术的输入约束?

    事实上 SMT LIB标准是否有理性的 不仅仅是真实的 排序 按其website http smtlib cs uiowa edu theories shtml 它不是 如果 x 是有理数并且我们有约束 x 2 2 那么我们应该返回 不可满
  • 如何在 MMT 中粘合/识别两个结构中的内含物?

    我想形式化形式语言及其语义MMT https uniformal github io 并定义一个一般概念语义等价两种语义 one句法 准确地说 对后者进行编码实际上是一种识别 粘合 我不知道如何在 MMT 中做到这一点 接下来让我详细说明我
  • Z3 求解器中 MAxSMT 和用户定义成本函数的组合

    我正在使用 Z3 来优化带有一些软约束 带有加权 MaxSMT 的成本函数 我很好奇 MaxSMT 和用户定义的成本函数如何交互 求解器是否最小化 MaxSMT 成本和目标函数两者 是否有优先级机制 我找不到这方面的任何文档 如果我遗漏了什
  • 尝试在Python中使用Z3找到布尔公式的所有解决方案

    我是 Z3 的新手 正在尝试制作一个求解器 将每个可满足的解决方案返回到布尔公式 从其他 SO 帖子中记下笔记 我已经编写了我希望能起作用的代码 但事实并非如此 问题似乎是 通过添加以前的解决方案 我删除了一些变量 但它们又在后面的解决方案
  • 根据求解器的决定执行 get-model 或 unsat-core

    我想知道 SMT LIB 2 0 脚本中是否有可能访问求解器的最后一个可满足性决策 sat unsat 例如 以下代码 set option produce unsat cores true set option produce model
  • (Z3Py) 声明函数

    我想在简单的 result x t c 公式中找到一些给定结果 x 对的 c 和 t 系数 from z3 import x Int x c Int c t Int t s Solver f Function f IntSort IntSo
  • Z3 Java API 定义函数

    我需要您帮助使用 Z3 Java API 定义函数 我尝试解决这样的问题 与 z3 exe 进程一起工作正常 declare fun a Real declare fun b Real declare fun c Bool define f
  • 如何解决 Z3 中的最小化约束?

    谁能告诉我如何通过 Z3py 实现最小化整数问题 如下所示 我如何定义所有语句 这里所有的变量都是int排序的 Z3中有没有专门的求解器可以解决此类问题 如果有的话 我该如何设置该解算器的配置 Thanks 以下是一些相关 类似的问题和答案
  • 通过 C/C++ API 对 Z3 中的 LIA 进行量词消除

    我想使用 Z3 通过 C C API 消除线性整数算术公式中的量词 考虑一个简单的例子 Exists x x 0 我尝试这样做 context ctx ctx set ELIM QUANTIFIERS true expr x ctx int
  • Z3 python对待x**2与x*x不同?

    看来Z3 Python接口不喜欢 运算符 它可以处理x x但不能处理x 2 如下例所示 gt gt gt x y x y Reals x y gt gt gt z3 prove Implies x 6 0 x 2 36 0 failed t

随机推荐

  • 如何将多个 csv 文件(不同架构)加载到 bigquery 中

    I have 6 500 csv files with 250 different schema s i e These files are from the F D I C USA bank regulator dataset They
  • 张量流中的非全连接层

    我想创建一个网络 其中输入层节点仅连接到下一层中的某些节点 这是一个小例子 到目前为止 我的解决方案是设置边缘的权重i1 and h1为零 并且在每个优化步骤之后 我将权重乘以一个矩阵 我称之为矩阵掩码矩阵 其中每个条目都是 1 除了之间的
  • 我可以在 Perl 中抑制来自 fetch.pm 的错误消息吗

    当使用 Fetch 从 Teamcity 下载 url 时 我收到 Fetch failed 错误 但文件的下载确实有效 他们最近更改了我们的 Teamcity 服务器的权限 因此我在获取要下载的文件的 URL 时必须使用用户名和密码 我只
  • 如何在android中将日期转换为特定格式?

    2016 年 3 月 10 日 6 30 00 PM 这是我的日期 我想将其转换为 2016 年 3 月 10 日 我可以在 android 中使用 SimpleDateFormat 吗 我没有得到转换它的确切模式 请帮忙并提前致谢 Str
  • 通过 PHP 清理 GET 中的用户数据[重复]

    这个问题在这里已经有答案了 如何通过 PHP 清理 GET 变量中的数据 我只清理 GET 中的一个变量strip tags 我不确定是否应该清理所有内容 因为上次将数据放入 Postgres 时 问题最容易通过使用来解决pg prepar
  • 使用 PHP 爬取网站,但网站运行 JS 生成标记

    过去几周我一直在进行网络爬虫 使用 PHP 库 PHP Simple DOM 我运行一个 php 脚本 使用终端 来从中获取一些 URL 和 JSON 一些数据 到目前为止 这一直工作得很好 最近想扩展对特定网站的爬取 遇到了以下问题 与迄
  • 在pyqt6中,如何播放音频?

    我想播放 mp3 音频文件 我看过文档 文档编写了以下代码 player QMediaPlayer audioOutput QAudioOutput player setAudioOutput audioOutput connect pla
  • 在列中查找单词并将下面的行复制到不同的工作表上

    我的源数据与表不对齐 我想查找文本 例如帐户 复制单元格下方的两整行以及找到的文本 帐户 并将它们粘贴到不同的工作表上 然后往下查找 再做 直到数据结束 数据应按到达的顺序粘贴 带有单词 Account 的单元格将始终位于 A 列中 搜索应
  • Python 3从另一个函数更改函数中的变量[重复]

    这个问题在这里已经有答案了 我想从 testadder 访问 main 中的测试变量 这样在 main 中调用 testadder 后它将添加 1 到测试中 由于某种原因 我可以用这种方式将 1 添加到列表中 但不能添加变量 非局部声明不起
  • 使用 Firebase Cloud Function iOS 推送通知

    尝试通过 firebase 云功能发送远程推送通知 我一直关注的资源通过以下方式实现了这一目标sendToDevice方法 它接受一个 String 作为参数 来自 GitHub 的资源表示 它是一个 设备通知令牌 当用户同意在应用程序中接
  • 如何在 ASP.NET MVC 上执行 Azure Active Directory 单点登录和表单身份验证

    我们有 MVC 4 开发的遗留系统 使用表单身份验证和 Web API 的基本身份验证 到目前为止还没有 OWIN 现在我们有很多客户想要单点登录我们的系统 因此我们使用 Azure Active Directory AAD 来存储客户的用
  • UITableViewCell 中 UITextView 的奇怪行为

    我有一个包含一些 stackview 的单元格 底部 stackView 包含一个 textView 和一个自定义分隔符 我想创建一个选项 当用户点击单元格时 它会显示点击文本视图的完整文本 因此该单元格中的最大行数为 0 其他单元格中的最
  • 导入错误:没有名为“psycopg2._psycopg”的模块

    当我尝试导入时psycopg2它为我显示以下日志 Traceback most recent call last File D Desktop learn python webcatch appserver testpgsql py lin
  • 托管 PHP 持续集成? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我只是想检查一下是否有人知
  • 屏幕旋转时片段被调用两次

    我是android新手 当屏幕方向改变时我遇到这个问题 这fragment每当屏幕方向改变时 就会被调用两次 下面是我的代码示例 我检查了其他帖子 但找不到答案 任何人都可以指导我完成这个任务 public class SampleFrag
  • 套接字接受 - “打开的文件太多”

    我正在做一个学校项目 我必须编写一个多线程服务器 现在我通过运行一些测试来将它与 apache 进行比较 我正在使用 autobench 来帮助解决这个问题 但在运行了一些测试后 或者如果我给它的速率太高 大约 600 来建立连接 我会收到
  • 无法在 UIButton 上自动换行

    我有一个简单的 UIButton 并尝试自动换行 但它总是在一行中显示超过按钮大小的文本 NSString text NSLocalizedString Start Loading Start Loading continueBtn tit
  • React/es6 导出 createClass 和 extends Component 之间的区别

    我从 React 和 es6 开始 并试图确定两者之间的真正区别 export const Voting React createClass and class Voting extends React Component 看来我可以用两者
  • 如何将许多现有文件与 drupal 文件字段关联起来?

    我的服务器上已经存储了许多来自静态网站的 mp3 文件 我们现在正在转向 drupal 我将为每个音频文件创建一个节点 但我不想再次上传每个文件 我宁愿将文件复制到我想要的 drupal 文件目录中 然后将节点与适当的文件关联 关于如何实现
  • 如何使 Z3 的 (Python) SAT 求解偏向某个标准,例如“更喜欢”具有更多否定文字

    在 Z3 Python 中 有什么方法可以将 SAT 搜索 偏向 标准 吗 一个案例 我想要Z3获取一个模型 但不是任何模型 如果可能的话 给我一个具有大量否定文字的模型 因此 举例来说 如果我们必须搜索A or B一个可能的模型是 A T