Upload
scot-moore
View
215
Download
0
Embed Size (px)
Citation preview
Reduction ofinductive predicatesfor shape analysis
of circular lists
Daniel Stutzman
April 27, 2010
circular lists
shape analysisof circular lists
inductive predicatesfor shape analysis
of circular lists
Reduction ofinductive predicatesfor shape analysis
of circular lists
Let’s make a sorted linked list
struct ListNode {
int data;
struct ListNode* next;
struct ListNode* prev;
}
Let’s make a sorted linked list
3
0
4 7
0
x
Run-time “checker” functionsboolean is_sll(ListNode* x) {
return (x->prev == NULL) && is_sll2(x);
}
boolean is_sll2(ListNode* x, int min_data) {
return (x->data >= min_data) &&
(x->next->prev == x) &&
is_sll2(x->next, x->data);
}
Run-time “checker” functionsboolean is_sll(ListNode* x) {
return (x->prev == NULL) && is_sll2(x);
}
boolean is_sll2(ListNode* x) {
return (x->next->data >= x->data) &&
(x->next->prev == x) &&
is_sll2(x->next);
}
Run-time “checker” functionsboolean is_sll(ListNode* x) {
return (x->prev == NULL) && is_sll2(x);
}
boolean is_sll2(ListNode* x) {
return (x->next == NULL) ||
((x->next->data >= x->data) &&
(x->next->prev == x) &&
is_sll2(x->next));
}
Static inductive predicates
is_sll(x) = null(x->prev) /\ is_sll2(x)
is_sll2(x) = null(x->next) V
((x->next->data >= x->data) /\
(x->next->prev == x) /\
is_sll2(x->next))
?
0
x
is_sll2is_sll2
Example in a shape domain
Unfolding
?
0
x
is_sll2is_sll2
?
Unfolding
?
0
x
is_sll2is_sll2
Unfolding
?
0
0
x
Unfolding
?
0
x
is_sll2is_sll2
?
?
0
0
x
V
Let’s make a circular list
3
0
4 7
0
x
Let’s make a circular list
3
0
4 7
x
Let’s make a circular list
3 4 7
x
Walking backwards
?
?
?
x
is_circular_listis_circular_list
Walking backwards
?
?
?
x
is_circular_listis_circular_list
Walking backwards
?
?
?
x
is_circular_listis_circular_list
Error: Unable to find anappropriate edge to unfold
Reduction
? ?
x
is_listis_list
Reduction
? ?
x
is_listis_list
Reduction
? ?
is_listis_list
?
x
Two equivalent summaries
is_bounded_listis_bounded_list
Two equivalent summaries
is_bounded_listis_bounded_list
Two equivalent summaries
is_bounded_listis_bounded_list
Two equivalent summaries
is_bounded_list
is_bounded_list
Two equivalent summaries
is_bounded_list
is_bounded_list
Two equivalent summaries
Two equivalent summaries
is_listis_list
Two equivalent summaries
is_listis_list
Two equivalent summaries
is_listis_list
Two equivalent summaries
is_listis_list
Two equivalent summaries
Other equivalent summaries
dll1dll1NULL
Other equivalent summaries
dll1dll1NULL
Other equivalent summaries
dll1dll1NULL
Other equivalent summaries
dll1dll1NULL
Other equivalent summaries
dll1dll1NULL
Other equivalent summaries
NULLNULL
Other equivalent summaries
dll2dll2
NULLNULL
NULLNULL
Other equivalent summaries
dll2dll2
NULLNULL
NULL
NULL
Other equivalent summaries
dll2dll2
NULLNULL
NULL
NULL
Other equivalent summaries
dll2dll2
NULLNULL
NULL
NULL
Other equivalent summaries
dll2dll2
NULLNULL
NULL
NULL
Other equivalent summaries
NULLNULL
NULLNULL