我有一套武断的约束。例如:
A, B, C and D are 8-bit integers.
A + B + C + D = 50
(A + B) = 25
(C + D) = 30
A < 10我可以把它转换成一个可以由picosat解决的SAT问题(我不能让minisat在我的Mac上编译),也可以转换成一个CVC4可以解决的SMT问题。要做到这一点,我需要:
我的问题:
发布于 2018-11-18 23:32:26
在MiniZinc中,您只需编写一个约束编程模型:
set of int: I8 = 0..255;
var I8: A;
var I8: B;
var I8: C;
var I8: D;
constraint A + B + C + D == 50;
constraint (A + B) = 25;
constraint (C + D) = 30;
constraint A < 10;
solve satisfy;由于使用25 + 30 > 50,无法满足示例约束。
Z3的Python接口将允许以下内容:
from z3 import *
A, B, C, D = Ints('A B C D')
s = Solver()
s.add(A >= 0, A < 256)
s.add(B >= 0, B < 256)
s.add(C >= 0, C < 256)
s.add(A+B+C+D == 50)
s.add((A+B) == 25)
s.add((C+D) == 30)
s.add(A < 10)
print(s.check())
print(s.model())发布于 2017-05-20 05:29:53
概念上
建立一个电路,然后应用Tseitin变换。
您需要将加法和比较运算符表示为布尔逻辑。有一些标准的方法来建立一个电路为两个补码加法和两个补码比较.
然后,使用Tseitin变换将其转换为SAT实例。
在实践中
使用SAT前端,为您完成此转换。Z3会帮你处理的。STP也是。(这种转换有时被称为“钻头爆破”。)
发布于 2018-11-20 01:15:59
所以我有个答案。有一个名为基于SAT的约束求解器的程序,它将一系列约束作为S表达式,将整个过程转换为DIMACS文件,运行SAT求解器,然后将SAT求解器的结果转换回约束的结果。
糖是由田村桥幸( Naoyuki )开发的,用来解决数学难题,比如数独谜题。我发现编写复杂约束并运行它们非常简单。
例如,要找到625的平方根,可以这样做:
(int X 0 625)
(= (* X X) 625)第一行表示X从0到625。第二行说X*X是625。
这可能不像Z3那么简单和优雅,但它确实工作得很好。
https://stackoverflow.com/questions/44101068
复制相似问题