替换列表列表中的元素 PROLOG [英] Replacing elements in list of lists PROLOG
问题描述
我开发了一个谓词,它用 Value
替换列表 List
的索引 Index
的值,并创建一个新的更新列表NewList
.
I've developed a predicate which replaces the value of the index Index
of a list List
with Value
and creates a new updated list NewList
.
%replace(List,Index,Value,NewList)
replace([_|T], 0, X, [X|T]).
replace([H|T], I, X, [H|R]):-
I > -1,
NI is I-1,
replace(T, NI, X, R), !.
replace(L, _, _, L).
谓词在常规列表上工作正常,但我想让它在列表列表上工作,我有点卡在了一小步上.
The predicate works fine on regular lists, but I want to make it work on a list of lists and I am kind of stuck on a little step.
subs([]).
subs([Head|Tail], Index) :-
replace((Head), Index, 'r', Board2),
printRow(Board2),
subs(Tail).
原始列表:
[ [ 0 , 1 , 2 , 3 , 4 ] ,
[ 5 , 6 , 7 , 8 , 9 ] ,
[ 10 , 11 , 12 , 13 , 14 ] ,
[ 15 , 16 , 17 , 18 , 19 ] ,
[ 20 , 21 , 22 , 23 , 23 ]
]
输出:
[ [ 0 , r , 2 , 3 , 4 ] ,
[ 5 , r , 7 , 8 , 9 ] ,
[ 10 , r , 12 , 13 , 14 ] ,
[ 15 , r , 17 , 18 , 19 ] ,
[ 20 , r , 22 , 23 , 23 ]
]
很明显为什么会发生这种情况,因为它在每个子列表上用 Index = 1
替换了值.为了修复它,我考虑实现一个计数器.通过每次迭代将索引增加 5(每个子列表的大小),谓词现在应该输出以下(期望的)列表:
It is noticeable why this happens, since it replaces the value with Index = 1
on each sublist.
In order to fix it, I thought about implementing a counter. By incrementing the index by 5 each iteration (size of each sub list), the predicate should now output the following (desired) list:
期望输出:
[ [ 0 , r , 2 , 3 , 4 ] ,
[ 5 , 6 , 7 , 8 , 9 ] ,
[ 10 , 11 , 12 , 13 , 14 ] ,
[ 15 , 16 , 17 , 18 , 19 ] ,
[ 20 , 21 , 22 , 23 , 23 ]
]
问题在于如何实现那个计数器.代码应如下所示,但我遗漏了一些内容:
And the issue lies on how to implement that very counter. The code should look like the following but there's something I'm missing out on:
subs([]).
subs([Head|Tail], Index) :-
replace((Head), Index, 'r', Board2),
printRow(Board2),
Index is Index + 5
subs(Tail, Index).
输出: subs(
0 1 2 3 4
谁能给我一些关于如何实施它的帮助?
Can anyone give me some help on how to implement it?
推荐答案
你的问题陈述有点不清楚.
Your problem statement is a bit unclear.
从您的示例中,您似乎希望将列表列表视为本质上是一个二维数组,并替换该数组中的单个单元格.如果是这样,这是一种方法(可能不是最佳的):
From your examples, it would appear that what you want to treat a list-of-lists as essentially a 2-D array, and replace a single cell within that array. If so, this is one way (probably non-optimal) to do that:
%
% replace a single cell in a list-of-lists
% - the source list-of-lists is L
% - The cell to be replaced is indicated with a row offset (X)
% and a column offset within the row (Y)
% - The replacement value is Z
% - the transformed list-of-lists (result) is R
%
replace( L , X , Y , Z , R ) :-
append(RowPfx,[Row|RowSfx],L), % decompose the list-of-lists into a prefix, a list and a suffix
length(RowPfx,X) , % check the prefix length: do we have the desired list?
append(ColPfx,[_|ColSfx],Row) , % decompose that row into a prefix, a column and a suffix
length(ColPfx,Y) , % check the prefix length: do we have the desired column?
append(ColPfx,[Z|ColSfx],RowNew) , % if so, replace the column with its new value
append(RowPfx,[RowNew|RowSfx],R) % and assemble the transformed list-of-lists
.
另一种方式(可能更佳):
Another way (probably more optimal):
replace( [L|Ls] , 0 , Y , Z , [R|Ls] ) :- % once we find the desired row,
replace_column(L,Y,Z,R) % - we replace specified column, and we're done.
. %
replace( [L|Ls] , X , Y , Z , [L|Rs] ) :- % if we haven't found the desired row yet
X > 0 , % - and the row offset is positive,
X1 is X-1 , % - we decrement the row offset
replace( Ls , X1 , Y , Z , Rs ) % - and recurse down
. %
replace_column( [_|Cs] , 0 , Z , [Z|Cs] ) . % once we find the specified offset, just make the substitution and finish up.
replace_column( [C|Cs] , Y , Z , [C|Rs] ) :- % otherwise,
Y > 0 , % - assuming that the column offset is positive,
Y1 is Y-1 , % - we decrement it
replace_column( Cs , Y1 , Z , Rs ) % - and recurse down.
. %
这篇关于替换列表列表中的元素 PROLOG的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!