Skip to content

Trigger selection fails for expressions with let bindings #943

@JonasAlaif

Description

@JonasAlaif

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)
}

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions