1

I was trying out the PDR engine in Z3 and I'm not sure which version of Z3 to use.

The "official" master branch from git seems to work but is dated Nov 2012. I'm sure there have been improvements since then. The unstable branch, on the other hand, "may contain unstable and/or untested code", which seems to be true.

What would be the most recent "stable" version of the engine?

For example

(declare-rel R (Real Real))
(declare-var x Real)
(declare-var y Real)

(rule 
  (=> (and (= x 0) (= y 0)) (R x y)) 
)

(rule 
  (=> (R x y) (R (+ x 1) (+ y 1)))
)

(query 
  (and (R x y) (not (= x y)))
)

Above works in master, returning unsat, but in the unstable branch the engine wanders off not solving the problem. Same holds for the example from a recent CAV paper.

Dejan Jovanović
  • 2,085
  • 1
  • 16
  • 22

1 Answers1

1

This is somewhat of a regression and thanks for pointing this out. The older version of PDR used predicates from the query when checking for inductiveness. The updated version omits this feature and diverges even though the property is very easily seen as inductive. Using predicates from the query isn't very general and I have tried to replace this with other means. For example you can do a "magic-set" transformation that should push opportune predicates down.

Nikolaj Bjorner
  • 8,229
  • 14
  • 15
  • Makes sense. It would be great if there was an option to disable any non-PDR "predicate invention" so that one could play with PDR on its own to understand it better. – Dejan Jovanović Sep 02 '14 at 23:39