我正在尝试编写一个prolog程序,可以在2D数组中找到完全被b或w包围的切片。
例如,给定这样的数据集:
[
[b, w, +, +],
[w, +, w, b],
[+, w, b, +],
[+, +, +, b],
]
它将返回另一个包含以下内容的变量:
[
[-, -, -, -],
[-, w, -, -],
[-, -, -, b],
[-, -, -, -],
]
也就是说,它替换了+
完全被b
包围的所有b
和w
所包围的-
,并替换了所有{{1}}其他人使用{{1}}。
任何人都可以就如何构建程序提出任何想法吗?
答案 0 :(得分:1)
这可能有所帮助:它采用您给出的表示形式,并返回一个列表,其元素各自为[ColumnIndex,RowIndex,Value]形式。然后,您可以使用member在特定行/列中查找元素。
encodearray( A, AA ) :- ( A, 0, 0, AA ).
encodearray( [], _, _, [] ).
encodearray( [[]|A], _, R, AA ) :- R1 is R+1, encodeArray( A, 0, R1, AA ).
encodearray( [[A|B]|X], C, R, [[C,R,A]|AA] ) :- C1 is C+1, encodeArray( [B|X], C1, R, AA ).
答案 1 :(得分:0)
使用此rep / 2谓词
rep(L0, L1) :-
rep(b, L0, L1) ;
rep(w, L0, L1).
rep(E, [E|Ps], [-|Rs]) :-
rep1(E, Ps, Rs).
rep(E, [X|Ps], [-|Rs]) :-
E \= X,
rep(Ps, Rs).
rep1(E, [+|Ps], [E|Rs]) :-
rep2(E, Ps, Rs).
rep2(E, [+|Ps], [E|Rs]) :-
rep2(E, Ps, Rs).
rep2(E, [E|Ps], [-|Rs]) :-
dash(Ps, Rs).
dash([], []).
dash([_|Ps], [-|Rs]) :- dash(Ps, Rs).
以这种方式执行
?- rep([b,+,b,b],L).
L = [-, b, -, -] ;
false.
?- rep([b,+,+,+,+,+,b,+,b],L).
L = [-, b, b, b, b, b, -, -, -] .
?- rep([w,+,+,+,+,+,w,+,b],L).
L = [-, w, w, w, w, w, -, -, -] .
?- rep([b,+,+,+,+,+,w,+,b],L).
false.
?- rep([b,+,+,+,+,+,+,b],L).
L = [-, b, b, b, b, b, b, -] .
?- rep([b,+,+,+,+,+,+,+,b],L).
L = [-, b, b, b, b, b, b, b, -] .
?- rep([b,+,+,w,+,+,w,+,b],L).
L = [-, -, -, -, w, w, -, -, -] .
和转置谓词,使rep / 2能够处理列
transpose_col_row([], []).
transpose_col_row([U], B) :- gen(U, B).
transpose_col_row([H|T], R) :- transpose_col_row(T, TC), splash(H, TC, R).
gen([H|T], [[H]|RT]) :- gen(T,RT).
gen([], []).
splash([], [], []).
splash([H|T], [R|K], [[H|R]|U]) :-
splash(T,K,U).
你可以将它们结合起来解决你的问题。 HTH