2016-03-03 27 views
0

我正在研究谓词以从规则生成值列表。 我有这些规则:在序言中创建没有findall的列表

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). 

但真的我不明白错误,我只返回第一个VALUE谢谢。

+0

'[VALUE,T]'应该是'[VALUE | T]'。 –

回答

0

要避免的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, []). 
0

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

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

替代方法2:把所有的casilla/5术语成一个单一的事实作为列表,即

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