prolog - 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).
解决方案
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).
推荐阅读
- java - 行号错误 = inputLine.nextInt();
- python - 用于验证国际象棋王移动的 Python 代码
- javascript - Rails webpack js和ajax刷新
- javascript - 列制表器中的项目列表
- swift4 - 如何通过单击swift4中的addImage按钮将图像一张一张添加到tableviewcell中
- node.js - 使用 nodejs 解析结构化 JSON-LD 文件的问题
- node.js - 无法使用绝对文件路径导入 nodejs 模块(流星,linux。在 Windows 上工作正常)
- c# - 在 XPO 对象中一次设置多个属性
- objective-c - CLS_LOG 应该放在崩溃之前还是之后?无论哪种方式,它都不会记录数据
- kotlin - 如何从数组中获取每个项目?