2

我需要一个给出列表列表(矩阵)的谓词

removeElementM(Line,Column,List,NewList)

删除 (Line,Column) 元素。

例如给定列表(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 的答案,它是基本的 Prolog,没有 SWI-Prolog 特定功能。

于 2012-10-27T23:07:57.023 回答