首页 > 解决方案 > Prolog - 从矩阵中删除第 N 列

问题描述

我正在尝试创建一个elimcol(_, [H|T], X)删除矩阵数组中第 n 列的查询。

我相信我作为初学者使事情复杂化,但在 Prolog 逻辑中,将矩阵称为“列表列表”会更好。话虽如此,由于列本质上是每个列表列表中的“第 i 个”元素,那么如何从列表列表中的所有列表中删除第 i 个元素。(我很抱歉这个令人困惑的声明)

到目前为止,这是我能够创建的:

elimcol(1, [G|H], H) :- !.
elimcol(N, [G|H], [G|L]) :- 
    N > 1, 
    Nn is N - 1,
    !,
    elimcol(Nn,H,L).

这可以删除一个列表。但是,当我尝试扩展删除更多列表时,它似乎不再删除“第 i 个元素”。

?- elimcol(3,[[1,2,3], [1,1,1], [4,5,6]], X).
X = [[1, 2, 3], [1, 1, 1]].

感谢您对此的任何帮助。非常感谢!

编辑:做了一些小改动,但是结果相同,我仍然只能删除第 i 个元素(只有一个列表)

elimcol(_, [], []).
elimcol(1, [_|T], T) :- !.
elimcol(I, [H|T], [H|R]) :-
   I1 is I-1,
   !, 
   elimcol(I1, T, R).

标签: prolog

解决方案


maplist/N 这是证明多个列表元素之间关系的惯用方式,并且 nth1/4 可用于丢弃一行中的列。然后

del_mat_col(M,N,M1) :-
    maplist(del_col(N),M,M1).
del_col(N,R,R1) :- nth1(N,R,_,R1).

产量

?- M=[[a,b,c],[d,e,f],[g,h,j]],del_mat_col(M,1,M1).
M = [[a, b, c], [d, e, f], [g, h, j]],
M1 = [[b, c], [e, f], [h, j]].

?- M=[[a,b,c],[d,e,f],[g,h,j]],del_mat_col(M,2,M1).
M = [[a, b, c], [d, e, f], [g, h, j]],
M1 = [[a, c], [d, f], [g, j]].

使用 library(yall),代码变为:

del_mat_col(M,N,M1) :-
    maplist({N}/[R,R1]>>nth1(N,R,_,R1),M,M1).

推荐阅读