Ответ в теме: Помогите решить задачу Железнодорожная стрелка

      Комментарии к записи Ответ в теме: Помогите решить задачу Железнодорожная стрелка отключены
#1882

Я решал бы вашу задачу с поиском в глубину, т.к. тут нет большой разницы, но поиск в глубину выглядит попроще.

Правило генерации состояний я переписал так:

generate((L, [V], R), (LL, [], RR)):-
  append(L, [V], LL), RR = R;
  LL = L, append([V], R, RR).
generate((L, [], R), (LL, [V], RR)):-
  L = [лок|_], last(L, V), append(LL, [V], L), RR = R;
  last(R, лок), R = [V|RR], LL = L.

Тут учитывается то, что вагон кто-то должен затолкнуть в тупик, поэтому с края должен быть локомотив.

Предикат поиска в глубину я взял почти без изменений, единственное отличие в том, что вместо сравнения текущего состояния с конечным вызывается предикат is_finish_state (выше я описывал его как check).

	
dfs(State, _, [State]):-
  is_finish_state(State), !.
dfs(A, VN, [A|TR]):-
  generate(A, X),
  not(member(X, VN)),
  dfs(X, [A|VN], TR).

решение задачи Железнодорожная стрелка