2014-02-18 56 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「數組」。