[ library(ic) | Reference Manual | Alphabetic Index ]

circuit(+Successors)

The vector Successors describes a Hamiltonain circuit
Successors
Collection of integers or variables

Description

Successors is a collection of N elements, describing a directed graph with N nodes (with the nodes numbered 1..N). Each node has a successor, and the i'th element of Successors indicates the successor to node i: Successors[I] = J means that there is an edge from I to J.

The constraint enforces Successors to form a Hamiltonian circuit, i.e. a path through every node, visiting each node once and forming a single circuit.

If only a Hamiltonian path (rather than circuit) is required, add an extra source/sink node and apply the constraint to the extended graph (see example).

This constraint already implies ic:alldifferent(Successors). Depending on the application, it may be advantageous to post a redundant constraint ic_global:alldifferent(Successors) in order to strengthen propagation.

Examples

?- circuit([1, 2, 3]).
No (0.00s cpu)

?- circuit([2, 3, 1]).
Yes (0.00s cpu)

?- circuit([A, B, C]).
A = A{[2, 3]}
B = B{[1, 3]}
C = C{[1, 2]}
There are 6 delayed goals.
Yes (0.00s cpu)

?- dim(S, [3]), circuit(S), labeling(S).
S = [](2, 3, 1)
Yes (0.00s cpu, solution 1, maybe more)
S = [](3, 1, 2)
Yes (0.00s cpu, solution 2)


ham_path(Succ, Start) :-
        array_concat(Succ, [](Start), Succ1),
        circuit(Succ1).

?- dim(S, [3]), ham_path(S, 1), labeling(S).
S = [](2, 3, 4)
Yes (0.00s cpu, solution 1, maybe more)
S = [](3, 4, 2)
Yes (0.00s cpu, solution 2)

See Also

alldifferent / 1, eval_to_array / 2