J'ai écrit un programme prologue qui génère toutes les positions possibles des éléments dans une table bidimensionnelle. Le nombre d'éléments et la taille de la table sont donnés.Prolog, supprimer les résultats répétitifs dans la génération
Mon code est:
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)).
(y TSize
est la taille de la table, N
est le nombre d'éléments, et le dernier est le résultat) geni
prédicat génère nombre dans l'intervalle X
[A;B]
.
Exemple (2 éléments de tableau 2x2):
?- 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.
Ma table est échiquier et les éléments sont chevaliers. Dans ce cas tous les éléments sont égaux mais mon programme "pense" qu'ils sont différents. Comment éviter des résultats égaux? Comme ceci:
R = [k(1, 1), k(1, 2)] ;
R = [k(1, 2), k(1, 1)] ;