Download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
/*
 
  Traffic lights problem in ECLiPSe.
 
   
  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.
     
  """
   
  Compare with these models:
 
 
  Model created by Hakan Kjellerstrand, hakank@gmail.com
  See also my ECLiPSe page: http://www.hakank.org/eclipse/
 
*/
 
% Licenced under CC-BY-4.0 : http://creativecommons.org/licenses/by/4.0/
 
 
:-lib(ic).
:-lib(ic_search).
 
 
go :-
        findall([V,P], traffic_lights(V,P), L),
        ( foreach([V,P], L) do
              ( for(I,1,4), param(V,P) do
                    VI is V[I],
                    PI is P[I],
                    tr(VC,VI),
                    tr(PC,PI),
                    printf("%w %w ",[VC,PC])
              ),
              nl
        ).
 
 
traffic_lights(V, P) :-
        N  = 4,
        
        dim(V, [N]),
        V :: 1..N,
        dim(P, [N]),
        P :: 1..N,
 
        ( for(I, 1,N) * for(J,1,N), param(N,V,P) do
              JJ is (1+I) mod N,
              J #= JJ ->
              check_allowed(V[I], P[I], V[J], P[J])
        ;
              true
 
        ),
 
 
        term_variables([V,P],Vars),
        labeling(Vars).
 
 
check_allowed(VI, PI, VJ, PJ) :-
        ( foreach(El,[VI, PI, VJ, PJ]),
          fromto(L,[C|In],In,[]) do
              E is El,
              tr(C,E)
        ),
        allowed(L).
         
 
tr(r,1).
tr(ry,2).
tr(g,3).
tr(y,4).
 
allowed([r,r,g,g]).
allowed([ry,r,y,r]).
allowed([g,g,r,r]).
allowed([y,r,ry,r]).