1 % minimize ProB AST integer expressions for shrinking stage
2
3 minimize_int_expr(b(integer(Value),integer,[]),b(integer(Value),integer,[])).
4
5 % add, minus, multiplication, div, power_of, modulo
6 % shrink expression to its value when both arguments are integer values
7 minimize_int_expr(b(Expression,integer,Info),Shrunken) :-
8 Expression =.. [Type,Arg1,Arg2] ,
9 member(Type,[add,minus,multiplication,div,power_of,modulo]) ,
10 prob_is_ground(Arg1,true) ,
11 prob_is_ground(Arg2,true) ,
12 int(b(Expression,integer,Info),Value) ,
13 Shrunken = b(integer(Value),integer,Info).
14 minimize_int_expr(b(Expression,integer,Info),Shrunken) :-
15 Expression =.. [Type,Arg1,Arg2] ,
16 member(Type,[add,minus,multiplication,div,power_of,modulo]) ,
17 % hold integer value and minimize expression
18 (prob_is_ground(Arg1,true) , prob_is_ground(Arg2,false)
19 -> minimize_int_expr(Arg2,NewArg2) ,
20 NewExpr =.. [Type,Arg1,NewArg2] ,
21 Shrunken = b(NewExpr,integer,Info)
22 ; prob_is_ground(Arg1,false) , prob_is_ground(Arg2,true)
23 -> minimize_int_expr(Arg1,NewArg1) ,
24 NewExpr =.. [Type,NewArg1,Arg2] ,
25 Shrunken = b(NewExpr,integer,Info)
26 ; % minimize both expressions
27 minimize_int_expr(Arg1,NewArg1) ,
28 minimize_int_expr(Arg2,NewArg2) ,
29 NewExpr =.. [Type,NewArg1,NewArg2] ,
30 Shrunken = b(NewExpr,integer,Info)).
31
32 % unary_minus
33 minimize_int_expr(b(unary_minus(Expression),integer,Info),Shrunken) :-
34 (Expression = b(integer(Value),integer,_)
35 -> Temp is -(Value) ,
36 Shrunken = b(integer(Temp),integer,Info)
37 ; minimize_int_expr(Expression,Temp) ,
38 Shrunken = b(unary_minus(Temp),integer,Info)).
39
40 % card
41 /*minimize_int_expr(b(card(Set),integer,Info),Shrunken) :-
42 (prob_is_ground(Set,true) ->
43 int(b(card(Set),integer,Info),Value) ,
44 Shrunken = b(integer(Value),integer,Info)
45 ;
46 minimize_set_expr(Set,ShrunkenSet) ,
47 Shrunken = b(card(ShrunkenSet),integer,Info)).*/
48
49 % max_int, min_int
50 minimize_int_expr(b(Expression,integer,Info),Shrunken) :-
51 member(Expression,[max_int,min_int]) ,
52 int(b(Expression,integer,Info),Value) ,
53 Shrunken = b(integer(Value),integer,Info).
54
55 % max, min
56 minimize_int_expr(b(Expression,integer,Info),Shrunken) :-
57 Expression =.. [Type,Set] ,
58 member(Type,[max,min]) ,
59 (prob_is_ground(Set,true)
60 -> int(b(Expression,integer,Info),Val) ,
61 Shrunken = b(integer(Val),integer,[])
62 ; minimize_set_expr(Set,Temp) ,
63 % no empty set in max, min for well-definedness
64 ((Temp = [] ; Temp = avl_set(empty))
65 -> ShrunkenSet = Set
66 ; ShrunkenSet = Temp) ,
67 NewExpr =.. [Type,ShrunkenSet] ,
68 Shrunken = b(NewExpr,integer,Info)).
69
70 % skip identifier
71 minimize_int_expr(b(identifier(Name),Type,Info),b(identifier(Name),Type,Info)).
72
73 % get the deepest value or expression of an prob ast expression
74 get_inner_expr(b(Expression,Type,Info),Shrunken) :-
75 Expression =.. [_,Arg1,Arg2] ,
76 prob_is_ground(Arg1,Res1) , prob_is_ground(Arg2,Res2) ,
77 ( Res1 = true , Res2 = true
78 -> % done
79 Shrunken = b(Expression,Type,Info)
80 ; % get inner expression of second argument
81 Res1 = true , Res2 = false
82 -> get_inner_expr(Arg2,Shrunken)
83 ; % both arguments are expressions
84 Res1 = false , Res2 = false
85 -> % random choice heuristic
86 random_member(Argument,[Arg1,Arg2]) ,
87 get_inner_expr(Argument,Shrunken)
88 ; % get inner expression of first argument
89 get_inner_expr(Arg1,Shrunken)).
90
91 get_inner_expr(Expr,Expr).