/* Traffic lights problem in Picat. CSPLib problem 16 http://www.cs.st-andrews.ac.uk/~ianm/CSPLib/prob/prob016/index.html """ Specification: Consider a four way traffic junction with eight traffic lights. Four of the traffic lights are for the vehicles and can be represented by the variables V1 to V4 with domains {r,ry,g,y} (for red, red-yellow, green and yellow). The other four traffic lights are for the pedestrians and can be represented by the variables P1 to P4 with domains {r,g}. The constraints on these variables can be modelled by quaternary constraints on (Vi, Pi, Vj, Pj ) for 1<=i<=4, j=(1+i)mod 4 which allow just the tuples {(r,r,g,g), (ry,r,y,r), (g,g,r,r), (y,r,ry,r)}. It would be interesting to consider other types of junction (e.g. five roads intersecting) as well as modelling the evolution over time of the traffic light sequence. ... Results Only 2^2 out of the 2^12 possible assignments are solutions. (V1,P1,V2,P2,V3,P3,V4,P4) = {(r,r,g,g,r,r,g,g), (ry,r,y,r,ry,r,y,r), (g,g,r,r,g,g,r,r), (y,r,ry,r,y,r,ry,r)} [(1,1,3,3,1,1,3,3), ( 2,1,4,1, 2,1,4,1), (3,3,1,1,3,3,1,1), (4,1, 2,1,4,1, 2,1)} The problem has relative few constraints, but each is very tight. Local propagation appears to be rather ineffective on this problem. """ Model created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ import cp. main => go. go => % symbol version of the allowed light combinations Allowed1 = [[r,r,g,g], [ry,r,y,r], [g,g,r,r], [y,r,ry,r]], print_results(findall([V,P], traffic_lights_table(V,P,Allowed1))), nl. % % Using table Allowed % traffic_lights_table(V, P, Allowed1) => N = 4, % Convert to integers according to tr/2. % Note: table_in requires structure as a term of the format: (...) Allowed = [[D : S in A, tr(S,D)].to_array(): A in Allowed1], V = new_list(N), V :: 1..N, P = new_list(N), P :: 1..N, foreach(I in 1..N, J in 1..N, J == (1+I) mod N) table_in({V[I], P[I], V[J], P[J]}, Allowed) end, Vars = V ++ P, solve(Vars). % translation table of symbols <-> integer index(-,-) tr(r, 1). tr(ry,2). tr(g, 3). tr(y, 4). % translate back to the traffic light symbols print_results(L) => foreach([V,P] in L) foreach(I in 1..4) tr(VC,V[I]), tr(PC,P[I]), printf("%w %w ",VC,PC) end, nl end.