我有以下列表清单:
listObj = [ [ obj1(_) , obj2(_) , obj1(_) , obj2(_) , obj1(_) , obj2(_) ],
[ obj3 , obj3 , obj2(_) , obj1(_) , obj1(_) , obj2(_) ],
[ obj1(_) , obj2(_) , obj1(_) , obj2(_) , obj1(_) , obj2(_) ],
[ obj1(_) , obj2(_) , obj1(_) , obj2(_) , obj1(_) , obj2(_) ],
[ obj1(_) , obj2(_) , obj1(_) , obj2(_) , obj1(_) , obj2(_) ],
[ obj1(_) , obj2(_) , obj1(_) , obj2(_) , obj1(_) , obj2(_) ]
]
这个列表总是一个6x6矩阵,我需要以一种方式遍历这个列表,我可以保留我通过的每个元素的行号和列号(用于我将调用的另一个子句)循环)。根据我的理解,我不能只使用flatten / 2,因为这不会帮助我保留行号和列号。
P.S。另外,如何访问CLP变量的值以设置约束。例如,x可以具有值0或1,y具有值> X。约束只是 y#> = x
答案 0 :(得分:1)
如果你正在使用SWI prolog,你可以说(使用零相对指数):
:- use_module( library(lists) ).
array_cell(Xs,R,C,E) :-
nth0(R,Xs,Rs) ,
nth0(C,Rs,E)
.
或者你可以推出自己的东西,如下:
cell_at( Xs , R , C , X ) :-
element_at( Xs , 0 , R , Row ) ,
element_at( Row , 0 , C , X )
.
element_at( [X|Xs] , N , N , X ) .
element_at( [_|Xs] , N , I , X ) :-
N1 is N+1 ,
element_at( Xs , N1 , I , X )
.
或者...
cell_at( List , R , C , Cell ) :-
cell_at( List , 0 , 0 , R , C , Cell ) .
cell_at( [ [Y|Ys] | Xs ] , R , C , R , C , Y ) % success! Return the current cell and its grid coordinates via unification
.
cell_at( [ [_|Ys] | Xs ] , I , J , R , C , Y ) :- % on backtracking, if the current row is not yet exhausted,
J1 is J+1 , % - increment the column index
cell_at( [Ys|Xs] , I , J1 , R , C , Y ) % - and recurse down
. %
cell_at( [ [] | Xs ] , I , J , R , C , Y ) :- % on backtracking, if the current row is exhausted,
I1 is I+1 , % - increment the row index
cell_at( Xs , I1 , 0 , R , C , Y ) % - and recurse down, resetting the column index to zero.
. % Easy!
额外信用:修改上述内容以按列主要顺序枚举二维“数组”。