我的问题是: 在学习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:这是对的吗?是否有办法获得输入的第二和第三个元素?
答案 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