The following example fails to verify, even though it's essentially trying to prove forall i: Int :: ... ==> i >= i:
domain s_UInt_u32 {
function s_UInt_u32_value(arg0: s_UInt_u32): Int
function s_UInt_u32_cons(arg0: Int): s_UInt_u32
axiom s_UInt_u32_ax_cons {
(forall s: s_UInt_u32 ::
{ s_UInt_u32_value(s) }
s_UInt_u32_cons(s_UInt_u32_value(s)) == s)
}
axiom s_UInt_u32_ax_bounds {
(forall s: s_UInt_u32 ::
{ s_UInt_u32_value(s) }
0 <= s_UInt_u32_value(s) && s_UInt_u32_value(s) <= 4294967295)
}
axiom s_UInt_u32_ax_value {
(forall value: Int ::
{ s_UInt_u32_cons(value) }
0 <= value && value <= 4294967295 ==>
s_UInt_u32_value(s_UInt_u32_cons(value)) == value)
}
}
domain s_Bool {
function s_Bool_value(arg0: s_Bool): Bool
function s_Bool_cons(arg0: Bool): s_Bool
axiom s_Bool_ax_cons {
(forall s: s_Bool ::
{ s_Bool_value(s) }
s_Bool_cons(s_Bool_value(s)) == s)
}
axiom s_Bool_ax_value {
(forall value: Bool ::
{ s_Bool_cons(value) }
s_Bool_value(s_Bool_cons(value)) == value)
}
}
domain s_Param {
}
domain TypeOf {
function s_Param_typeof(arg0: s_Param): Type
function s_Fields_typeof(arg0: s_Fields): Type
function s_prusti_post_item_test_80e8859f35b741c5b05447b46d6b38fa_Closure_0_typeof(arg0: s_prusti_post_item_test_80e8859f35b741c5b05447b46d6b38fa_Closure_0): Type
function s_Ref_immutable_typeof(arg0: s_Ref_immutable): Type
function s_UInt_u32_typeof(arg0: s_UInt_u32): Type
function s_Bool_typeof(arg0: s_Bool): Type
}
field p_UInt_u32_val: s_UInt_u32
field p_Ref_immutable_val: s_Ref_immutable
function f_Fields$colon$$colon$get_field_1(_1p: s_Ref_immutable): s_UInt_u32
{
(let _0_1s_bb0_s0_i0 ==
(_1p) in
(let _0_0s_bb0_s0_i0 ==
(make_concrete_s_Fields(_0_1s_bb0_s0_i0.s_Ref_immutable_1).s_Fields_0) in
_0_0s_bb0_s0_i0))
}
function mir_binop_Ge_u32_u32(arg1: s_UInt_u32, arg2: s_UInt_u32): s_Bool
{
s_Bool_cons(s_UInt_u32_value(arg1) >= s_UInt_u32_value(arg2))
}
function make_generic_s_Fields(self: s_Fields): s_Param
ensures make_concrete_s_Fields(result) == self
function make_concrete_s_Fields(snap: s_Param): s_Fields
ensures make_generic_s_Fields(result) == snap
function make_generic_s_prusti_post_item_test_80e8859f35b741c5b05447b46d6b38fa_Closure_0(self: s_prusti_post_item_test_80e8859f35b741c5b05447b46d6b38fa_Closure_0): s_Param
ensures make_concrete_s_prusti_post_item_test_80e8859f35b741c5b05447b46d6b38fa_Closure_0(result) ==
self
function make_concrete_s_prusti_post_item_test_80e8859f35b741c5b05447b46d6b38fa_Closure_0(snap: s_Param): s_prusti_post_item_test_80e8859f35b741c5b05447b46d6b38fa_Closure_0
ensures make_generic_s_prusti_post_item_test_80e8859f35b741c5b05447b46d6b38fa_Closure_0(result) ==
snap
function make_generic_s_Bool(self: s_Bool): s_Param
ensures make_concrete_s_Bool(result) == self
function make_concrete_s_Bool(snap: s_Param): s_Bool
ensures make_generic_s_Bool(result) == snap
function s_UInt_u32_unreachable(): s_UInt_u32
requires false
ensures false
function s_0_Tuple_unreachable(): s_0_Tuple
requires false
ensures false
function s_Fields_unreachable(): s_Fields
requires false
ensures false
function s_Bool_unreachable(): s_Bool
requires false
ensures false
function s_Ref_immutable_unreachable(): s_Ref_immutable
requires false
ensures false
function s_Param_unreachable(): s_Param
requires false
ensures false
function s_prusti_post_item_test_80e8859f35b741c5b05447b46d6b38fa_Closure_0_unreachable(): s_prusti_post_item_test_80e8859f35b741c5b05447b46d6b38fa_Closure_0
requires false
ensures false
function s_1_Tuple_unreachable(): s_1_Tuple
requires false
ensures false
function p_UInt_u32_snap(self: Ref): s_UInt_u32
requires acc(p_UInt_u32(self), write)
{
(unfolding acc(p_UInt_u32(self), write) in self.p_UInt_u32_val)
}
function p_0_Tuple_snap(self: Ref): s_0_Tuple
requires acc(p_0_Tuple(self), write)
{
(unfolding acc(p_0_Tuple(self), write) in s_0_Tuple_cons())
}
function p_Fields_field_0(self: Ref): Ref
ensures (self == null) == (result == null)
function p_Fields_field_1(self: Ref): Ref
ensures (self == null) == (result == null)
function p_Fields_snap(self: Ref): s_Fields
requires acc(p_Fields(self), write)
{
(unfolding acc(p_Fields(self), write) in
s_Fields_cons(p_UInt_u32_snap(p_Fields_field_0(self)), p_0_Tuple_snap(p_Fields_field_1(self))))
}
function p_Ref_immutable_deref(self: Ref, T: Type): Ref
requires acc(p_Ref_immutable(self, T), write)
{
(unfolding acc(p_Ref_immutable(self, T), write) in
self.p_Ref_immutable_val.s_Ref_immutable_0)
}
function p_Ref_immutable_snap(self: Ref, T: Type): s_Ref_immutable
requires acc(p_Ref_immutable(self, T), write)
ensures s_Param_typeof(result.s_Ref_immutable_1) == T
{
(unfolding acc(p_Ref_immutable(self, T), write) in
self.p_Ref_immutable_val)
}
function p_Param_snap(self: Ref, T: Type): s_Param
function p_prusti_post_item_test_80e8859f35b741c5b05447b46d6b38fa_Closure_0_field_0(self: Ref): Ref
ensures (self == null) == (result == null)
function p_prusti_post_item_test_80e8859f35b741c5b05447b46d6b38fa_Closure_0_snap(self: Ref): s_prusti_post_item_test_80e8859f35b741c5b05447b46d6b38fa_Closure_0
requires acc(p_prusti_post_item_test_80e8859f35b741c5b05447b46d6b38fa_Closure_0(self), write)
{
(unfolding acc(p_prusti_post_item_test_80e8859f35b741c5b05447b46d6b38fa_Closure_0(self), write) in
s_prusti_post_item_test_80e8859f35b741c5b05447b46d6b38fa_Closure_0_cons(p_Ref_immutable_snap(p_prusti_post_item_test_80e8859f35b741c5b05447b46d6b38fa_Closure_0_field_0(self),
s_Fields_type())))
}
predicate p_UInt_u32(self: Ref) {
acc(self.p_UInt_u32_val, write)
}
predicate p_0_Tuple(self: Ref) {
true
}
predicate p_Fields(self: Ref) {
acc(p_UInt_u32(p_Fields_field_0(self)), write) &&
acc(p_0_Tuple(p_Fields_field_1(self)), write)
}
predicate p_Ref_immutable(self: Ref, T: Type) {
acc(self.p_Ref_immutable_val, write) &&
s_Param_typeof(self.p_Ref_immutable_val.s_Ref_immutable_1) == T
}
predicate p_Param(self: Ref, T: Type)
predicate p_prusti_post_item_test_80e8859f35b741c5b05447b46d6b38fa_Closure_0(self: Ref) {
acc(p_Ref_immutable(p_prusti_post_item_test_80e8859f35b741c5b05447b46d6b38fa_Closure_0_field_0(self),
s_Fields_type()), write)
}
method m_test(_0p: Ref)
ensures acc(p_Fields(_0p), write)
ensures s_Bool_value((let _0_1s_bb0_s0_i0 ==
(p_Fields_snap(_0p)) in
(let _0_3s_bb0_s2_i1 ==
(s_0_Tuple_cons()) in
(let _0_7s_bb0_s7_i1 ==
(s_Ref_immutable_cons(null, make_generic_s_Fields(_0_1s_bb0_s0_i0))) in
(let _0_6s_bb0_s8_i1 ==
(s_prusti_post_item_test_80e8859f35b741c5b05447b46d6b38fa_Closure_0_cons(_0_7s_bb0_s7_i1)) in
(let _0_5s_bb0_s10_i1 ==
(s_Ref_immutable_cons(null, make_generic_s_prusti_post_item_test_80e8859f35b741c5b05447b46d6b38fa_Closure_0(_0_6s_bb0_s8_i1))) in
(let _0_4s_bb0_s11_i1 ==
(s_Ref_immutable_cons(null, make_generic_s_prusti_post_item_test_80e8859f35b741c5b05447b46d6b38fa_Closure_0(make_concrete_s_prusti_post_item_test_80e8859f35b741c5b05447b46d6b38fa_Closure_0(_0_5s_bb0_s10_i1.s_Ref_immutable_1)))) in
(let _0_2s_bb0_s12_i1 ==
(s_Bool_cons((forall qvar_0_0: s_UInt_u32 ::s_Bool_value((let _1_1s_bb0_s0_i0 ==
(_0_4s_bb0_s11_i1) in
(let _1_2s_bb0_s0_i0 ==
(qvar_0_0) in
(let _1_4s_bb0_s2_i1 ==
(_1_2s_bb0_s0_i0) in
(let _1_6s_bb0_s5_i1 ==
(s_Ref_immutable_cons(null, make_generic_s_Fields(make_concrete_s_Fields(make_concrete_s_prusti_post_item_test_80e8859f35b741c5b05447b46d6b38fa_Closure_0(_1_1s_bb0_s0_i0.s_Ref_immutable_1).s_prusti_post_item_test_80e8859f35b741c5b05447b46d6b38fa_Closure_0_0.s_Ref_immutable_1)))) in
(let _1_5s_bb0_s6_i1 ==
(f_Fields$colon$$colon$get_field_1(_1_6s_bb0_s5_i1)) in
(let _1_3s_bb1_s1_i1 ==
(mir_binop_Ge_u32_u32(_1_4s_bb0_s2_i1, _1_5s_bb0_s6_i1)) in
(let _1_phi_bb1_s2_i0 ==
((s_Bool_value(_1_3s_bb1_s1_i1) == false ?
(let _1_0s_bb3_s2_i0 ==
(s_Bool_cons(true)) in
s_1_Tuple_cons(make_generic_s_Bool(_1_0s_bb3_s2_i0))) :
(let _1_7s_bb2_s3_i1 ==
(_1_2s_bb0_s0_i0) in
(let _1_8s_bb2_s5_i1 ==
(_1_2s_bb0_s0_i0) in
(let _1_0s_bb2_s6_i1 ==
(mir_binop_Ge_u32_u32(_1_7s_bb2_s3_i1,
_1_8s_bb2_s5_i1)) in
s_1_Tuple_cons(make_generic_s_Bool(_1_0s_bb2_s6_i1))))))) in
(let _1_0s_bb1_s2_i2 ==
(make_concrete_s_Bool(_1_phi_bb1_s2_i0.s_1_Tuple_0)) in
_1_0s_bb1_s2_i2)))))))))))) in
(let _0_0s_bb1_s6_i0 ==
(_0_2s_bb0_s12_i1) in
_0_0s_bb1_s6_i0)))))))))
{
var _1p: Ref
var _tmp0: s_0_Tuple
label start
// var _1p
goto bb_0
label bb_0
// [MIR] bb0[0]: StorageLive(_1)
// [MIR] bb0[1]: _1 = ()
// (ignoring)
// (ignoring)
// (ignoring)
p_0_Tuple_assign(_1p, s_0_Tuple_cons())
label _after_0_1
// [MIR] bb0[2]: _0 = Fields { field_1: const 0_u32, field_2: move _1 }
// (ignoring)
// (ignoring)
// (ignoring)
// (ignoring)
// (ignoring)
// var _tmp0
_tmp0 := p_0_Tuple_snap(_1p)
exhale acc(p_0_Tuple(_1p), write)
p_Fields_assign(_0p, s_Fields_cons(s_UInt_u32_cons(0), _tmp0))
label _after_0_2
// [MIR] bb0[3]: StorageDead(_1)
// (ignoring)
// [MIR] bb0[4]: return
// PCG (T) pre_operands
// PCG (T) post_operands
// PCG (T) pre_main
// PCG (T) post_main
label package_post0
label _after_0_4
goto end
label end
// return
}
method make_generic_p_Fields(self: Ref)
requires acc(p_Fields(self), write)
ensures acc(p_Param(self, s_Fields_type()), write)
ensures old(make_generic_s_Fields(p_Fields_snap(self))) ==
p_Param_snap(self, s_Fields_type())
method make_concrete_p_Fields(self: Ref)
requires acc(p_Param(self, s_Fields_type()), write)
ensures acc(p_Fields(self), write)
ensures old(p_Param_snap(self, s_Fields_type())) ==
make_generic_s_Fields(p_Fields_snap(self))
method p_UInt_u32_assign(self: Ref, value: s_UInt_u32)
ensures acc(p_UInt_u32(self), write)
ensures p_UInt_u32_snap(self) == value
method p_0_Tuple_assign(self: Ref, value: s_0_Tuple)
ensures acc(p_0_Tuple(self), write)
ensures p_0_Tuple_snap(self) == value
method p_Fields_assign(self: Ref, value: s_Fields)
ensures acc(p_Fields(self), write)
ensures p_Fields_snap(self) == value
method p_Ref_immutable_assign(self: Ref, T: Type, value: s_Ref_immutable)
ensures acc(p_Ref_immutable(self, T), write)
ensures p_Ref_immutable_snap(self, T) == value
method p_Param_assign(self: Ref, T: Type, value: s_Param)
ensures acc(p_Param(self, T), write)
ensures p_Param_snap(self, T) == value
method p_prusti_post_item_test_80e8859f35b741c5b05447b46d6b38fa_Closure_0_assign(self: Ref,
value: s_prusti_post_item_test_80e8859f35b741c5b05447b46d6b38fa_Closure_0)
ensures acc(p_prusti_post_item_test_80e8859f35b741c5b05447b46d6b38fa_Closure_0(self), write)
ensures p_prusti_post_item_test_80e8859f35b741c5b05447b46d6b38fa_Closure_0_snap(self) ==
value
adt s_0_Tuple {
s_0_Tuple_cons()
}
adt s_Fields {
s_Fields_cons(s_Fields_0: s_UInt_u32, s_Fields_1: s_0_Tuple)
}
adt s_Ref_immutable {
s_Ref_immutable_cons(s_Ref_immutable_0: Ref, s_Ref_immutable_1: s_Param)
}
adt s_prusti_post_item_test_80e8859f35b741c5b05447b46d6b38fa_Closure_0 {
s_prusti_post_item_test_80e8859f35b741c5b05447b46d6b38fa_Closure_0_cons(s_prusti_post_item_test_80e8859f35b741c5b05447b46d6b38fa_Closure_0_0: s_Ref_immutable)
}
adt s_1_Tuple {
s_1_Tuple_cons(s_1_Tuple_0: s_Param)
}
adt Type {
s_Fields_type()
s_prusti_post_item_test_80e8859f35b741c5b05447b46d6b38fa_Closure_0_type()
s_Ref_immutable_type(s_Ref_immutable_typaram_T: Type)
s_UInt_u32_type()
s_Bool_type()
Unknown_type(non_unit: Int)
}
The following example fails to verify, even though it's essentially trying to prove
forall i: Int :: ... ==> i >= i: