1

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

这是代码:

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) 时,我将开始返回。我想保留我收集的所有元素,而不仅仅是第一个。而且我真的很难构建正确的谓词调用。

4

1 回答 1

1

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。

高温高压

于 2012-10-22T20:40:46.320 回答