迭代列表列表(不展平)

时间:2014-02-18 20:45:29

标签: list prolog iteration

我有以下列表清单:

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

1 个答案:

答案 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!

额外信用:修改上述内容以按列主要顺序枚举二维“数组”。