替换包含 Prolog 中列表的列表列表中的元素

Replace element in list of list that contains list in Prolog

我做了一些搜索并尝试了很多我在Whosebug的一些问题中看到的附加,但我无法解决我的问题...

差不多就是这个问题,但我里面还有一个列表:

Replacing elements in list of lists PROLOG

我的矩阵:

[
    [[-1], [-1], [-1], [4], [-1], [-1], [-1]],
    [[-1], [0], [1], [0], [2], [-1]],
    [[3], [4], [3], [1], [1], [2], [3]],
    [[1], [5], [4], [2], [4], [3]],
    [[2], [3], [4], [0], [4], [4], [1]],
    [[2], [3], [1], [3], [0], [4]],
    [[0], [1], [0], [3], [2], [1], [0]],
    [[-1], [2], [2], [5], [0], [-1]],
    [[-1], [-1], [-1], [4], [-1], [-1], [-1]]
]

我需要一种方法来用一个新列表替换一个包含数字的列表,并return用替换的值对所有矩阵进行运算。 方法 replace 接收行号和列(位置)号以及该位置的新值。

有人知道怎么做吗?

编辑:

内部列表包含 1-5 个元素。输入是:矩阵、行、单元格、新值。主要目标是return一个新的矩阵,在行的单元格上有新的值。

示例:

我想将第 1 行和第 4 单元格设置为值:[1,2,3]。

所以输出矩阵将是:

[
    [[-1], [-1], [-1], [1,2,3], [-1], [-1], [-1]],
    [[-1], [0], [1], [0], [2], [-1]],
    [[3], [4], [3], [1], [1], [2], [3]],
    [[1], [5], [4], [2], [4], [3]],
    [[2], [3], [4], [0], [4], [4], [1]],
    [[2], [3], [1], [3], [0], [4]],
    [[0], [1], [0], [3], [2], [1], [0]],
    [[-1], [2], [2], [5], [0], [-1]],
    [[-1], [-1], [-1], [4], [-1], [-1], [-1]]
]

因此该方法将列表 [4] 替换为列表 [1,2,3]。

SWI-Prolog 有一个 builtin 可以帮助:

test :- I=[ [[-1], [-1], [-1], [4], [-1], [-1], [-1]],
        [[-1], [0], [1], [0], [2], [-1]],
        [[3], [4], [3], [1], [1], [2], [3]],
        [[1], [5], [4], [2], [4], [3]],
        [[2], [3], [4], [0], [4], [4], [1]],
        [[2], [3], [1], [3], [0], [4]],
        [[0], [1], [0], [3], [2], [1], [0]],
        [[-1], [2], [2], [5], [0], [-1]],
        [[-1], [-1], [-1], [4], [-1], [-1], [-1]]
    ],
    replace_row_col(I,1,4,[1,2,3],Upd),
    maplist(writeln,Upd).

replace_nth(N,I,V,O) :-
    nth1(N,I,_,T),
    nth1(N,O,V,T).

replace_row_col(M,Row,Col,Cell,N) :-
    nth1(Row,M,Old),
    replace_nth(Col,Old,Cell,Upd),
    replace_nth(Row,M,Upd,N).

产量

?- test.
[[-1],[-1],[-1],[1,2,3],[-1],[-1],[-1]]
[[-1],[0],[1],[0],[2],[-1]]
[[3],[4],[3],[1],[1],[2],[3]]
[[1],[5],[4],[2],[4],[3]]
[[2],[3],[4],[0],[4],[4],[1]]
[[2],[3],[1],[3],[0],[4]]
[[0],[1],[0],[3],[2],[1],[0]]
[[-1],[2],[2],[5],[0],[-1]]
[[-1],[-1],[-1],[4],[-1],[-1],[-1]]