在prolog

时间:2016-03-03 09:27:57

标签: 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,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谢谢。

2 个答案:

答案 0 :(得分: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, []).

答案 1 :(得分: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),
    ...
]).