1 | % b_arithmetic_expressions.pl | |
2 | % returns for arithmetic expressions a symbolic value that can be called in CLP(FD) | |
3 | ||
4 | b_compute_arith_expression(b(Expr,Type,Info),LS,S,R,WF) :- !, | |
5 | (ground(Type), Type == integer -> true | |
6 | ; add_error(b_compute_arith_expression,'Arithmetic expression has illegal type: ',b(Expr,Type,Info))), | |
7 | b_compute_arith_expression2(Expr,Info,LS,S,R,WF). | |
8 | ||
9 | b_compute_arith_expression(Expr,LS,S,R,WF) :- | |
10 | add_error(b_compute_arith_expression,'Expression not properly wrapped: ',Expr), | |
11 | b_compute_arith_expression2(Expr,unknown,LS,S,R,WF). | |
12 | ||
13 | ||
14 | b_compute_arith_expression2(unary_minus(Arg1),_I,LocalState,State,Value,WF) :- !, | |
15 | b_compute_arith_expression(Arg1,LocalState,State,SV1,WF), | |
16 | Value = '-'(SV1). | |
17 | b_compute_arith_expression2(add(Arg1,Arg2),_I,LocalState,State,Value,WF) :- !, | |
18 | b_compute_arith_expression(Arg1,LocalState,State,SV1,WF), | |
19 | b_compute_arith_expression(Arg2,LocalState,State,SV2,WF), | |
20 | Value = '+'(SV1,SV2). | |
21 | b_compute_arith_expression2(minus(Arg1,Arg2),_I,LocalState,State,Value,WF) :- !, | |
22 | b_compute_arith_expression(Arg1,LocalState,State,SV1,WF), | |
23 | b_compute_arith_expression(Arg2,LocalState,State,SV2,WF), | |
24 | Value = '-'(SV1,SV2). | |
25 | b_compute_arith_expression2(multiplication(Arg1,Arg2),_I,LocalState,State,Value,WF) :- !, | |
26 | b_compute_arith_expression(Arg1,LocalState,State,SV1,WF), | |
27 | b_compute_arith_expression(Arg2,LocalState,State,SV2,WF), | |
28 | Value = '*'(SV1,SV2). | |
29 | b_compute_arith_expression2(Expr,Info,LocalState,State,Value,WF) :- | |
30 | b_compute_expression2(Expr,integer,Info,LocalState,State,int(Value),WF). | |
31 | %b_compute_expression2(Expr,integer,Info,LocalState,State,R,WF), R=int(Value). % this version does not seem faster | |
32 | % kernel_objects:basic_type2(integer,int(Value)). | |
33 | ||
34 | % be sure to register all cases here in clpfd_arith_integer_expression in b_ast_cleanup | |
35 | ||
36 | ||
37 | % Note: calling b_compute_arith_expression will also instantiate a variable to at least the int(_) skeleton; thereby enabling propagation | |
38 | % this is potentially better than calling the default versions of the predicates, which may wait until the int(_) skeleton is set up before propagation | |
39 | ||
40 | ||
41 | :- use_module(clpfd_interface,[clpfd_eq_expr_optimized/2]). | |
42 | ||
43 | b_test_arith_equal_boolean_expression(Arg1,Arg2,LocalState,State,WF) :- | |
44 | b_compute_arith_expression(Arg1,LocalState,State,CLPFD_Expr1,WF), | |
45 | b_compute_arith_expression(Arg2,LocalState,State,CLPFD_Expr2,WF), | |
46 | clpfd_eq_expr_optimized(CLPFD_Expr1,CLPFD_Expr2). | |
47 | ||
48 | %(preferences:preference(use_smt_mode,true)-> clpfd_eq_expr_optimized(CLPFD_Expr1,CLPFD_Expr2) | |
49 | % ; clpfd_eq_expr(CLPFD_Expr1,CLPFD_Expr2)). | |
50 | % maybe we should call clpfd_eq_expr_optimized only in SMT mode and call clpfd_eq_expr otherwise ?? | |
51 | % initially test 1077 ran considerably slower with clpfd_eq_expr_optimized |