/* Nonlinear problem in Picat. From Taha: "Operations Research", page 2. The optimal solution is w = h = L/4. This Picat model was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ import util. import sat. main => go. % 0.0s / 0 backtracks go => L :: 0..100, WH #= W*H, W #>= 0, H #>= 0, WH #>= 625, H #>= 2, 2*(W+H) #= L, println([wh=WH,l=L,w=W,h=H]), solve($[max(WH)],[L,W,H]), println([l=L,w=W,h=H,wh=WH]), println('L/4'=L/4), nl. % sat solver can handle this go2 => L :: 0..100, W :: 0..100, H :: 2..100, WH #>= 625, WH #= W*H, H #>= 2, 2*(W+H) #= L, println([wh=WH,l=L,w=W,h=H]), solve($[max(WH)],[L,W,H]), println([l=L,w=W,h=H,wh=WH]), println('L/4'=L/4), nl. % % pure logic programming: % go3 => % Ordering of the variables matter: % fastest: 0.82s between(0,100,H), between(0,100,W), between(0,100,L), % 0.84s % between(0,100,H), % between(0,100,L), % between(0,100,W), % 0.92s % between(0,100,W), % between(0,100,L), % between(0,100,H), % 0.86s % between(0,100,W), % between(0,100,H), % between(0,100,L), % 5.6s % between(0,100,L), % between(0,100,W), % between(0,100,H), % slowest: 5.7s % between(0,100,L), % between(0,100,H), % between(0,100,W), maxof(problem(L,H,W,WH), WH), println([l=L,w=W,h=H,wh=WH]), println('L/4'=L/4), nl. problem(L,H,W,WH) => % println($problem(L,H,W,WH)), WH = W*H, WH >= 625, % println($problem(L,H,W,WH)), H >= 2, 2*(W+H) = L.