Prolog-从矩阵中删除第N列

问题描述 投票:0回答:1

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

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

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

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

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

?- 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 swi-prolog
1个回答
0
投票

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

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

del_mat_col(M,N,M1) :-
    maplist({N}/[R,R1]>>nth1(N,R,_,R1),M,M1).
© www.soinside.com 2019 - 2024. All rights reserved.