extern int __VERIFIER_nondet_int(); void abort() { }; int id(int x); int id2(int x); /*@ requires (1); ensures (((((((x == 0) || (x == 4)) || ((5 == \result) && (5 == x))) || ((((3 == \result) && (x <= 4)) || (x == 2)) && (2 <= x))) || (((\result == 1) && (x <= 2)) && (1 <= x))) || (5 < x))); @*/ int id(int x) { if (x==0) return 0; return id2(x-1) + 1; } /*@ requires (1); ensures (((((((x == 0) && (\result == 0)) || (x == 1)) || (((\result == 2) && (x <= 3)) && (2 <= x))) || (4 < x)) || (((3 == x) || (\result == 4)) && (3 <= x)))); @*/ int id2(int x) { if (x==0) return 0; return id(x-1) + 1; } int main() { int input = 5; int result = id(input); if (result != 5) { ERROR: {/*@ assert(0); */;abort();} } }