Recursion 在prolog中创建不带findall的列表

Recursion 在prolog中创建不带findall的列表,recursion,prolog,Recursion,Prolog,我正在处理一个谓词,以根据规则生成一个值列表。 我有以下规则: casilla(1,4,1,1,3). casilla(1,4,1,2,1). casilla(1,4,1,3,2). casilla(1,4,1,4,4). casilla(1,4,2,1,0). casilla(1,4,2,2,4). casilla(1,4,2,3,0). casilla(1,4,2,4,0). casilla(1,4,3,1,1). casilla(1,4,3,2,0). casilla(1,4,3,3,0)

我正在处理一个谓词,以根据规则生成一个值列表。 我有以下规则:

casilla(1,4,1,1,3).
casilla(1,4,1,2,1).
casilla(1,4,1,3,2).
casilla(1,4,1,4,4).
casilla(1,4,2,1,0).
casilla(1,4,2,2,4).
casilla(1,4,2,3,0).
casilla(1,4,2,4,0).
casilla(1,4,3,1,1).
casilla(1,4,3,2,0).
casilla(1,4,3,3,0).
casilla(1,4,3,4,2).
casilla(1,4,4,1,4).
casilla(1,4,4,2,2).
casilla(1,4,4,3,3).
casilla(1,4,4,4,1).
我需要将每个规则的最后一个值保存在列表中,例如:

BOARD = [3, 1, 2, 4, 0, 4, 0, 0, 1, 0, 0, 2, 4, 2, 3, 1].
我尝试递归保存此表单的每个元素:

createBoard2(N, M, Difficulty, [VALUE]) :-
   casilla(Difficulty,N,_,_,VALUE).
createBoard2(N, M, Difficulty, [VALUE,T]) :-
   casilla(Difficulty,N,_,_,X),
   createBoard2(N, M, Difficulty,T).
但是我真的不明白这个错误,我只返回第一个
谢谢。

为了避免findall/3(为什么?),我们需要这样低效的过程代码:

createBoard2(N, M, Difficulty, L) :- createBoard2(N, M, Difficulty, [], L).
createBoard2(N, M, Difficulty, Seen, [VALUE|R]) :-
   casilla(Difficulty,N,X,Y,VALUE),
   \+ memberchk(casilla(Difficulty,N,X,Y,VALUE), Seen),
   !, createBoard2(N, M, Difficulty, [casilla(Difficulty,N,X,Y,VALUE)|Seen], R).
createBoard2(_N, _M, _Difficulty, _Acc, []).

如果您不想使用类似于
findall/3
的东西,那么您不应该以事实的形式存储数据

备选方案1:将您的
casilla/5
术语放入单独的数据文件中,然后使用
open/3
read/2
将这些术语从该文件中逐个读取到列表中

备选方案2:将所有
casilla/5
术语作为一个列表放入一个事实中,即

casillas([
    casilla(1,4,1,1,3),
    casilla(1,4,1,2,1),
    ...
]).

[VALUE,T]
应该是
[VALUE | T]