List Prolog-在列表列表中查找非单个列表

List Prolog-在列表列表中查找非单个列表,list,prolog,List,Prolog,我有一个9x9拼图(列表列表)。他9行中的每一行都有9个数字列表。我的目标是在拼图上找到一个非单一列表 choose([[H|T]|R], Pos):- choose([[H|T]|R], 1, 1, Pos). choose([[H|T]|R], 9, C, Pos):- length(H,X), X =:= 1, C1 is C+1, choose([T|R], 1, C1, Pos). choose([[H|T]|R], L, C, Pos):-

我有一个9x9拼图(列表列表)。他9行中的每一行都有9个数字列表。我的目标是在拼图上找到一个非单一列表

choose([[H|T]|R], Pos):-  choose([[H|T]|R], 1, 1, Pos).
choose([[H|T]|R], 9, C, Pos):-
    length(H,X),
    X =:= 1,
    C1 is C+1,
    choose([T|R], 1, C1, Pos).

choose([[H|T]|R], L, C, Pos):-
    length(H,X),
    X =:= 1,
    L1 is L+1,
    choose([T|R],L1, C, Pos).
choose(_,L,C, (L,C)).
虽然这段代码并不特别好看,但它应该可以正常工作,但由于某些原因它不。。。 有人知道更好的解决方法吗

编辑:

通过此输入:

 choose([[[1],[9],[7],[4],[3],[8],[5],[2],[6]],
 [[2],[6],[5],[7],[1],[9],[3],[8],[4]],
 [[4],[3,8],[3,8],[6],[2],[5],[1,9],[1,7],[7,9]],
 [[8],[2,5],[1,9],[2,5],[6],[1,7],[4],[3],[5,7,9]],
 [[5,7,9],[2,3,5],[1,3,9],[8],[4],[1,7],[2,9],[6],[5,7,9]],
 [[5,7],[4],[6],[2,5],[9],[3],[1,2],[1,7],[8]],
 [[5,9],[5,8],[8,9],[3],[7],[2],[6],[4],[1]],
 [[6],[1],[2],[9],[8],[4],[7],[5],[3]],
 [[3],[7],[4],[1],[5],[6],[8],[9],[2]]], Pos).

 The output should be Pos = (3,2) but it is Pos = (1,2)

谢谢

更简单的东西,基于/3

屈服

?- choose([[[1],[9],[7],[4],[3],[8],[5],[2],[6]],
|     [[2],[6],[5],[7],[1],[9],[3],[8],[4]],
|     [[4],[3,8],[3,8],[6],[2],[5],[1,9],[1,7],[7,9]],
|     [[8],[2,5],[1,9],[2,5],[6],[1,7],[4],[3],[5,7,9]],
|     [[5,7,9],[2,3,5],[1,3,9],[8],[4],[1,7],[2,9],[6],[5,7,9]],
|     [[5,7],[4],[6],[2,5],[9],[3],[1,2],[1,7],[8]],
|     [[5,9],[5,8],[8,9],[3],[7],[2],[6],[4],[1]],
|     [[6],[1],[2],[9],[8],[4],[7],[5],[3]],
|     [[3],[7],[4],[1],[5],[6],[8],[9],[2]]], Pos).
Pos =  (3, 2) ;
Pos =  (4, 2) ;
Pos =  (5, 1) ;
false.
编辑

在Prolog中,参数的数量(arity)标识谓词以及符号(函子)。对上述代码段的一个有用的改进可能是

choose(Mat, (Row,Col)) :-
    choose(Mat, Row, Col,_).

choose(Mat, Row, C1,C2) :-
    nth1(Row, Mat, Cols),
    nth1(C1, Cols, Value),
    nth1(C2, Cols, Value),
    C2 > C1.
也就是说,choose/2是通过调用choose/4实现的,这给了我们第二个“notsingle”列。让我们在4x4矩阵上进行测试

?- choose([
|    [1,2,3,4],
|    [5,6,5,8],
|    [9,0,1,9],
|    [3,3,5,6]], X).
X =  (2, 1) ;
X =  (3, 1) ;
X =  (4, 1) ;
false.

似乎它正在工作…

基于/3的更简单的东西

屈服

