Пролог перестановки извлечения решения - PullRequest
2 голосов
/ 02 июня 2011
permutation([], []).
permutation(L, [X|Xs]) :- select(X, L, Rest), permutation(Rest, Xs).

Если я наберу permutation([1,2,3],R), первое решение будет «[1,2,3]», но как добраться до второго без использования «;» или «провал». Мне нужно использовать второе решение типа «[1,3,2]» или около того, чтобы сравнить его с другим списком.

Что я имею в виду:

permutation([], []).
permutation(L, [X|Xs]) :- select(X, L, Rest), permutation(Rest, Xs).

go_perm(L,P) :-     
        L = P,
        write(P),nl.

go_perm(L,P) :- 
        permutation(P,P2), % in this case i wanna get the next solution -.- 
        go_perm(L,P2).

Если L = P, то оно заканчивается. Перестановка первого решения для «[1,2,3]» - «[1,2,3]». Но это затягивает меня в стек-поток, потому что он сталкивается с бесконечными вещами. Возможно, вы понимаете меня. Спасибо!

Ответы [ 3 ]

1 голос
/ 03 июня 2011

Вам нужно посмотреть на различные совокупные предикаты. Здесь findall будет работать хорошо. Вы можете вызвать его:

ListIn=[1,2,3], findall(Perm, permutation(ListIn, Perm), Permutations).

Это будет вызывать перестановку в ListIn, пока не произойдет сбой. Каждая возвращаемая перестановкой Пермь будет собрана в переменную Перестановки.

1 голос
/ 02 июня 2011

Предполагая, что вы хотите перебрать решения для их печати

Один из стандартных способов добиться этого - отказ и возврат, как в:

print_all_permutations(X)
  :- permutation(X, Y), print(Y), nl, fail ; true.

Предполагая, что вы просто хотите проверитьесли данное решение верное

Вы уже сделали.Просто вызовите функцию со списком ссылок и списком, который вы хотите протестировать:

permutation([1, 2, 3], [2, 1, 3]).

вернет true, потому что [2, 1, 3] равно перестановке [1,2, 3].Если второй аргумент не является перестановкой, цель оценивается как ложная.

Это магия пролога: найти решение или проверить, является ли данное решение правильным, - это одно и то же.

Между: частичное решение

По-прежнему применимы те же рассуждения:

permutation([1, 2, 3], [2, X, 3]).

покажет единственно возможное значение для X.

Или, если вы хотитевесь список будет результатом:

X = [2, X, 3], permutation([1, 2, 3], X).
0 голосов
/ 02 июня 2011

permutation - это предикат, который успешно выполняется, когда один список является перестановкой другого.Вам на самом деле не нужно перечислять их;просто напишите permutation([1, 2, 3], [2, 1, 3]) и Пролог скажет вам "правда".

...