2

リストのリスト (行列) を与える述語が必要です

removeElementM(Line,Column,List,NewList)

(Line,Column) 要素を削除します。

たとえば、List(L) が与えられた場合:

    ([a,b,c,d],
     [e,r,t,y],
     [u,i,o,t])

removeElementM(2,2,L,X) would return

X = [[a,b,c,d],[e,r,t,y],[u,i,t]]

私はすでに停止述語を持っています

removeElementM(0,0,[[_|T1]|T],[T1|T]).

しかし、もう一方の解決策を思い付くことはできません...

4

2 に答える 2

2

そんな感じ :

removeElementM(Line,Column,[List | Rest],[List |NewList]) :-
    Line > 0,
    Line1 is Line - 1,
    removeElementM(Line1, Column, Rest, NewList).

removeElementM(0, Column,[List | Rest],[List1 |Rest]) :-
    removeElementL(Column, List, List1).

removeElementL(Column, [H | T], [H | T1]) :-
    Column > 0,
    Column1 is Column - 1,
    removeElementL(Column1, T, T1).

removeElementL(0, [_H | T], T).
于 2012-10-27T20:26:52.903 に答える
1

SWI-Prolog に実装されているnth0 /4 はかなり強力です。要素が削除された行を別の行に置き換える必要があります。それで

removeElementM(R, C, Mat, Upd) :-
    nth0(R, Mat, OldRow, RestRows),   % get the row and the rest
    nth0(C, OldRow, _Val, NewRow),    % we don't care the _Val deleted
    nth0(R, Upd, NewRow, RestRows).   % insert updated row in rest, get Upd matrix

test :-
    L = [[a,b,c,d],
         [e,r,t,y],
         [u,i,o,t]],
    removeElementM(2,2,L,X),
    writeln(X).

?- test.
[[a,b,c,d],[e,r,t,y],[u,i,t]]

Prolog を学習している場合は、@ joel76 からの回答を確認することをお勧めします。これは、SWI-Prolog 固有の機能を持たない基本的な Prolog です。

于 2012-10-27T23:07:57.023 に答える