Prolog:递归列表构造

时间:2012-10-22 10:39:07

标签: prolog

我在prolog程序中构建列表列表时遇到问题。 我有一个谓词,它给了我一个单行的情况。我必须对此行的所有情况进行分组,并将它们转换为列表列表。我可以很好地访问它们但是当我退出时,我得到的只是第一个元素。

以下是代码:

sudoku3to2 :- s3to2(1).
s3to2(Line) :- 
   Line < 9, 
   Line1 is Line+1,
   s3getLine(Line,0,[L]),   
   assert(sudoku2(Y,L])),
   s3to2(Line1).
s3to2(9).

s3getLine(Line,X,  , ) :- 
   X < 9, 
   X1 is X + 1, 
   sudoku3(Line,X, ),
   s3getLine(Line,X1, , ).
s3getLine(Line,9,L,L).

sudoku3 / 3将返回X,Y坐标处的元素。当我到达s3getLine(Line,9,L,L)时,我会开始回去。我想保留我收集的所有元素,而不仅仅是第一个元素。而且我在构建正确的谓词调用时遇到了麻烦。

1 个答案:

答案 0 :(得分:0)

findall / 3是更容易理解的'列表构造函数'。

它是一个内置列出了所有找到的解决方案,用指定的模式塑造元素。这里的模式实际上只是我们感兴趣的变量。

我使用between / 3来获得正确排序的矩阵,而不考虑sudoku3规则顺序。

sudoku3(1, 1, a).
sudoku3(1, 2, b).

sudoku3(2, 1, c).
sudoku3(2, 2, d).

mat(M) :-
  W = 2,
  findall(Row,
    (between(1, W, R),
     findall(V, (between(1, W, C), sudoku3(R, C, V)), Row)
    ), M).

结果:

?- mat(M).
M = [[a, b], [c, d]].

您应该更改W = 9.

HTH