Python 模拟逻辑难题

Python 模拟逻辑难题,python,z3,smt,z3py,cvc4,Python,Z3,Smt,Z3py,Cvc4,我正试图模拟一个逻辑谜题来模仿一只知更鸟。我正在努力把它翻译成SMT-LIB。谜题是这样的: 有一个花园,所有的花都是红色、黄色或蓝色,所有的颜色都有代表性。对于你采摘的任何三朵花,至少一朵是红色的,一朵是黄色的。第三朵花总是蓝色的吗 我尝试将花园建模为数组Int Flower,但这不起作用,因为数组的域固定为所有整数的范围。Z3很有帮助地告诉我,这是无法满足的,CVC4直接返回未知 解决这个难题的唯一办法是一个花园,每种颜色正好有一朵花,但我如何让解算器告诉我这一点呢 这是我失败的尝试: (d

我正试图模拟一个逻辑谜题来模仿一只知更鸟。我正在努力把它翻译成SMT-LIB。谜题是这样的:

有一个花园,所有的花都是红色、黄色或蓝色,所有的颜色都有代表性。对于你采摘的任何三朵花,至少一朵是红色的,一朵是黄色的。第三朵花总是蓝色的吗

我尝试将花园建模为
数组Int Flower
,但这不起作用,因为数组的域固定为所有整数的范围。Z3很有帮助地告诉我,这是无法满足的,CVC4直接返回未知

解决这个难题的唯一办法是一个花园,每种颜色正好有一朵花,但我如何让解算器告诉我这一点呢

这是我失败的尝试:

(declare-datatypes () ((Flower R Y B)))
(declare-const garden (Array Int Flower))
(assert (forall ((a Int) (b Int) (c Int))
                (and (or (= (select garden a) R)
                         (= (select garden b) R)
                         (= (select garden c) R))
                     (or (= (select garden a) Y)
                         (= (select garden b) Y)
                         (= (select garden c) Y)))))
(check-sat)

我认为有一个隐含的假设,即花园里有三种颜色的花。考虑到这一点,以下是我如何使用Python和Haskell接口将其编码到Z3;因为用这些语言编写代码比直接用SMTLib编写代码更容易

python 读取此输出的方法是,当
N=3
时,给定的条件确实是可满足的;就像你想知道的那样。此外,如果您还断言
N
不是
3
,则没有令人满意的模型,即
3
的选择是由给定的条件强制的。我相信这就是你想要建立的

我希望代码是明确的,但请随时要求澄清。如果您在SMT库中确实需要此项,则始终可以插入:

print s.sexpr()
在调用
s.check()
之前,您可以看到生成的SMTLib

哈斯克尔
也可以在Haskell/SBV中编写相同的代码。关于几乎相同的文字编码,请参见本要点:注意,Haskell解决方案可以利用SBV的
allSat
构造(返回所有令人满意的假设),更简单的是表明
N=3
是唯一的解决方案。

对于第二个测试,即证明假设,你能改为检查前提和最后一个陈述的否定的结合是否不可满足吗?也就是说,
s.add(存在([f1,f2,f3],和(validPick(f1,f2,f3),count(B[f1,f2,f2,f3])==0))
@DmitriChubarov,它只会为
N
的所有值生成
unsat
,因为它与第一个公理相矛盾,即每种颜色都有花。这当然是真的,但这并没有什么意义,你也无法从中得出任何结论。我认为有一个隐含的假设,即花园里有三种颜色的花。这是一个敏锐的观察!我忘了提到这个事实,这当然是至关重要的。我将编辑原始问题以反映这一点。谢谢
sat
3
unsat
print s.sexpr()