ucsd-progsys / liquid-fixpoint

Horn Clause Constraint Solving for Liquid Types
BSD 3-Clause "New" or "Revised" License
132 stars 60 forks source link

Missing suffix in var when printing solution with --save #658

Closed nilehmann closed 10 months ago

nilehmann commented 10 months ago

The following constraint

(qualif EqZero ((a0 int)) (a0 = 0))
(qualif GtZero ((a0 int)) (a0 > 0))
(qualif GeZero ((a0 int)) (a0 >= 0))
(qualif LtZero ((a0 int)) (a0 < 0))
(qualif LeZero ((a0 int)) (a0 <= 0))
(qualif Eq ((a0 int) (a1 int)) (a0 = a1))
(qualif Gt ((a0 int) (a1 int)) (a0 > a1))
(qualif Ge ((a0 int) (a1 int)) (a0 >= a1))
(qualif Lt ((a0 int) (a1 int)) (a0 < a1))
(qualif Le ((a0 int) (a1 int)) (a0 <= a1))
(qualif Le1 ((a0 int) (a1 int)) (a0 <= (a1 - 1)))
(data Pair 2 = [| Pair { fst: @(0), snd: @(1) } ])
(data Unit 0 = [| Unit { }])
(var $k0 ((int) (int)))

(constraint
  (forall ((a0 int) (true))
    (forall ((_ Unit) (a0 >= 0))
      (and
        (forall ((a1 int) (a1 = 0))
          (tag ($k0 a1 a0) "0")
        )
        (forall ((a2 int) (true))
          (forall ((_ Unit) ($k0 a2 a0))
            (and
              (forall ((_ Unit) (~(a2 < a0)))
                (tag (a2 = a0) "1")
              )
              (forall ((_ Unit) (a2 < a0))
                (forall ((a3 int) (a3 = (a2 + 1)))
                  (tag ($k0 a3 a0) "2")
                )
              )
            )
          )
        )
      )
    )
  )
)

produces the following output when I run fixpoint --save on it

Solution:
$k0 := nnf_arg##k0 >= 0
       && nnf_arg##k0 <= nnf_arg##k0

Non-cut kvars:

Seems like the pretty printing is missing the suffix indicating the variable.

ranjitjhala commented 10 months ago

with the above fix you get

Solution:
$k0 := $k0##0 >= 0
       && $k0##0 <= $k0##1