DotNet 中的软断言 API
Soft Assertions in the DotNet API
我用 4.4.1 的最新不稳定版本做了一些实验,并得出结论,软断言对我来说效果很好,如下例所示:
(assert(! ((and ( <= P291 200)( >= P291 100))) :named R291mm ))
(assert-soft(! (( = P291 170)) :named R291d ):weight 7)
P291 有一个最小值和一个最大值 (100, 200) - 定义为硬约束 - 以及一个默认值,如果没有其他约束影响该值,则应选择默认值。
在命令行控制台上使用 Z3 我得到了预期的结果,但是当我使用我的 DotNet 应用程序时,通过 ParseSMTLIB2File 读取完全相同的文件并使用 Assert 或 AssertAndTrack(其他方法未定义)软断言似乎被忽略了。在调试器中仔细观察会发现在 Args 中只能找到硬约束。所以ParseSMTLIB2File好像不准备读软约束
我是否必须根据上下文设置特殊选项,还是我太早了?
如果我说得太早:是否有计划通过 DotNet API 提供软约束?如果答案是肯定的,时间范围是什么?
感谢
克里斯蒂安·J
很可能解析器函数还不支持它,而且它们永远不会支持的可能性不为零;这些实际上是从每个文件只包含一个 SMT 基准测试类型的问题而没有处理命令扩展(如 assert-soft)的时代开始的遗留功能。没有为 parse* 函数添加扩展的时间框架。
请注意,.NET API 已经包含 optimize
对象,因此可以通过 API 设置此类问题,这是首选方法。
我用 4.4.1 的最新不稳定版本做了一些实验,并得出结论,软断言对我来说效果很好,如下例所示:
(assert(! ((and ( <= P291 200)( >= P291 100))) :named R291mm ))
(assert-soft(! (( = P291 170)) :named R291d ):weight 7)
P291 有一个最小值和一个最大值 (100, 200) - 定义为硬约束 - 以及一个默认值,如果没有其他约束影响该值,则应选择默认值。
在命令行控制台上使用 Z3 我得到了预期的结果,但是当我使用我的 DotNet 应用程序时,通过 ParseSMTLIB2File 读取完全相同的文件并使用 Assert 或 AssertAndTrack(其他方法未定义)软断言似乎被忽略了。在调试器中仔细观察会发现在 Args 中只能找到硬约束。所以ParseSMTLIB2File好像不准备读软约束
我是否必须根据上下文设置特殊选项,还是我太早了?
如果我说得太早:是否有计划通过 DotNet API 提供软约束?如果答案是肯定的,时间范围是什么?
感谢
克里斯蒂安·J
很可能解析器函数还不支持它,而且它们永远不会支持的可能性不为零;这些实际上是从每个文件只包含一个 SMT 基准测试类型的问题而没有处理命令扩展(如 assert-soft)的时代开始的遗留功能。没有为 parse* 函数添加扩展的时间框架。
请注意,.NET API 已经包含 optimize
对象,因此可以通过 API 设置此类问题,这是首选方法。