0

问题

我正在尝试将我创建的所有新列表移动到一个超级列表中。相反,输出被格式化为一堆单独更改的列表。

问题可能源于我between用来分配Iterationsand的事实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

代码说明

此序言代码采用值列表并替换指定值并将其返回到另一个列表中。

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是输出将去往的列表。

4

1 回答 1

0

在搞砸之后findall/3bagof/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]]
于 2017-12-04T18:28:29.240 回答