背景:
简而言之,我跟踪事件并使用变量(编号,获取订单)和表示事件类型的值来表示每个事件。目标是在给定一组可能的事件的情况下基本上计算每个可能的事件序列。例如,我给Z3表示序列的信息看起来与此类似:
RO = 1
R1 = 4 OR 3
R2 = 3 OR 4
所以最后,Z3应该给我两个解决方案:1,4,3
和1,3,4
。
在这个例子中,我现在想要为这些变量添加约束
这样类型3的每个事件必须在类型4之前发生:
for all i,j: if Ri == 4 then there exists Rj == 3 where j < i
也就是说,Z3应该不给我解决方案1,4,3
,但只有1,3,4
问题:
将其转换为Z3,尤其是我需要映射到正确变量的变化索引。或者,有没有比使用显式变量表示订单更好的方法呢?
我知道我可以为每个变量创建约束,例如
(R353 == 4 && (R0 == 3 || R1 == 3 || ...)) == true
但我确定有更好的方法可以做到这一点吗?