Ханойские башни с использованием списков Prolog

Я знаю, что уже есть примеры программ, которые охватывают это, но мне нужно сделать ханойские башни с 6 дисками особым образом для задания, и у меня проблемы. Код, который у меня сейчас есть, приведен ниже:

s([],[],[]).

initial(s([1,2,3,4,5,6], [], [])).

goal(s([],[],[1,2,3,4,5,6])).

У меня также есть 26 строк кода для проверки допустимых состояний, однако я протестировал этот код сам по себе, и он работает, проблема, с которой я столкнулся, заключается в создании кода для перемещения дисков из стека в стек. Пример того, что я пытаюсь сделать вместе с примером запроса, приведен ниже:

changeState((s([A | B],[],[])), s([C], [D], [])) :- C is B, D is A.
?- changeState((s([1,2,3,4,5,6],[],[])), s([2,3,4,5,6], [1], [])).

Итак, это будет самое начало, где все 6 тарелок находятся в первой стопке, и я хочу переместить верхнюю тарелку во вторую стопку. По сути, я хочу иметь возможность удалить первый элемент из списка и добавить его в другой список, независимо от того, пуст он или нет.

Правки:

Получил то, что мне нужно было выше, теперь мне просто нужна помощь в исправлении предиката обхода. Весь код ниже:

%Post A, Post B, Post C
s([],[],[]).

initial(s([1,2,3,4,5,6], [], [])).

goal(s([],[],[1,2,3,4,5,6])).

valid([], _).
valid([H|_], X) :-
    X < H.

changeState((s([A|T1], T2, T3)), s(T1, [A|T2], T3)) :-
    valid(T2, A).
changeState((s([A|T1], T2, T3)), s(T1, T2, [A|T3])) :-
    valid(T3, A).
changeState(s(T1, [A|T2], [B|T3]), s(T1, T2, [A,B|T3])) :-
    valid(A,B).
changeState(s([A|T1], T2, [B|T3]), s([B,A|T1], T2, T3)) :-
    valid(B, A).
changeState(s(T1, [A|T2], [B|T3]), s(T1, [B,A|T2], T3)) :-
    valid(B, A).
changeState(s([A|T1], [B|T2], T3), s(T1, [A,B|T2], T3)) :-
    valid(A,B).
changeState(s([A|T1], [B|T2], T3), s([B,A|T1], T2, T3)) :-
    valid(B,A).
changeState(s([A|T1], T2, [B|T3]), s(T1, T2, [A,B|T3])) :-
    valid(A,B).
changeState(s(T1, [A|T2], T3), s(T1, T2, [A|T3])) :-
    valid(T3, A).
changeState(s(T1, [A|T2], T3), s([A|T1], T2, T3)) :-
    valid(T1, A).
changeState(s(T1, T2, [A|T3]), s(T1, [A|T2], T3)) :-
    valid(T2, A).
changeState(s(T1, T2, [A|T3]), s([A|T1], T2, T3)) :-
    valid(T1, A).

traverse(StartNode,Sol,_) :- goal(StartNode), Sol = [StartNode].
traverse(StartNode,Sol,Visit) :- changeState(StartNode, NextNode),
       not(member(NextNode, Visit)),
       traverse(NextNode, PartialSol, [NextNode|Visit]),
       Sol = [StartNode | PartialSol].

Когда я запускаю этот запрос:

?- traverse((s([1,2,3,4,5,6], [], [])), Sol, s([1,2,3,4,5,6], [], [])).

Я получаю этот вывод: output

Я оставил его включенным после того, как получил эти ответы в течение примерно 10 минут, и он все еще не создает новые, поэтому он просто продолжает работать снова и снова. Как упоминалось выше, цель программы — решить задачу о ханойских башнях с 6 дисками с помощью списков. Для тех, кто не знаком с Ханойскими башнями, вам нужно переместить все диски из первой стопки в последнюю 3-ю стопку. Вы можете перемещать только 1 диск за раз, и вы не можете класть больший диск поверх меньшего диска. Таким образом, вы начинаете с (s([1,2,3,4,5,6], [], [])) с каждым списком, представляющим стек A, стек B, стек C соответственно, и цель состоит в том, чтобы закончиться ( s([], [], [1,2,3,4,5,6])). Я вручную прогнал все решение (63 хода) через предикаты changeState, и все переходы были приняты, поэтому проблема связана с поперечным предикатом. Поперечный предикат предназначен для отображения всех шагов, ведущих к решению, и всех возможных решений. Это также предназначено для остановки циклов, так что это не просто замена одних и тех же 2 дисков снова и снова. Не могу понять, что не так с моими предикатами, из-за которых я получаю этот вывод, я все еще новичок в прологе, поэтому буду признателен за любую помощь!


