2

我的问题是:在学习 Prolog 时,我想制作一个 NxN 数独求解器。这个求解器会得到像这样的输入

    [[1,2,3,4],[3,4,1,2],[2,3,4,1],[4,1,2,3]]

其中一些可能是变量。求解器必须求解该数独。问题要小得多:

    firstElementsOf([],_).
    firstElementsOf([[X|_]|Rest2],Y) :-
      firstElementsOf(Rest2,Y2),
      append([X],[Y2],NotFlat),
      flatten(NotFlat,Y).

这应该是检查的开始,如果每一列都有不同的数字。Yfrom应该只包含给定行的firstElementsOf第一个元素。在示例中:

    [1,3,2,4]

可悲的是,由于 append,它总是在Y列表中添加另一个空白空间。它给:

    [1,3,2,4,_1320]

问题1:有没有办法摆脱它_1320

问题2:这对吗?有没有办法用它来获取 Input 的第二个和第三个元素?

4

1 回答 1

0

对于问题 1:我想错误在

firstElementsOf([],_).

我认为应该是

firstElementsOf([],[]).

题外话:你确定不能简单地把其他子句写成如下?

firstElementsOf([[X|_]|Rest2],[X|Y]) :-
  firstElementsOf(Rest2,Y).

对于问题 2:我提出一个更一般的谓词:以下getPosList/3支持getPosElem/3

getPosElem([H | _], 1, H).

getPosElem([_ | T], Pos, H) :-
  Pos > 1,
  Pm1 is Pos - 1,
  getPosElem(T, Pm1, H).

getPosList([], _, []).

getPosList([H | T], Pos, [E | L]) :-
  getPosElem(H, Pos, E),
  getPosList(T, Pos, L).

它提取位置中所有元素的列表Pos,所以

getPosList([[1,2,3,4],[3,4,1,2],[2,3,4,1],[4,1,2,3]], 1, L),

它相当于firstElementOf([[1,2,3,4],[3,4,1,2],[2,3,4,1],[4,1,2,3]], L)和提取[1, 3, 2, 4]

getPosList([[1,2,3,4],[3,4,1,2],[2,3,4,1],[4,1,2,3]], 2, L),

提取物[2, 4, 3, 1]

getPosList([[1,2,3,4],[3,4,1,2],[2,3,4,1],[4,1,2,3]], 3, L),

提取物[3, 1, 4, 2]

getPosList([[1,2,3,4],[3,4,1,2],[2,3,4,1],[4,1,2,3]], 4, L),

提取[4, 2, 1, 3]

getPosList([[1,2,3,4],[3,4,1,2],[2,3,4,1],[4,1,2,3]], 5, L),

或大于 5 的数字,返回 false

于 2016-12-26T18:35:52.083 回答