2016-12-26 112 views
2

我的问题是: 在学习序言时,我想制作一个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). 

这应该是检查的开始,如果每列有不同的数字。来自firstElementsOfY应该只包含给定行的第一个元素。在举例:

[1,3,2,4] 

可悲的是,由于追加,它总是增加了一个空的空间的Y列表。 它提供:

[1,3,2,4,_1320] 

问题1:有没有摆脱_1320的一种方式?

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

回答

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), 

或多项greather小于5,返回false

+0

对于第一个......它真正的工作......我甚至不明白为什么。 – Shuumi

+0

第二......我也可以这样做......但我也不明白:)让我看看它以后:) – Shuumi

+0

@Shuumi;答案改进了(用点(2)方案;对于第(1)点中的“为什么”,计算一下'[]'是“空列表”,'_'是“一个值”;如果你写'firstElementsOf ([],_)'你从空列表中强制提取“一个值”(在你的例子中是一个无限变量,_1320) – max66