从prolog中的列表列表中删除元素(x,y)?

时间:2012-10-27 19:24:59

标签: prolog

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

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]).

但是无法为另一个提出解决方案...

2 个答案:

答案 0 :(得分: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).

答案 1 :(得分: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。