| 1 | % minimize ProB AST set expressions for shrinking stage | |
| 2 | ||
| 3 | :- use_module(library(sets)). | |
| 4 | :- use_module(library(lists),[is_list/1]). | |
| 5 | :- use_module(library(avl),[avl_to_list/2,list_to_avl/2]). | |
| 6 | ||
| 7 | minimize_set_expr(b(set_extension(Set),set(Type),Info),b(set_extension(ShrunkenSet),set(Type),Info)) :- | |
| 8 | is_list(Set) , Set \= [b(_,set(_),_)] , | |
| 9 | shrink(list(_),Set,ShrunkenSet). | |
| 10 | ||
| 11 | % minimize set of set | |
| 12 | minimize_set_expr(b(set_extension([Set]),set(Type),Info),Shrunken) :- | |
| 13 | minimize_set_expr(Set,ShrunkenSet) , | |
| 14 | (ShrunkenSet = b(value([]),set(_),Info) | |
| 15 | -> Shrunken = ShrunkenSet | |
| 16 | ; Shrunken = b(set_extension([ShrunkenSet]),set(Type),Info)). | |
| 17 | ||
| 18 | minimize_set_expr(b(set_extension([]),set(Inner),Info),b(set_extension([]),set(Inner),Info)). | |
| 19 | ||
| 20 | minimize_set_expr(b(value(Set),set(Inner),Info),Shrunken) :- | |
| 21 | shrink(prob_value_set,Set,ShrunkenSet) , | |
| 22 | (ShrunkenSet = [] | |
| 23 | -> Shrunken = b(value([]),set(Inner),Info) | |
| 24 | ; Shrunken = b(value(ShrunkenSet),set(Inner),Info)). | |
| 25 | ||
| 26 | % shrink both sides of interval down to one integer | |
| 27 | minimize_set_expr(b(interval(b(integer(Value1),integer,Info1),b(integer(Value2),integer,Info2)),set(integer),Info),Shrunken) :- | |
| 28 | NewValue1 is Value1 + 1 , | |
| 29 | NewValue2 is Value2 - 1 , | |
| 30 | (NewValue1 >= NewValue2 | |
| 31 | -> Shrunken = b(set_extension([b(integer(NewValue1),integer,Info1)]),set(integer),Info) | |
| 32 | ; Shrunken = b(interval(b(integer(NewValue1),integer,Info1),b(integer(NewValue2),integer,Info2)),set(integer),Info)). | |
| 33 | ||
| 34 | % union, intersection, set_subtraction | |
| 35 | % shrink expression to its value when both arguments are set expressions | |
| 36 | minimize_set_expr(b(Expression,set(Inner),Info),Shrunken) :- | |
| 37 | Expression =.. [Type,Arg1,Arg2] , | |
| 38 | member(Type,[union,intersection,set_subtraction]) , | |
| 39 | prob_is_ground(Arg1,true) , | |
| 40 | prob_is_ground(Arg2,true) , | |
| 41 | sint_avl(b(Expression,set(Inner),Info),NewSet) , | |
| 42 | (NewSet = avl_set(empty) | |
| 43 | -> Shrunken = b(value([]),set(Inner),Info) | |
| 44 | ; Shrunken = b(value(NewSet),set(Inner),Info)). | |
| 45 | minimize_set_expr(b(Expression,set(Inner),Info),Shrunken) :- | |
| 46 | Expression =.. [Type,Arg1,Arg2] , | |
| 47 | member(Type,[union,intersection,set_subtraction]) , | |
| 48 | prob_is_ground(Arg1,Res1) , | |
| 49 | prob_is_ground(Arg2,Res2) , | |
| 50 | % hold set and minimize expression | |
| 51 | ( Res1 = true , Res2 = false | |
| 52 | -> minimize_set_expr(Arg2,NewArg2) , | |
| 53 | NewExpr =.. [Type,Arg1,NewArg2] , | |
| 54 | Shrunken = b(NewExpr,set(Inner),Info) | |
| 55 | ; Res1 = false , Res2 = true | |
| 56 | -> minimize_set_expr(Arg1,NewArg1) , | |
| 57 | NewExpr =.. [Type,NewArg1,Arg2] , | |
| 58 | Shrunken = b(NewExpr,set(Inner),Info) | |
| 59 | ; % minimize both expressions | |
| 60 | minimize_set_expr(Arg1,NewArg1) , | |
| 61 | minimize_set_expr(Arg2,NewArg2) , | |
| 62 | NewExpr =.. [Type,NewArg1,NewArg2] , | |
| 63 | Shrunken = b(NewExpr,set(Inner),Info)). | |
| 64 | ||
| 65 | % general_union, general_intersection | |
| 66 | minimize_set_expr(b(Expression,set(Inner),Info),Shrunken) :- | |
| 67 | Expression =.. [Type,Arg] , | |
| 68 | Arg = b(set_extension([Set]),_,_) , | |
| 69 | member(Type,[general_union,general_intersection]) , | |
| 70 | prob_is_ground(Set,Res) , | |
| 71 | (Res = true | |
| 72 | -> sint_avl(b(Expression,set(Inner),Info),NewSet) , | |
| 73 | % don't shrink to an empty set | |
| 74 | (NewSet = avl_set(empty) | |
| 75 | -> Shrunken = b(Expression,set(Inner),Info) | |
| 76 | ; Shrunken = b(value(NewSet),set(Inner),Info)) | |
| 77 | ; minimize_set_expr(Arg,NewArg) , | |
| 78 | NewExpr =.. [Type,NewArg] , | |
| 79 | Shrunken = b(NewExpr,set(Inner),Info)). | |
| 80 | ||
| 81 | % skip identifier | |
| 82 | minimize_set_expr(b(identifier(Name),Type,Info),b(identifier(Name),Type,Info)). |