2

私はパズル ソルバー (ノノグラム、グリドラー、ピクロスなど) に取り組んでいます。楽しみのためだけに、ASP についてもう少し学びたいと思っています。(ウィキペディアでこれらのパズルの詳細を読むことができますhttps://en.wikipedia.org/wiki/Nonogram )

グループの左側と右側に 1 つずつ、cell(I,J,o)2 つの白いセル ( ) に囲まれた、水平方向に連続した黒色のセル ( ) のグループがあるかどうかを確認したいと考えています。cell(I,J,x)

#const rows = 3.
#const cols = 3.

symbol(x;o).

row(0..rows+1).
col(0..cols+1).

% Padding surrounding the puzzle so we can check every group's surroundings
cell(I,0,x) :- row(I).
cell(I,cols+1,x) :- row(I).  
cell(0,J,x) :- col(J).
cell(cols+1,J,x) :- col(J).

% Assign symbols to every cell available
1 { cell(I, J, S) : symbol(S) } 1 :- row(I), col(J).

% Horizontal block (row,starting col,length)
hblock(I,J1,L) :- row(I), col(J1), col(J2), J1 <= J2, L = J2-J1+1, 
                    col(J1-1), col(J2+1), cell(I,J1..J2,o),
                    cell(I,J1-1,x), cell(I,J2+1,x).

% Output only cells that are not padding
out_cell(I,J,S) :- cell(I,J,S), I > 0, J > 0, I <= rows, J <= cols.

#hide.
#show hblock/3.
#show out_cell/3.

ご覧のとおりcell(I,J1..J2,o)、定義でとhblock/3の間のすべてのセルが黒 (o 記号でマーク) であることを確認するために使用していますが、次の入力が与えられた場合:col(J1)col(J2)

cell(1,1,x). cell(1,2,x). cell(1,3,x).
cell(2,1,o). cell(2,2,x). cell(2,3,o).
cell(3,1,x). cell(3,2,x). cell(3,3,x).

を出力hblock(2,3,1) hblock(2,1,3) hblock(2,1,1)します。これは、単一の黒セルの 2 つのブロック ((2,1) と (2,3)) と、(2,1) と (2,3) の間の 3 つの黒セルの大きなブロックを検出していることを意味します。しかし、中央に x でマークされたセルがあるため、検出されるべきではありません...

私は何を間違っていますか?

4

1 に答える 1

1

私の記憶が正しければcell(I,J1..J2,o)、J1 と J2 の間の番号ごとに個別のルールが生成されます。同じ行、つまり1つのルールでそれらを展開しません。そう

hblock(I,J1,L) :- row(I), col(J1), col(J2), J1 <= J2, L = J2-J1+1, 
                col(J1-1), col(J2+1), cell(I,J1..J2,o),
                cell(I,J1-1,x), cell(I,J2+1,x).

に展開します

...
hblock(1,1,1) :- cell(1,1,o).
hblock(1,2,1) :- cell(1,2,o).
hblock(1,3,1) :- cell(1,3,o).
hblock(1,1,2) :- cell(1,1,o).
hblock(1,1,2) :- cell(1,2,o).
hblock(1,2,2) :- cell(1,2,o).
hblock(1,2,2) :- cell(1,3,o).
hblock(1,1,3) :- cell(1,1,o).
hblock(1,1,3) :- cell(1,2,o).
hblock(1,1,3) :- cell(1,3,o).
...

私はその理由を理解するまでには至りませんでしたhblock(2,1,2)hblock(2,2,2)、それはおそらくあまり関係がありません。

于 2015-12-15T16:57:48.150 に答える