2次元の表の要素の可能な位置をすべて生成するプロローグプログラムを作成しました。要素数とテーブルサイズが与えられます。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)).
述語geni
間隔[A;B]
で数X
を生成する(TSize
はN
、要素の数であり、そして最後の結果であり、表のサイズがあります)。
例(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)] ;