person Intellects    schedule 17.12.2018    source источник
comment
ваш полный минимально воспроизводимый пример? ваш пример запроса? желаемые результаты? фактические результаты? ваш конкретный вопрос?   -  person Will Ness    schedule 17.12.2018
comment
На исходный вопрос, который я разместил, был дан ответ, но мне нужна была помощь на следующем этапе, поэтому я внес изменения в ответ на ответ другого человека и предположил, что они скоро ответят, поэтому я не объяснил изменения. Поскольку он ответил, и это не решило мою проблему, я скорректировал правки так, чтобы всем было ясно, что мне сейчас нужно.   -  person Intellects    schedule 17.12.2018
comment
ваше выходное изображение показывает, что вы получили 12 решений и нажали ; 12 раз, чтобы запросить следующее решение. Это то, что случилось? Вы хотите сказать, что после нажатия ; в 12-й раз вы ждали 10 минут, не получив следующего решения?   -  person Will Ness    schedule 17.12.2018
comment
Как я уже упоминал, это предназначено для решения головоломки ханойских башен и отображения всех шагов, необходимых для решения проблемы, то есть в конце должно отображаться (s([], [], [1,2,3, 4,5,6] и показать каждый переход к этому решению из начальной точки, которая, как я уже упоминал, есть (s([1,2,3,4,5,6], [], []) ).Вывод цели никогда не отображается.В этом выводе одно и то же снова и снова 12 раз.После 12-го раза он все еще проходит через предикаты,но я оставил его работать более 10 минут и он еще не предоставил каких-либо дополнительных выходных данных.   -  person Intellects    schedule 17.12.2018
comment
Итак, вы получили 12 решений для вашего запроса. Вы уверены, что они были неправы? Вместо того, чтобы нажимать ;, нажмите w один раз, затем нажмите .. Скопируйте результат и разместите здесь.   -  person Will Ness    schedule 17.12.2018
comment
@Intellects: это потому, что Пролог обычно обрезает запись списка. На самом деле эти элементы существуют, но если это сгенерирует список из 100 000 элементов, то он по умолчанию не заполнит ваш экран шумом.   -  person Willem Van Onsem    schedule 17.12.2018
comment
Он выдает слишком много вывода, чтобы я мог вставить его целиком, но выдает правильный вывод, когда я нажимаю w. Таким образом, вывод, который он мне показывал, был только началом решения, но он не может показать все решение, пока я не нажму w?   -  person Intellects    schedule 17.12.2018
comment
@Intellects: может, вы также можете использовать traverse(..,S,...),print(S) для печати S, в этом случае он напечатает весь список в STDOUT.   -  person Willem Van Onsem    schedule 17.12.2018
comment
Другие списки — это просто другие способы решения головоломки.   -  person Willem Van Onsem    schedule 17.12.2018
comment
Ах, хорошо, я этого не знал, я никогда не имел дело с такими большими решениями, поэтому я не знал, что это не просто распечатает все это. Спасибо за помощь!   -  person Intellects    schedule 17.12.2018


Ответы (1)


Здесь вы можете использовать унификацию вместо is/2 (которая обычно используется для оценки выражений).

Например, мы можем определить ход из первой башни во вторую башню, если вторая башня пуста:

changeState((s([A|T1],[], T3)), s(T1, [A], T3)).

или мы можем переместить элемент во вторую непустую башню, учитывая, что на вершине стека находится элемент, который больше:

changeState(s([A|T1], [B|T2], T3), s(T1, [A,B|T2], T3)) :-
    A < B.

Вышеприведенное приведет к 12 правилам: 3 источника, умножить на 2 пункта назначения, умножить на 2 возможности (пустой пункт назначения или непустой пункт назначения). Это не очень элегантно. Мы можем создать вспомогательный предикат, который проверяет, является ли целевой стек действительным, с помощью:

valid_stack([], _).
valid_stack([H|_], X) :-
    X < H.

поэтому мы можем сжать два приведенных выше правила в:

changeState((s([A|T1], T2, T3)), s(T1, [A|T2], T3)) :-
    valid_stack(T2, A).

Таким образом, получится шесть правил: три источника и два адресата.

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

Однако это не полное решение (остальное я оставлю в качестве упражнения). Вам понадобится механизм, который перечисляет возможные ходы и следит за тем, чтобы вы не попали в петлю (например, постоянно перемещая диск между двумя башнями).

После использования предиката traverse/3 получаем список ходов к цели:

?- traverse(s([1,2,3,4,5,6], [], []), S, [s([1,2,3,4,5,6], [], [])]).
S = [s([1, 2, 3, 4, 5, 6], [], []), s([2, 3, 4, 5, 6], [1], []), s([3, 4, 5, 6], [1], [2]), s([1, 3, 4, 5|...], [], [2]), s([3, 4, 5|...], [], [1, 2]), s([4, 5|...], [3], [1, 2]), s([1|...], [3], [2]), s([...|...], [...|...], [...]), s(..., ..., ...)|...] [write]
S = [s([1, 2, 3, 4, 5, 6], [], []), s([2, 3, 4, 5, 6], [1], []), s([3, 4, 5, 6], [1], [2]), s([1, 3, 4, 5, 6], [], [2]), s([3, 4, 5, 6], [], [1, 2]), s([4, 5, 6], [3], [1, 2]), s([1, 4, 5, 6], [3], [2]), s([4, 5, 6], [1, 3], [2]), s([2, 4, 5, 6], [1, 3], []), s([1, 2, 4, 5, 6], [3], []), s([2, 4, 5, 6], [3], [1]), s([4, 5, 6], [2, 3], [1]), s([1, 4, 5, 6], [2, 3], []), s([4, 5, 6], [1, 2, 3], []), s([5, 6], [1, 2, 3], [4]), s([1, 5, 6], [2, 3], [4]), s([5, 6], [2, 3], [1, 4]), s([2, 5, 6], [3], [1, 4]), s([1, 2, 5, 6], [3], [4]), s([2, 5, 6], [1, 3], [4]), s([5, 6], [1, 3], [2, 4]), s([1, 5, 6], [3], [2, 4]), s([5, 6], [3], [1, 2, 4]), s([3, 5, 6], [], [1, 2, 4]), s([1, 3, 5, 6], [], [2, 4]), s([3, 5, 6], [1], [2, 4]), s([2, 3, 5, 6], [1], [4]), s([1, 2, 3, 5, 6], [], [4]), s([2, 3, 5, 6], [], [1, 4]), s([3, 5, 6], [2], [1, 4]), s([1, 3, 5, 6], [2], [4]), s([3, 5, 6], [1, 2], [4]), s([5, 6], [1, 2], [3, 4]), s([1, 5, 6], [2], [3, 4]), s([5, 6], [2], [1, 3, 4]), s([2, 5, 6], [], [1, 3, 4]), s([1, 2, 5, 6], [], [3, 4]), s([2, 5, 6], [1], [3, 4]), s([5, 6], [1], [2, 3, 4]), s([1, 5, 6], [], [2, 3, 4]), s([5, 6], [], [1, 2, 3, 4]), s([6], [5], [1, 2, 3, 4]), s([1, 6], [5], [2, 3, 4]), s([6], [1, 5], [2, 3, 4]), s([2, 6], [1, 5], [3, 4]), s([1, 2, 6], [5], [3, 4]), s([2, 6], [5], [1, 3, 4]), s([6], [2, 5], [1, 3, 4]), s([1, 6], [2, 5], [3, 4]), s([6], [1, 2, 5], [3, 4]), s([3, 6], [1, 2, 5], [4]), s([1, 3, 6], [2, 5], [4]), s([3, 6], [2, 5], [1, 4]), s([2, 3, 6], [5], [1, 4]), s([1, 2, 3, 6], [5], [4]), s([2, 3, 6], [1, 5], [4]), s([3, 6], [1, 5], [2, 4]), s([1, 3, 6], [5], [2, 4]), s([3, 6], [5], [1, 2, 4]), s([6], [3, 5], [1, 2, 4]), s([1, 6], [3, 5], [2, 4]), s([6], [1, 3, 5], [2, 4]), s([2, 6], [1, 3, 5], [4]), s([1, 2, 6], [3, 5], [4]), s([2, 6], [3, 5], [1, 4]), s([6], [2, 3, 5], [1, 4]), s([1, 6], [2, 3, 5], [4]), s([6], [1, 2, 3, 5], [4]), s([4, 6], [1, 2, 3, 5], []), s([1, 4, 6], [2, 3, 5], []), s([4, 6], [2, 3, 5], [1]), s([2, 4, 6], [3, 5], [1]), s([1, 2, 4, 6], [3, 5], []), s([2, 4, 6], [1, 3, 5], []), s([4, 6], [1, 3, 5], [2]), s([1, 4, 6], [3, 5], [2]), s([4, 6], [3, 5], [1, 2]), s([3, 4, 6], [5], [1, 2]), s([1, 3, 4, 6], [5], [2]), s([3, 4, 6], [1, 5], [2]), s([2, 3, 4, 6], [1, 5], []), s([1, 2, 3, 4, 6], [5], []), s([2, 3, 4, 6], [5], [1]), s([3, 4, 6], [2, 5], [1]), s([1, 3, 4, 6], [2, 5], []), s([3, 4, 6], [1, 2, 5], []), s([4, 6], [1, 2, 5], [3]), s([1, 4, 6], [2, 5], [3]), s([4, 6], [2, 5], [1, 3]), s([2, 4, 6], [5], [1, 3]), s([1, 2, 4, 6], [5], [3]), s([2, 4, 6], [1, 5], [3]), s([4, 6], [1, 5], [2, 3]), s([1, 4, 6], [5], [2, 3]), s([4, 6], [5], [1, 2, 3]), s([6], [4, 5], [1, 2, 3]), s([1, 6], [4, 5], [2, 3]), s([6], [1, 4, 5], [2, 3]), s([2, 6], [1, 4, 5], [3]), s([1, 2, 6], [4, 5], [3]), s([2, 6], [4, 5], [1, 3]), s([6], [2, 4, 5], [1, 3]), s([1, 6], [2, 4, 5], [3]), s([6], [1, 2, 4, 5], [3]), s([3, 6], [1, 2, 4, 5], []), s([1, 3, 6], [2, 4, 5], []), s([3, 6], [2, 4, 5], [1]), s([2, 3, 6], [4, 5], [1]), s([1, 2, 3, 6], [4, 5], []), s([2, 3, 6], [1, 4, 5], []), s([3, 6], [1, 4, 5], [2]), s([1, 3, 6], [4, 5], [2]), s([3, 6], [4, 5], [1, 2]), s([6], [3, 4, 5], [1, 2]), s([1, 6], [3, 4, 5], [2]), s([6], [1, 3, 4, 5], [2]), s([2, 6], [1, 3, 4, 5], []), s([1, 2, 6], [3, 4, 5], []), s([2, 6], [3, 4, 5], [1]), s([6], [2, 3, 4, 5], [1]), s([1, 6], [2, 3, 4, 5], []), s([6], [1, 2, 3, 4, 5], []), s([], [1, 2, 3, 4, 5], [6]), s([1], [2, 3, 4, 5], [6]), s([], [2, 3, 4, 5], [1, 6]), s([2], [3, 4, 5], [1, 6]), s([1, 2], [3, 4, 5], [6]), s([2], [1, 3, 4, 5], [6]), s([], [1, 3, 4, 5], [2, 6]), s([1], [3, 4, 5], [2, 6]), s([], [3, 4, 5], [1, 2, 6]), s([3], [4, 5], [1, 2, 6]), s([1, 3], [4, 5], [2, 6]), s([3], [1, 4, 5], [2, 6]), s([2, 3], [1, 4, 5], [6]), s([1, 2, 3], [4, 5], [6]), s([2, 3], [4, 5], [1, 6]), s([3], [2, 4, 5], [1, 6]), s([1, 3], [2, 4, 5], [6]), s([3], [1, 2, 4, 5], [6]), s([], [1, 2, 4, 5], [3, 6]), s([1], [2, 4, 5], [3, 6]), s([], [2, 4, 5], [1, 3, 6]), s([2], [4, 5], [1, 3, 6]), s([1, 2], [4, 5], [3, 6]), s([2], [1, 4, 5], [3, 6]), s([], [1, 4, 5], [2, 3, 6]), s([1], [4, 5], [2, 3, 6]), s([], [4, 5], [1, 2, 3, 6]), s([4], [5], [1, 2, 3, 6]), s([1, 4], [5], [2, 3, 6]), s([4], [1, 5], [2, 3, 6]), s([2, 4], [1, 5], [3, 6]), s([1, 2, 4], [5], [3, 6]), s([2, 4], [5], [1, 3, 6]), s([4], [2, 5], [1, 3, 6]), s([1, 4], [2, 5], [3, 6]), s([4], [1, 2, 5], [3, 6]), s([3, 4], [1, 2, 5], [6]), s([1, 3, 4], [2, 5], [6]), s([3, 4], [2, 5], [1, 6]), s([2, 3, 4], [5], [1, 6]), s([1, 2, 3, 4], [5], [6]), s([2, 3, 4], [1, 5], [6]), s([3, 4], [1, 5], [2, 6]), s([1, 3, 4], [5], [2, 6]), s([3, 4], [5], [1, 2, 6]), s([4], [3, 5], [1, 2, 6]), s([1, 4], [3, 5], [2, 6]), s([4], [1, 3, 5], [2, 6]), s([2, 4], [1, 3, 5], [6]), s([1, 2, 4], [3, 5], [6]), s([2, 4], [3, 5], [1, 6]), s([4], [2, 3, 5], [1, 6]), s([1, 4], [2, 3, 5], [6]), s([4], [1, 2, 3, 5], [6]), s([], [1, 2, 3, 5], [4, 6]), s([1], [2, 3, 5], [4, 6]), s([], [2, 3, 5], [1, 4, 6]), s([2], [3, 5], [1, 4, 6]), s([1, 2], [3, 5], [4, 6]), s([2], [1, 3, 5], [4, 6]), s([], [1, 3, 5], [2, 4, 6]), s([1], [3, 5], [2, 4, 6]), s([], [3, 5], [1, 2, 4, 6]), s([3], [5], [1, 2, 4, 6]), s([1, 3], [5], [2, 4, 6]), s([3], [1, 5], [2, 4, 6]), s([2, 3], [1, 5], [4, 6]), s([1, 2, 3], [5], [4, 6]), s([2, 3], [5], [1, 4, 6]), s([3], [2, 5], [1, 4, 6]), s([1, 3], [2, 5], [4, 6]), s([3], [1, 2, 5], [4, 6]), s([], [1, 2, 5], [3, 4, 6]), s([1], [2, 5], [3, 4, 6]), s([], [2, 5], [1, 3, 4, 6]), s([2], [5], [1, 3, 4, 6]), s([1, 2], [5], [3, 4, 6]), s([2], [1, 5], [3, 4, 6]), s([], [1, 5], [2, 3, 4, 6]), s([1], [5], [2, 3, 4, 6]), s([], [5], [1, 2, 3, 4, 6]), s([5], [], [1, 2, 3, 4, 6]), s([1, 5], [], [2, 3, 4, 6]), s([5], [1], [2, 3, 4, 6]), s([2, 5], [1], [3, 4, 6]), s([1, 2, 5], [], [3, 4, 6]), s([2, 5], [], [1, 3, 4, 6]), s([5], [2], [1, 3, 4, 6]), s([1, 5], [2], [3, 4, 6]), s([5], [1, 2], [3, 4, 6]), s([3, 5], [1, 2], [4, 6]), s([1, 3, 5], [2], [4, 6]), s([3, 5], [2], [1, 4, 6]), s([2, 3, 5], [], [1, 4, 6]), s([1, 2, 3, 5], [], [4, 6]), s([2, 3, 5], [1], [4, 6]), s([3, 5], [1], [2, 4, 6]), s([1, 3, 5], [], [2, 4, 6]), s([3, 5], [], [1, 2, 4, 6]), s([5], [3], [1, 2, 4, 6]), s([1, 5], [3], [2, 4, 6]), s([5], [1, 3], [2, 4, 6]), s([2, 5], [1, 3], [4, 6]), s([1, 2, 5], [3], [4, 6]), s([2, 5], [3], [1, 4, 6]), s([5], [2, 3], [1, 4, 6]), s([1, 5], [2, 3], [4, 6]), s([5], [1, 2, 3], [4, 6]), s([4, 5], [1, 2, 3], [6]), s([1, 4, 5], [2, 3], [6]), s([4, 5], [2, 3], [1, 6]), s([2, 4, 5], [3], [1, 6]), s([1, 2, 4, 5], [3], [6]), s([2, 4, 5], [1, 3], [6]), s([4, 5], [1, 3], [2, 6]), s([1, 4, 5], [3], [2, 6]), s([4, 5], [3], [1, 2, 6]), s([3, 4, 5], [], [1, 2, 6]), s([1, 3, 4, 5], [], [2, 6]), s([3, 4, 5], [1], [2, 6]), s([2, 3, 4, 5], [1], [6]), s([1, 2, 3, 4, 5], [], [6]), s([2, 3, 4, 5], [], [1, 6]), s([3, 4, 5], [2], [1, 6]), s([1, 3, 4, 5], [2], [6]), s([3, 4, 5], [1, 2], [6]), s([4, 5], [1, 2], [3, 6]), s([1, 4, 5], [2], [3, 6]), s([4, 5], [2], [1, 3, 6]), s([2, 4, 5], [], [1, 3, 6]), s([1, 2, 4, 5], [], [3, 6]), s([2, 4, 5], [1], [3, 6]), s([4, 5], [1], [2, 3, 6]), s([1, 4, 5], [], [2, 3, 6]), s([4, 5], [], [1, 2, 3, 6]), s([5], [4], [1, 2, 3, 6]), s([1, 5], [4], [2, 3, 6]), s([5], [1, 4], [2, 3, 6]), s([2, 5], [1, 4], [3, 6]), s([1, 2, 5], [4], [3, 6]), s([2, 5], [4], [1, 3, 6]), s([5], [2, 4], [1, 3, 6]), s([1, 5], [2, 4], [3, 6]), s([5], [1, 2, 4], [3, 6]), s([3, 5], [1, 2, 4], [6]), s([1, 3, 5], [2, 4], [6]), s([3, 5], [2, 4], [1, 6]), s([2, 3, 5], [4], [1, 6]), s([1, 2, 3, 5], [4], [6]), s([2, 3, 5], [1, 4], [6]), s([3, 5], [1, 4], [2, 6]), s([1, 3, 5], [4], [2, 6]), s([3, 5], [4], [1, 2, 6]), s([5], [3, 4], [1, 2, 6]), s([1, 5], [3, 4], [2, 6]), s([5], [1, 3, 4], [2, 6]), s([2, 5], [1, 3, 4], [6]), s([1, 2, 5], [3, 4], [6]), s([2, 5], [3, 4], [1, 6]), s([5], [2, 3, 4], [1, 6]), s([1, 5], [2, 3, 4], [6]), s([5], [1, 2, 3, 4], [6]), s([], [1, 2, 3, 4], [5, 6]), s([1], [2, 3, 4], [5, 6]), s([], [2, 3, 4], [1, 5, 6]), s([2], [3, 4], [1, 5, 6]), s([1, 2], [3, 4], [5, 6]), s([2], [1, 3, 4], [5, 6]), s([], [1, 3, 4], [2, 5, 6]), s([1], [3, 4], [2, 5, 6]), s([], [3, 4], [1, 2, 5, 6]), s([3], [4], [1, 2, 5, 6]), s([1, 3], [4], [2, 5, 6]), s([3], [1, 4], [2, 5, 6]), s([2, 3], [1, 4], [5, 6]), s([1, 2, 3], [4], [5, 6]), s([2, 3], [4], [1, 5, 6]), s([3], [2, 4], [1, 5, 6]), s([1, 3], [2, 4], [5, 6]), s([3], [1, 2, 4], [5, 6]), s([], [1, 2, 4], [3, 5, 6]), s([1], [2, 4], [3, 5, 6]), s([], [2, 4], [1, 3, 5, 6]), s([2], [4], [1, 3, 5, 6]), s([1, 2], [4], [3, 5, 6]), s([2], [1, 4], [3, 5, 6]), s([], [1, 4], [2, 3, 5, 6]), s([1], [4], [2, 3, 5, 6]), s([], [4], [1, 2, 3, 5, 6]), s([4], [], [1, 2, 3, 5, 6]), s([1, 4], [], [2, 3, 5, 6]), s([4], [1], [2, 3, 5, 6]), s([2, 4], [1], [3, 5, 6]), s([1, 2, 4], [], [3, 5, 6]), s([2, 4], [], [1, 3, 5, 6]), s([4], [2], [1, 3, 5, 6]), s([1, 4], [2], [3, 5, 6]), s([4], [1, 2], [3, 5, 6]), s([3, 4], [1, 2], [5, 6]), s([1, 3, 4], [2], [5, 6]), s([3, 4], [2], [1, 5, 6]), s([2, 3, 4], [], [1, 5, 6]), s([1, 2, 3, 4], [], [5, 6]), s([2, 3, 4], [1], [5, 6]), s([3, 4], [1], [2, 5, 6]), s([1, 3, 4], [], [2, 5, 6]), s([3, 4], [], [1, 2, 5, 6]), s([4], [3], [1, 2, 5, 6]), s([1, 4], [3], [2, 5, 6]), s([4], [1, 3], [2, 5, 6]), s([2, 4], [1, 3], [5, 6]), s([1, 2, 4], [3], [5, 6]), s([2, 4], [3], [1, 5, 6]), s([4], [2, 3], [1, 5, 6]), s([1, 4], [2, 3], [5, 6]), s([4], [1, 2, 3], [5, 6]), s([], [1, 2, 3], [4, 5, 6]), s([1], [2, 3], [4, 5, 6]), s([], [2, 3], [1, 4, 5, 6]), s([2], [3], [1, 4, 5, 6]), s([1, 2], [3], [4, 5, 6]), s([2], [1, 3], [4, 5, 6]), s([], [1, 3], [2, 4, 5, 6]), s([1], [3], [2, 4, 5, 6]), s([], [3], [1, 2, 4, 5, 6]), s([3], [], [1, 2, 4, 5, 6]), s([1, 3], [], [2, 4, 5, 6]), s([3], [1], [2, 4, 5, 6]), s([2, 3], [1], [4, 5, 6]), s([1, 2, 3], [], [4, 5, 6]), s([2, 3], [], [1, 4, 5, 6]), s([3], [2], [1, 4, 5, 6]), s([1, 3], [2], [4, 5, 6]), s([3], [1, 2], [4, 5, 6]), s([], [1, 2], [3, 4, 5, 6]), s([1], [2], [3, 4, 5, 6]), s([], [2], [1, 3, 4, 5, 6]), s([2], [], [1, 3, 4, 5, 6]), s([1, 2], [], [3, 4, 5, 6]), s([2], [1], [3, 4, 5, 6]), s([], [1], [2, 3, 4, 5, 6]), s([1], [], [2, 3, 4, 5, 6]), s([], [], [1, 2, 3, 4, 5, 6])]

В SWI-Prolog нужно нажать W, чтобы попросить интерактивную оболочку распечатать полный список.

person Willem Van Onsem    schedule 17.12.2018
comment
Я сделал предикат обхода, который должен избегать повторов, но это дает мне странные результаты, и я не могу понять, почему. Это не позволит мне правильно отформатировать код в комментариях, поэтому я отредактировал свой исходный пост с предикатом traverse вместе с кодом изменения состояния. Вы случайно не видите, что не так? - person Intellects; 17.12.2018
comment
@Intellects: я думаю, вы определили слишком много переходов между состояниями, окончательный код должен иметь шесть предложений, как последний фрагмент кода. - person Willem Van Onsem; 17.12.2018
comment
Переходы состояний охватывают все возможные переходы, если я использую только то, что вы предоставили, это не сработает. Должно быть 12 переходов между состояниями, потому что есть 3 башни. То, что я использовал, охватывает от A->B, A->C, B->A, B->C, C->A, C->B, покрывает эти переходы, будь то перенос в пустой стек или непустой стек. . - person Intellects; 17.12.2018
comment
@Intellects: нет шести, поскольку различие между пустым стеком и непустым стеком было отменено с последним редактированием. - person Willem Van Onsem; 17.12.2018
comment
Вы правы, только что поняли это, сократили некоторые строки, но все равно получили более или менее те же результаты: . Как только он выдает их, он просто продолжает работать вечно и не выдает никаких дополнительных ответов. - person Intellects; 17.12.2018
comment
@Intellects: когда я запускаю вышеуказанное локально (с [s(..)] в качестве первого посещения, поэтому список из s(..), а не только s(..)), он продолжает предоставлять решения. - person Willem Van Onsem; 17.12.2018