我对使用 z3 解决规划问题很感兴趣,但我很难找到示例。例如,我真的很想在 z3 中找到 Sussman 异常/方块世界的示例,但一直找不到任何东西。我的尝试看起来像
#!/usr/bin/env python
from z3 import *
blk = DeclareSort ("Block")
On = Function ("On", blk , blk, BoolSort () )
Above = Function ("Above", blk , blk, BoolSort () )
a, b, c, x, y, z = Consts ("a b c x y z", blk )
P0 = And(On(a,b), On(b,c))
P1 = ForAll([x, y], Implies(On(x,y), Above(x,y)))
P2 = ForAll([x, y, z], Implies(And(On(x,y), Above(z, y)), Above(x,y)))
solver = Solver()
solver.add(And(P0,P1,P2))
print solver.check()
print solver.model()
但这对我来说看起来像是胡言乱语。我怎样才能解决这个问题?我在哪里可以找到将规划问题编码为 SAT 的好资源?我见过 STRIPS 形式主义,但我不清楚如何将前置条件和后置条件编码为逻辑道具。我会想到暗示,但我对此并没有太多运气,而且似乎这种技术依赖于在模型中满足先决条件后从效果/后置条件生成的新约束。如果没有明确编程后置条件,z3 似乎无法做到这一点。