Я написал программу пролога, которая генерирует все возможные положения элементов в двумерной таблице. Дано количество элементов и размер таблицы.Prolog, удалять повторяющиеся результаты в генерации
Мой код:
geni(Min, Min, Max) :- Min =< Max.
geni(Min, X, Max) :- Max >= Min, MinInc is Min+1, geni(MinInc, X, Max).
generate(_, 0, []) :- !.
generate(TSize, N, [X|Tail]) :- NDec is N-1, generate(TSize,NDec, Tail),
X=k(X1,Y1), geni(1,X1,TSize), geni(1,Y1,TSize),
not(member(X, Tail)).
(там TSize
является размер таблицы, N
является количество элементов, а последний результат) предиката geni
генерирует номер X
в интервале [A;B]
.
Пример (2 элементы в таблице 2х2):
?- generate(2, 2, R).
R = [k(1, 1), k(1, 2)] ;
R = [k(1, 1), k(2, 1)] ;
R = [k(1, 1), k(2, 2)] ;
R = [k(1, 2), k(1, 1)] ;
R = [k(1, 2), k(2, 1)] ;
R = [k(1, 2), k(2, 2)] ;
R = [k(2, 1), k(1, 1)] ;
R = [k(2, 1), k(1, 2)] ;
R = [k(2, 1), k(2, 2)] ;
R = [k(2, 2), k(1, 1)] ;
R = [k(2, 2), k(1, 2)] ;
R = [k(2, 2), k(2, 1)] ;
false.
Моя таблица шахматная доска и элементы рыцарей. В этом случае все элементы равны, но моя программа «думает» о том, что они разные. Как избежать равных результатов? Как это:
R = [k(1, 1), k(1, 2)] ;
R = [k(1, 2), k(1, 1)] ;