问题
我正在尝试将我创建的所有新列表移至一个列表的一个超级列表中。相反,输出格式为一堆单独更改的列表。
问题可能源于我使用between
分配Iterations
和Size
的事实,但我不确定我还能做什么。
输入
placeRedBlocks(4, X), loopReplace(X, Y), append([X], [Y], Z).
期望
Z = [[b, b, b, b], [r, r, r, b], [r, r, r, r], [b, r, r, r]]
现实
X = [b, b, b, b],
Y = [r, r, r, b],
Z = [[b, b, b, b], [r, r, r, b]]
X = [b, b, b, b],
Y = [r, r, r, r],
Z = [[b, b, b, b], [r, r, r, r]]
X = [b, b, b, b],
Y = [b, r, r, r],
Z = [[b, b, b, b], [b, r, r, r]]
false
代码说明
此Prolog Code获取一个值列表并替换指定值并将其返回另一个列表。
placeRedBlocks(Length, List) :-
findall('b', between(1, Length, _), List).
replace([_|T], 0, X, [X|T]).
replace([H|T], I, X, [H|R]):-
I > -1,
NI is I-1,
replace(T, NI, X, R), !.
replaceX(A,_,0,_,A):- !.
replaceX(Line,Index,NumElm,Elm,NLine) :-
replace(Line,Index,Elm,BLine),
Index1 is Index+1,
NumElm1 is NumElm-1,
replaceX(BLine,Index1,NumElm1,Elm,NLine).
loopReplace(ListToReplace, NewList) :-
length(ListToReplace, Len),
TotalCount is Len-3,
between(0, TotalCount, Iterations),
between(3, Len, Size),
replaceX(ListToReplace, Iterations, Size, 'r', NewList).
在replaceX
中:
Line
是您要替换值的列表。Index
是您开始更换值的位置。NumElm
是您总共替换的元素数量。Elm
是替代列表中其他值的字符或数字。 NLine
是输出将要进行的列表。
与findall/3
和bagof/3
混乱后,我找到了一个适合我的问题的答案。
输入
placeRedBlocks(7, X), findall(Y, loopReplace(X, Y), Z).
会得到我
Z = [[r, r, r, b, b, b, b], [r, r, r, r, b, b, b], [r, r, r, r, r, b, b], [r, r, r, r, r, r, b], [r, r, r, r, r, r, r], [b, r, r, r, b, b, b], [b, r, r, r, r, b, b], [b, r, r, r, r, r, b], [b, r, r, r, r, r, r], [b, b, r, r, r, b, b], [b, b, r, r, r, r, b], [b, b, r, r, r, r, r], [b, b, b, r, r, r, b], [b, b, b, r, r, r, r], [b, b, b, b, r, r, r]]