如何使Prolog查询在谓词中起作用?

时间:2017-12-07 04:07:46

标签: prolog

我正在努力制作这个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]

这里发生了什么? 它有可能返回到同一个列表吗?

1 个答案:

答案 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个参数。