/* Parallel resistors in Picat. From Marriott & Stuckey "Programming with constraints", page 134f. This Picat model was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ import cp. main => go. go ?=> Range = -10..10, Vars = [V,I,R1,R2], Vars :: Range, R1 #= 10, R2 #= 5, parallel_resistors(V,I,R1,R2), solve(Vars), println(v=V), println(i=I), println(r1=R1), println(r2=R2), nl, fail, nl. go => true. % % second example on page 134. % go2 ?=> Range = -10..10, Vars = [I,R], Vars :: Range, parallel_resistors(10,I,R,R), solve(Vars), println(i=I), println(r=R), nl, fail, nl. go2 => true. % % Example 4.2 page 135 % go3 ?=> Vars = [VA,IA,VB,IB,V,I], Vars :: -10..10, parallel_resistors(VA, IA, 10, 5), parallel_resistors(VB, IB, 8, 3), VA + VB #= V, I #= IB, I #= IA, solve(Vars), println(vars=Vars), fail, nl. go3 => true. % % parallel_resistors rule page 134 % parallel_resistors(V, I, R1, R2) => [Min,Max] = fd_min_max_array([V,I,R1,R2]), I1 :: Min..Max, I2 :: Min..Max, V #= I1*R1, V #= I2*R2, I1+I2 #= I. % % Maximum/minimum domain value in array X % fd_max_array(X) = max([fd_max(V) : V in X]). fd_min_array(X) = min([fd_min(V) : V in X]). % combine them fd_min_max_array(X) = [fd_min_array(X), fd_max_array(X)].