2014-02-18 26 views
0

我列出的以下列表:迭代通过名单(不平整)的列表

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

你不能使用numpy和向量化吗? –

+0

您显示的示例列表看上去不像是6x6矩阵的一部分。我看到3行和4行。另外,关于列表的列表,我没有看到任何问题。 – lurker

+0

对不起,我更新了我的问题。 listObj不是列表的列表吗?每个元素本身都是一个包含6个对象的列表。 – user1553248

回答

1

如果您正在使用SWI序言,你可以说(用零相对指数):

:- 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! 

附加题:修改上面的列主要顺序枚举2-D“数组”。