4

2D配列でbまたはwで完全に囲まれているタイルを見つけることができるプロローグプログラムを作成しようとしています。

たとえば、次のようなデータセットがあるとします。

[
    [b, w, +, +],
    [w, +, w, b],
    [+, w, b, +],
    [+, +, +, b],
]

以下を含む別の変数を返します。

[
    [-, -, -, -],
    [-, w, -, -],
    [-, -, -, b],
    [-, -, -, -],
]

つまり、+完全にで囲まれているものはbすべて、で置き換えられ、でb囲まれているものはすべて同じであり、wそれ以外はすべてで置き換えられます-

誰かがこれを行うためのプログラムを構築する方法について何かアイデアを与えることができますか?

4

2 に答える 2

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 ).
于 2012-04-09T02:11:53.430 に答える
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

于 2012-04-09T09:07:20.793 に答える