Как я могу удалить возврат из этого кода? - PullRequest
0 голосов
/ 22 декабря 2018

Цель состоит в том, чтобы выбрать фигуры, которые не соприкасаются друг с другом, используя ограничения (clpfd).Вызов start(Pairs,4) вернул бы Pairs = [1,3,5,7].

Одна проблема, которую я заметил, заключается в том, что если я печатаю Final перед маркировкой, он печатает [1,3,5,7].Что означает, что маркировка ничего не делает.

Что я могу изменить / добавить к этому коду, чтобы исправить это, а также убрать возможный возврат?

enter image description here

:-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]).

1 Ответ

0 голосов
/ 26 декабря 2018

Это проблема с независимым набором, которая является сложной задачей NP.Поэтому маловероятно, что кто-либо когда-либо найдет способ сделать это без поиска (обратного отслеживания) для общих случаев.

Что касается вашего кода, labeling/2 ничего не делает, потому что ваш rules/2 на самом деле является поискомПроцедура, которая возвращает решение, оно может найти его.all_different/1 также бесполезен, поскольку подразумевается ascending/1.

Предположительно, ваша цель - это программа, которая устанавливает ограничения (без какого-либо поиска), а затем ищет решение с помощью labeling/2.Для этого вам нужно переосмыслить модель ограничений.Читайте немного о независимых наборах.

...