MiniZinc是否有continue语句?如何将if else转换为谓词形式?
解答
MiniZinc是否存在continue语句
MiniZinc属于声明式约束建模语言,和Python这类过程式编程语言的运行逻辑完全不同,不存在continue、break这类流程控制语句。MiniZinc的核心是定义问题的约束规则,没有逐行执行的控制流概念。
if语句转谓词的正确实现
原有代码报错原因
你的写法存在两个问题:
- 运算符优先级错误:MiniZinc中蕴涵运算符
->的优先级低于合取运算符/\,未给每个蕴涵分支单独加括号会导致语法解析失败。 - 存在冗余恒真式:
sum_neighbors(x,y)=2 -> grid[x,y]=grid[x,y]是永远成立的恒真表达式,没有实际约束作用,完全可以省略。
正确实现代码
仅需要保留两个有效约束即可,语义和原if语句完全一致:
( sum_neighbors(x,y) = 3 -> grid[x,y] = 1 ) /\ ( sum_neighbors(x,y) != 3 /\ sum_neighbors(x,y) != 2 -> grid[x,y] = 0 )
可选的完整分支写法
如果需要严格对齐原if语句的三个分支语义(无实际必要性,仅做语义参考),可以写成:
( sum_neighbors(x,y) = 3 -> grid[x,y] = 1 ) /\ ( sum_neighbors(x,y) = 2 -> true ) /\ ( sum_neighbors(x,y) != 3 /\ sum_neighbors(x,y) != 2 -> grid[x,y] = 0 )
也可以用析取的方式实现等价逻辑:
( sum_neighbors(x,y) = 3 /\ grid[x,y] = 1 ) \/ ( sum_neighbors(x,y) = 2 ) \/ ( sum_neighbors(x,y) != 3 /\ sum_neighbors(x,y) != 2 /\ grid[x,y] = 0 )
内容的提问来源于stack exchange,提问作者aelc
相关产品推荐
相关产品推荐

