struct boxedint_list_node {
struct boxedint_list_node* next;
struct boxedint value;
};
struct boxedint_list {
struct boxedint_list_node* head;
int size;
};
/*@
predicate boxedint_list_abs(struct boxedint_list* l; list<boxedint> abs) =
boxedint_list_abs_ptrs(l, ?vl) &*& boxedint_list_abs_foreach(vl, abs);
predicate boxedint_list_abs_ptrs(struct boxedint_list* l; list<struct boxedint*> vl) =
l->head |-> ?head &*& l->size |-> ?size
&*& boxedint_list_abs_ptrs_nodes(head, vl);
predicate boxedint_list_abs_ptrs_nodes(struct boxedint_list_node* node; list<struct boxedint*> vl) =
node == NULL ? (vl == nil) : (boxedint_list_node_abs_meta(node, ?next, ?value) &*& boxedint_list_abs_ptrs_nodes(next, ?vl_tail) &*& vl == cons(value, vl_tail));
predicate boxedint_list_node_abs_meta(const struct boxedint_list_node* node; struct boxedint_list_node* next, struct boxedint* valueptr) =
node->next |-> next &*& struct_boxedint_padding(&node->value) &*& valueptr == &node->value &*& malloc_block_boxedint_list_node(node);
predicate boxedint_list_abs_foreach(list<struct boxedint*> vl; list<boxedint> vlabs) =
switch (vl) {
case nil:
return vlabs == nil;
case cons(head, tail):
return boxedint_abs(head, ?headabs) &*& boxedint_list_abs_foreach(tail, ?tailabs) &*& vlabs == cons(headabs, tailabs);
};
@*/
struct foo;
/*@
predicate foo(struct foo *foo;);
predicate foreach_foo(list<struct foo *> elems;);
lemma_auto void foreach_foo_remove(struct foo *foo); requires foreach_foo(?elems) &*& mem(foo, elems) == true; ensures foreach_foo(remove(foo, elems)) &*& foo(foo);
lemma_auto void foreach_foo_unremove(list<struct foo *> elems, struct foo *foo); requires foreach_foo(?elems0) &*& foo(foo) &*& mem(foo, elems) == true &*& elems0 == remove(foo, elems); ensures foreach_foo(elems);
@*/
void update_foo(struct foo *foo); //@ requires foo(foo); //@ ensures foo(foo);
void test(struct foo *foo) //@ requires foreach_foo(?elems) &*& mem(foo, elems) == true; //@ ensures foreach_foo(elems);{ update_foo(foo);}
struct foo;
/*@
predicate foo(struct foo *foo;);
predicate foolist(; list<struct foo *> elems);
predicate foreach_foo(list<struct foo *> elems;);
lemma_auto void foreach_foo_remove(struct foo *foo); requires foreach_foo(?elems) &*& mem(foo, elems) == true; ensures foreach_foo(remove(foo, elems)) &*& foo(foo);
lemma_auto void foreach_foo_unremove(list<struct foo *> elems, struct foo *foo); requires foreach_foo(?elems0) &*& foo(foo) &*& elems0 == remove(foo, elems) &*& mem(foo, elems) == true; ensures foreach_foo(elems);
lemma_auto void foreach_foo_unremove_remove(struct foo *foo2); requires foolist(?elems) &*& foreach_foo(?elems0) &*& foo(?foo1) &*& mem(foo1, elems) == true &*& elems0 == remove(foo1, elems) &*& mem(foo2, elems) == true; ensures foolist(elems) &*& foreach_foo(remove(foo2, elems)) &*& foo(foo2);
@*/
void update_foo(struct foo *foo); //@ requires foo(foo); //@ ensures foo(foo);
void test(struct foo *foo1, struct foo *foo2) //@ requires foolist(?elems) &*& foreach_foo(elems) &*& mem(foo1, elems) == true &*& mem(foo2, elems) == true; //@ ensures foolist(elems) &*& foreach_foo(elems);{ update_foo(foo1); update_foo(foo2);}
void update_foos(struct foo *foo1, struct foo *foo2);
//@ requires foo(foo1) &*& foo(foo2);
//@ ensures foo(foo1) &*& foo(foo2);
void test(struct foo *foo1, struct foo *foo2)
//@
requires foolist(?elems) &*& foreach_foo(elems) &*&
mem(foo1, elems) == true &*& mem(foo2, elems) == true
&*& foo1 != foo2;
//@ ensures foolist(elems) &*& foreach_foo(elems);
{
update_foos(foo1, foo2);
}
lemma void list_remove_other<t>(list<t> list, t t1, t t2);
requires mem(t1, list) == true &*& mem(t2, list) == true &*& t1 != t2;
ensures mem(t1, remove(t2, list)) == true;
struct foo;
/*@
inductive foo = nat;
predicate foo(struct foo *foo; foo fooabs);
predicate foolist(; list<struct foo *> elems);
predicate foreach_foo(list<struct foo *> elems; list<foo> abs);
lemma_auto void foreach_foo_remove(struct foo *foo);
requires foreach_foo(?elems, ?abs) &*& mem(foo, elems) == true;
ensures foo(foo, ?fooabs) &*& foreach_foo(remove(foo, elems), remove(fooabs, abs));
// "no suitable predicates found in postcondition to generate rules"
lemma_auto void foreach_foo_unremove(list<struct foo *> elems, struct foo *foo, list<foo> abs);
requires foreach_foo(?elems0, ?abs0) &*& foo(foo, ?fooabs)
&*& elems0 == remove(foo, elems) &*& mem(foo, elems) ==
true &*&
abs0 == remove(fooabs, abs) &*& mem(fooabs, abs) == true;
ensures foreach_foo(elems, abs);
// "no suitable predicates found in postcondition to generate rules"
lemma_auto void foreach_foo_unremove_remove(struct foo *foo2, list<foo> abs);
requires foolist(?elems) &*& foreach_foo(?elems0, ?abs0)
&*& foo(?foo1, ?foo1abs) &*& mem(foo1, elems) == true
&*& elems0 == remove(foo1, elems) &*& mem(foo2, elems)
== true &*&
mem(foo1abs, abs) == true &*& abs0 == remove(foo1abs, abs);
ensures foolist(elems) &*& foo(foo2, ?foo2abs) &*& foreach_foo(remove(foo2, elems), remove(foo2abs, abs));
@*/
struct foo;
/*@
predicate foo(struct foo *foo;);
predicate foolist(; list<struct foo *> elems);
predicate foreach_foo(list<struct foo *> elems;);
lemma_auto void foreach_foo_remove(struct foo *foo); requires foreach_foo(?elems) &*& mem(foo, elems) == true; ensures foreach_foo(remove(foo, elems)) &*& foo(foo);
lemma_auto void foreach_foo_unremove(list<struct foo *> elems, struct foo *foo); requires foreach_foo(?elems0) &*& foo(foo) &*& elems0 == remove(foo, elems) &*& mem(foo, elems) == true; ensures foreach_foo(elems);
lemma_auto void foreach_foo_unremove2(list<struct foo *> elems, struct foo *foo1, struct foo *foo2); requires foreach_foo(?elems0) &*& foo(foo1) &*& foo(foo2) &*& elems0 == remove(foo2, remove(foo1, elems)) &*& mem(foo1, elems) == true &*& mem(foo2, elems) == true &*& foo1 != foo2;
ensures foreach_foo(elems);
lemma_auto void foreach_foo_unremove_remove(struct foo *foo2); requires foolist(?elems) &*& foreach_foo(?elems0) &*& foo(?foo1) &*& mem(foo1, elems) == true &*& elems0 == remove(foo1, elems) &*& mem(foo2, elems) == true; ensures foolist(elems) &*& foreach_foo(remove(foo2, elems)) &*& foo(foo2);
lemma_auto void list_remove_other<t>(list<t> list, t t1, t t2); requires mem(t1, list) == true && mem(t2, list) == true && t1 != t2;
ensures mem(t1, remove(t2, list)) == true;
@*/
void update_foos(struct foo *foo1, struct foo *foo2); //@ requires foo(foo1) &*& foo(foo2); //@ ensures foo(foo1) &*& foo(foo2);
void test(struct foo *foo1, struct foo *foo2) //@ requires foolist(?elems) &*& foreach_foo(elems) &*& mem(foo1, elems) == true &*& mem(foo2, elems) == true &*& foo1 != foo2; //@ ensures foolist(elems) &*& foreach_foo(elems);{ update_foos(foo1, foo2);}
//@ #include <listex.gh>
struct foo;
/*@
abstract_type foo;
fixpoint foo update_foo(foo value);
fixpoint list<t> insert<t>(int index, t x, list<t> xs);
fixpoint list<t> insert2<t>(int index1, t x1, int index2, t x2, list<t> xs);
predicate foo(struct foo *foo; foo value);
predicate foolist(; list<struct foo *> elems);
predicate foreach_foo(list<struct foo *> elems; list<foo> values);
lemma_auto void foreach_foo_remove(struct foo *foo);
requires foreach_foo(?elems, ?vs) &*& mem(foo, elems) == true; ensures foreach_foo(remove(foo, elems), remove_nth(index_of(foo, elems), vs)) &*& foo(foo, nth(index_of(foo, elems), vs));
lemma_auto void foreach_foo_unremove(list<struct foo *> elems, struct foo *foo);
requires foreach_foo(?elems0, ?vs0) &*& foo(foo, ?v) &*& elems0 == remove(foo, elems) &*& mem(foo, elems) == true; ensures foreach_foo(elems, insert(index_of(foo, elems), v, vs0));
lemma_auto void foreach_foo_unremove2(list<struct foo *> elems, struct foo *foo1, struct foo *foo2); requires foreach_foo(?elems0, ?vs0) &*& foo(foo1, ?v1) &*& foo(foo2, ?v2) &*& elems0 == remove(foo2, remove(foo1, elems)) &*& mem(foo1, elems) == true &*& mem(foo2, elems) == true &*& foo1 != foo2; ensures foreach_foo(elems, insert2(index_of(foo1, elems), v1, index_of(foo2, elems), v2, vs0));
lemma_auto void foreach_foo_unremove_remove(struct foo *foo2);
requires foolist(?elems) &*& foreach_foo(?elems0, ?vs0) &*& foo(?foo1, ?v1) &*& mem(foo1, elems) == true &*& elems0 == remove(foo1, elems) &*& mem(foo2, elems) == true; ensures foolist(elems) &*& foreach_foo(remove(foo2, elems), remove_nth(index_of(foo2, elems), insert(index_of(foo1, elems), v1, vs0))) &*& foo(foo2, nth(index_of(foo2, elems), insert(index_of(foo1, elems), v1, vs0)));
lemma_auto void list_remove_other<t>(list<t> list, t t1, t t2); requires mem(t1, list) == true && mem(t2, list) == true && t1 != t2;
ensures mem(t1, remove(t2, list)) == true;
@*/
void update_foos(struct foo *foo1, struct foo *foo2);
//@ requires foo(foo1, ?v1) &*& foo(foo2, ?v2); //@ ensures foo(foo1, update_foo(v1)) &*& foo(foo2, update_foo(v2));
void test(struct foo *foo1, struct foo *foo2)
//@ requires foolist(?elems) &*& foreach_foo(elems, ?vs) &*& mem(foo1, elems) == true &*& mem(foo2, elems) == true &*& foo1 != foo2; //@ ensures foolist(elems) &*& foreach_foo(elems, ?vs1);{ update_foos(foo1, foo2);}