我有一个关于量词的问题。
假设我有一个数组,我想为这个数组计算数组索引 0、1 和 2 -
(declare-const cpuA (Array Int Int))
(assert (or (= (select cpuA 0) 0) (= (select cpuA 0) 1)))
(assert (or (= (select cpuA 1) 0) (= (select cpuA 1) 1)))
(assert (or (= (select cpuA 2) 0) (= (select cpuA 2) 1)))
或者,我可以使用 forall 构造指定相同的 -
(assert (forall ((x Int)) (=> (and (>= x 0) (<= x 2)) (or (= (select cpuA x) 0) (= (select cpuA x) 1)))))
现在我想了解他们两个之间的区别。第一种方法执行速度很快,并给出了一个简单易读的模型。相比之下,第二个选项的代码量非常小,但程序需要时间来执行。而且解决方案也很复杂。
我想使用第二种方法,因为我的代码会变小。但是,我想找到一个可读的简单模型。