Цель состоит в том, чтобы выбрать фигуры, которые не соприкасаются друг с другом, используя ограничения (clpfd).Вызов start(Pairs,4)
вернул бы Pairs = [1,3,5,7]
.
Одна проблема, которую я заметил, заключается в том, что если я печатаю Final перед маркировкой, он печатает [1,3,5,7]
.Что означает, что маркировка ничего не делает.
Что я могу изменить / добавить к этому коду, чтобы исправить это, а также убрать возможный возврат?
![enter image description here](https://i.stack.imgur.com/UU0uB.png)
:-use_module(library(clpfd)).
:-use_module(library(lists)).
% init initialises Pairs and Max
% Pairs - The elements inside the Nth list in Pairs,
% represent the index of the shapes that shape N can touch
init([[3,5,6,7],[4,5,7],[1,4,5,7],[2,3,7],[1,2,3,7],[1],[1,2,3,4,5]],7).
start(Final, N):-
init(Pairs, Max),
length(Final, N),
domain(Final, 1, Max),
ascending(Final),
all_different(Final),
rules(Pairs,Final),
labeling([],Final).
rules(_,[]).
rules(Pairs,[H|T]):-
nth1(H,Pairs,PairH),
secondrule(PairH,T),
rules(Pairs,T).
secondrule(_, []).
secondrule(PairH, [H|T]):-
element(_,PairH,H),
secondrule(PairH, T).
ascending([_|[]]).
ascending([H|[T1|T2]]):-
H #< T1,
ascending([T1|T2]).