学习Prolog,Sudoku Solver

时间:2016-12-26 18:31:31

标签: prolog sudoku constraint-satisfaction

我的问题是: 在学习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).

如果每列都有不同的数字,这应该是检查的开始。来自Y的{​​{1}}应仅包含给定行的第一个元素。在示例中:

firstElementsOf

可悲的是,多亏了追加,它总是会在 [1,3,2,4] 列表中添加另一个空格。 它给出了:

Y
问题1:有没有办法摆脱 [1,3,2,4,_1320]

问题2:这是对的吗?是否有办法获得输入的第二和第三个元素?

1 个答案:

答案 0 :(得分: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