?- choose([[[1],[9],[7],[4],[3],[8],[5],[2],[6]],
|     [[2],[6],[5],[7],[1],[9],[3],[8],[4]],
|     [[4],[3,8],[3,8],[6],[2],[5],[1,9],[1,7],[7,9]],
|     [[8],[2,5],[1,9],[2,5],[6],[1,7],[4],[3],[5,7,9]],
|     [[5,7,9],[2,3,5],[1,3,9],[8],[4],[1,7],[2,9],[6],[5,7,9]],
|     [[5,7],[4],[6],[2,5],[9],[3],[1,2],[1,7],[8]],
|     [[5,9],[5,8],[8,9],[3],[7],[2],[6],[4],[1]],
|     [[6],[1],[2],[9],[8],[4],[7],[5],[3]],
|     [[3],[7],[4],[1],[5],[6],[8],[9],[2]]], Pos).
Pos =  (3, 2) ;
Pos =  (4, 2) ;
Pos =  (5, 1) ;
false.
编辑

在Prolog中,参数的数量(arity)标识谓词以及符号(函子)。对上述代码段的一个有用的改进可能是

choose(Mat, (Row,Col)) :-
    choose(Mat, Row, Col,_).

choose(Mat, Row, C1,C2) :-
    nth1(Row, Mat, Cols),
    nth1(C1, Cols, Value),
    nth1(C2, Cols, Value),
    C2 > C1.
也就是说,choose/2是通过调用choose/4实现的,这给了我们第二个“notsingle”列。让我们在4x4矩阵上进行测试

?- choose([
|    [1,2,3,4],
|    [5,6,5,8],
|    [9,0,1,9],
|    [3,3,5,6]], X).
X =  (2, 1) ;
X =  (3, 1) ;
X =  (4, 1) ;
false.

似乎正在运行…

您可以发布一些有效的示例查询和一些无效的示例查询(也有预期的结果)吗?另外,你真的很想在数学中使用clpfd,特别是在数独游戏中,把
:-(使用模块(库(clpfd))
放在文件的顶部,然后将
X=:=1
更改为
X\35;=1
L1是L+1
更改为
L1
。请注意,这不是一个虚假或神秘的建议,clpfd应始终用于prolog中的数学,=:=和is通过比较受到严重限制。。。c、 f.我用一个例子编辑了
choose(u,L,c,(L,c))。
在第一个参数上需要某种条件。否则,任何第一个参数都会成功,这在逻辑上似乎是错误的。您可以发布一些有效的示例查询和一些无效的示例查询(也有预期的结果)吗?另外,你真的很想在数学中使用clpfd,特别是在数独游戏中,把
:-(使用模块(库(clpfd))
放在文件的顶部,然后将
X=:=1
更改为
X\35;=1
L1是L+1
更改为
L1
。请注意,这不是一个虚假或神秘的建议,clpfd应始终用于prolog中的数学,=:=和is通过比较受到严重限制。。。c、 f.我用一个例子编辑了
choose(u,L,c,(L,c))。
在第一个参数上需要某种条件。否则,任何第一个参数都会成功,这在逻辑上似乎是错误的。很好的解决方案!使用n显然比试图找出递归解决方案要容易得多。第n个解的优劣有什么原因吗?演出不符合逻辑?(在我看来,nth(如果有的话)在性能上可能更好,并且更易于逻辑处理)。谢谢!但第二个答案不应该是Pos=(3,3)?我试过一个4x4矩阵,但效果不好funktor和谓词之间的区别是什么?[“我并不是说我上面的问题具有威胁性。例如,根据已有的文献,我并不是在要求一个严格正确的定义。我并不是说我是非直觉的,如果你不给出正确的答案,我也不会对你大发雷霆。”][“我这样问是因为从你的写作来看,你自己似乎有一个区分谓词是什么和funktor是什么的标准。这是我目前正在研究的一个话题。”——>[“谢谢!”——>[“P.s很棒的编辑!”].@Kintalken:函子它是谓词的“名称”。必须是原子。函子和算术一起定义了谓词标识。很好的解决方案!使用第n个显然比试图找出递归解决方案容易得多。第n个解决方案为什么较差?性能?非逻辑?(在我看来,n(如果有的话)在性能上可能更好,逻辑上也更容易)。谢谢!但第二个答案不应该是Pos=(3,3)?我试过一个4x4矩阵,但它没有正常工作funktor和谓词之间的区别是什么?[“我并不是说我上面的问题具有威胁性。例如,根据已有的文献,我并不是在要求一个严格正确的定义。我并不是说我是非直觉的,如果你不给出正确的答案,我也不会对你大发雷霆。”][“我这样问是因为从你的写作来看,你自己似乎有一个区分谓词是什么和funktor是什么的标准。这是我目前正在研究的一个话题。”——>[“谢谢!”——>[“P.s很棒的编辑!”].@Kintalken:functor是谓词的“名称”。必须是原子。functor和arity一起定义谓词标识。