Counter

This example uses plain refinements on method parameters and return values to ensure a counter never decrements below zero.

import liquidjava.specification.Refinement;

public class Counter {
    @Refinement("_ == count + 1")
    public static int increment(@Refinement("count >= 0") int count) {
        return count + 1;
    }

    @Refinement("_ == count - 1")
    public static int decrement(@Refinement("count > 0") int count) {
        return count - 1;
    }
}
int c = 0;
c = Counter.increment(c);
c = Counter.decrement(c);
c = Counter.decrement(c); // Refinement Error

The parameter refinement on decrement requires the input to be strictly positive, so LiquidJava rejects the final call when c is already 0.