新博客文章:我写的一些傻乎乎的Z3脚本
摘要
Hillel Wayne分享了他编写的Z3脚本,讨论了逻辑性质方面的挑战以及他即将出版的书籍Logic for Programmers中的“糟粕”概念。
<p>现在我不再把所有时间花在Logic for Programmers上了,所以有时间再次更新我的网站!这是五个月来的第一篇博客文章:<a href="https://www.hillelwayne.com/post/z3-examples/" target="_blank">我写的一些傻乎乎的Z3脚本</a>。</p>
<p>通常我还会放上Patreon笔记的链接,但我决定不喜欢发布有门槛的内容,所以打算逐渐停止整个东西。下面是这篇帖子的一些快速说明:</p>
<ul>
<li>部分目的诚然是为了炒作LfP的最终发布。我想开始营销这本书,但又不想让营销材料缺乏趣味性,所以那些与书籍相关但独立的博客文章是一个不错的起点。</li>
<li>这篇文章讨论了“糟粕”的概念,即大量未收录进书中的材料(包括代码示例和散文)。这本书大约有5万字……但比糟粕的总量要少得多!我不<em>认为</em>大部分糟粕能变成有用的公开帖子,但我也不完全反对这个想法。也许有些旧章节可以改造成什么东西?</li>
<li>想出一个需要证明的条件数学性质很费劲。我有两个候选:<code>a == b * c => a / b == c</code>,这需要大篇幅讨论在Z3中除法必须是全函数;以及<code>a != 0 => some b: b * a == 1</code>,这需要引入量词(SMT在处理量词时真的很奇怪)。除零已经让我够头疼了,所以我选择了后者。这确实意味着在讨论数组时,我必须重新引入“运算必须是全函数”的概念。</li>
<li>我不知道为什么数组示例在最大利润上返回<code>2</code>而不是<code>99999999</code>。我猜当问题定义不良时,优化器中存在某种短路逻辑?</li>
<li>有一个例子我没能跑通,非常遗憾,那就是通过将哥德巴赫猜想编码为SMT问题来展示SMT求解器是不可判定的。任何涉及多重嵌套量词的问题都很麻烦。</li>
</ul>
查看缓存全文
缓存时间: 2026/05/16 03:39
# 新博客文章:我写的一些蠢萌 Z3 脚本
来源:https://buttondown.com/hillelwayne/archive/new-blog-post-some-silly-z3-scripts-i-wrote
既然现在我不再把所有时间花在《Logic for Programmers》上,就有时间更新我的网站了!所以,这是五个月来的第一篇博客文章:[一些我写的蠢萌 Z3 脚本](https://www.hillelwayne.com/post/z3-examples/)。
通常我还会放一个 Patreon 笔记的链接,但我决定不再喜欢发布付费内容,并且打算逐步关闭那整个功能。所以,关于这篇文章的一些简短说明:
* 部分目的诚然是为《LfP》的最终发布造势。我想开始宣传这本书,但又不希望宣传材料毫无趣味,所以一些与之相关但独立的博客文章是一个很好的起点。
* 这篇文章讨论了“冗余内容”(chaff)这个概念,即大量未能收录进书中的素材(包括代码示例和散文)。这本书大约有 5 万字……而且比总量庞大的“冗余内容”短得多!我 *不认为* 大部分内容可以转化为有用的公开文章,但我也不完全反对这个想法。也许有些老章节可以改造成点什么?
* 构思一个需要证明的条件数学性质相当困难。我有两个候选:`a == b * c => a / b == c`,这需要大篇幅讨论为什么 Z3 中的除法必须是总量的;以及 `a != 0 => some b: b * a == 1`,这需要引入一个量词(SMT 在处理量词方面真的很奇怪)。除以零的问题已经给我带来了足够多的麻烦,所以我选择了后者。这意味着在讨论数组时,我必须重新引入“操作必须是总量的”这一概念。
* 我完全不知道为什么数组示例返回的利润最大值是 `2` 而不是 `99999999`。我猜是当问题定义不明确时,优化器存在某种短路逻辑?
* 有一个例子我没能让它工作,这很可惜:将哥德巴赫猜想编码为 SMT 问题,以此展示 SMT 求解器是不可判定的。任何包含多层嵌套量词的问题都很棘手。
*如果你是在网页上读到这篇文章,可以[在此订阅](https://buttondown.com/hillelwayne)。每周更新一次。我的主站是[这里](https://www.hillelwayne.com/)。*
*我的新书《Logic for Programmers》现已进入早期访问阶段。*
相似文章
《Logic for Programmers》新版本(以及本通讯的未来)
Hillel Wayne 宣布其著作《Logic for Programmers》推出 0.14 版本,并透露将加入 Antithesis 担任开发者教育家,计划继续运营本通讯,但侧重点有所调整,频率可能降低。
《程序员逻辑》新版发布与下一步计划
Hillel Wayne 宣布其著作《程序员逻辑》发布 v0.13 版本,包含大量重写和新内容,并概述了迈向印刷版的下一步计划。
《Logic for Programmers》食物募捐活动只剩一周
Hillel Wayne为其书籍《Logic for Programmers》提供折扣,以此推广为Greater Chicago Food Depository举办的募捐活动,并分享了关于结构化并发和goto语句历史的技术笔记。
我对Prolog的不满
Hillel Wayne的一篇博文,详细讲述了他对Prolog编程语言的不满,包括字符串问题、缺乏函数、数据类型有限以及cut操作等。
256行或更少:测试用例最小化
一篇技术博客文章,描述了作者用约256行Zig代码实现的极简属性测试库,该库具有用于可复现测试用例生成和算法验证的有限随机数生成器。