|
5088 | 5088 | ; nonvar(Z), nonvar(X) ->
|
5089 | 5089 | ( Z > 0 ->
|
5090 | 5090 | ( X < 0 -> true
|
5091 |
| - ; X >= Z |
| 5091 | + ; X >= Z, |
| 5092 | + % due to X = Z+Y*_ and Y > Z |
| 5093 | + ( X-Z > 0 -> |
| 5094 | + X-Z > Z |
| 5095 | + ; true |
| 5096 | + ) |
5092 | 5097 | )
|
5093 | 5098 | ; Z < 0 ->
|
5094 | 5099 | ( X > 0 -> true
|
5095 |
| - ; X =< Z |
| 5100 | + ; X =< Z, |
| 5101 | + % due to X = Z+Y*_ and Y < Z |
| 5102 | + ( X-Z < 0 -> |
| 5103 | + X-Z < Z |
| 5104 | + ; true |
| 5105 | + ) |
5096 | 5106 | )
|
5097 | 5107 | ; Z =:= 0 % Multiple solutions so do nothing special.
|
5098 | 5108 | ),
|
5099 | 5109 | ( { fd_get(Y, _, _, n(YU), _),
|
5100 | 5110 | YU < X, X =< 0 } -> kill(MState), Z =:= X
|
5101 | 5111 | ; { fd_get(Y, _, n(YL), _, _),
|
5102 | 5112 | YL > X, X >= 0 } -> kill(MState), Z =:= X
|
5103 |
| - ; ( Z > 0 -> |
| 5113 | + ; ( Z > 0, X < 0 -> |
| 5114 | + { fd_get(Y, YD, YPs), |
| 5115 | + YMin is Z+1, |
| 5116 | + YMax is Z-X, |
| 5117 | + domain_remove_smaller_than(YD, YMin, YD1), |
| 5118 | + domain_remove_greater_than(YD1, YMax, YD2) }, |
| 5119 | + fd_put(Y, YD2, YPs) |
| 5120 | + % queue_goal((Y #> Z, Y #=< Z-X)) |
| 5121 | + ; Z < 0, X > 0 -> |
| 5122 | + { fd_get(Y, YD, YPs), |
| 5123 | + YMax is Z-1, |
| 5124 | + YMin is Z-X, |
| 5125 | + domain_remove_greater_than(YD, YMax, YD1), |
| 5126 | + domain_remove_smaller_than(YD1, YMin, YD2) }, |
| 5127 | + fd_put(Y, YD2, YPs) |
| 5128 | + % queue_goal((Y #< Z, Y #>= Z-X)) |
| 5129 | + ; Z > 0 -> |
5104 | 5130 | { fd_get(Y, YD, YPs),
|
5105 | 5131 | YMin is Z + 1,
|
5106 | 5132 | domain_remove_smaller_than(YD, YMin, YD1) },
|
|
5112 | 5138 | domain_remove_greater_than(YD, YMax, YD1) },
|
5113 | 5139 | fd_put(Y, YD1, YPs)
|
5114 | 5140 | % queue_goal(Y #< Z)
|
5115 |
| - ; true |
| 5141 | + ; Z =:= 0, |
| 5142 | + ( X =:= 0 -> |
| 5143 | + kill(MState) % trivial |
| 5144 | + ; % only 4 solutions {-abs(X),-1,1,abs(X)} |
| 5145 | + { YL is -abs(X), YU is abs(X), |
| 5146 | + fd_get(Y, YD0, YPs), |
| 5147 | + domain_remove_smaller_than(YD0, YL, YD1), |
| 5148 | + domain_remove_greater_than(YD1, YU, YD) }, |
| 5149 | + fd_put(Y, YD, YPs) |
| 5150 | + ) |
5116 | 5151 | )
|
5117 | 5152 | )
|
5118 | 5153 | ; run_propagator(pmodz(X,Y,Z), MState),
|
|
0 commit comments