我正在努力制作这个Prolog查询:
placeRedBlocks(4, X), findall(Y, loopReplace(X, Y), A).
输出:
A = [[r, r, r, b], [r, r, r, r], [b, r, r, r]],
X = [b, b, b, b]
如果我只输入,在代码中工作
placeRedBlocks(4, X).
我正在使用的代码:
printList([ ]).
printList([H|T]) :- print(H), nl, printList(T).
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,
% write([H|T]),
replace(T, NI, X, R), !.
% replace(L, _, _, L).
placeRedBlockUnit(A,_,0,_,A):- !.
placeRedBlockUnit(Line,Index,NumElm,Elm,NLine) :-
replace(Line,Index,Elm,BLine),
Index1 is Index+1,
NumElm1 is NumElm-1,
placeRedBlockUnit(BLine,Index1,NumElm1,Elm,NLine).
loopReplace(ListToReplace, NewList) :-
length(ListToReplace, Len),
TotalCount is Len-3,
between(0, TotalCount, Iterations),
between(3, Len, Size),
placeRedBlockUnit(ListToReplace, Iterations, Size, 'r', NewList).
不幸的是,如果我将placeRedBlocks
更改为此内容,则无效。
placeRedBlocks(Length, List) :-
findall('b', between(1, Length, _), List),
findall(Y, loopReplace(List, Y), _).
我只得到:
X = [b, b, b, b]
这里发生了什么? 它有可能返回到同一个列表吗?
答案 0 :(得分:0)
我意识到只要我在谓词中使用变量两次,我就不需要将它作为谓词的参数。
更改此
placeRedBlocks(Length, List) :-
findall('b', between(1, Length, _), List)
到这个
placeRedBlocks(Length, List3) :-
findall('b', between(1, Length, _), List),
findall(Y, loopReplace(List, Y), List2),
append([List], List2, List3).
使我能够在谓词中使用查询,同时将谓词保持在2个参数。