将元素插入prolog中的2D列表

时间:2016-01-28 18:35:12

标签: prolog

假设:

List = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]

我想制作一个执行以下操作的方法:

插入(a,2,3,List)。

List = [[0, 0, 0], [0, 0, 0], [0, a, 0]]

我认为这将涉及按行然后列重复并递减相应的变量,直到它是一个作为基本情况,但之后应该做什么?如何将所有东西重新组合在一起?

1 个答案:

答案 0 :(得分:0)

我知道这不是优雅的答案,但我试图帮助你

此谓词inserto/4在一个列表中添加一个元素

<强>代码

inserto(_,[],[],_).
inserto(E,[_|Xs],[E|Ys],1) :- inserto(E,Xs,Ys,0),!.
inserto(E,[X|Xs],[X|Ys],N) :- N1 #= N-1,  % N<=length(List)
                              inserto(E,Xs,Ys,N1).

示例:

| ?- inserto(a,[1,2,3],L,1).
L = [a,2,3] ? ;
no
%

并且这个谓词inserto/5将列表L的元素复制到L1,直到N = M = 0,这意味着我们必须将L的所有元素复制到L1中,直到新元素必须被替换为古代

代码:

% test : inserto(E,L,L1,N,M).
% test : L=[[0,0,0],[0,0,0],[0,0,0]], inserto(e,L,L1,2,3).

inserto(_,[],[],_,_).
inserto(E,[[_|Xs]|Ys],[[E|Xs1]|Ys1],1,1) :-
                    !,inserto(E,[Xs|Ys],[Xs1|Ys1],0,0).

inserto(E,[[X]|Xs],[[X]|Xs1],0,0) :- 
                    inserto(E,Xs,Xs1,0,0),!.

inserto(E,[[X|Xs]|Ys],[[X|Xs1]|Ys1],0,0) :- 
                    inserto(E,[Xs|Ys],[Xs1|Ys1],0,0).  

inserto(E,[[X|Xs]|Ys],[[X|Xs1]|Ys1],N,1) :- 
                    N1 #= N-1,
                    inserto(E,[Xs|Ys],[Xs1|Ys1],N1,1).                                      

inserto(E,[Xs|Ys],[Xs|Ys1],N,M) :-  
                    M1 #= M-1,
                    inserto(E,Ys,Ys1,N,M1),!.

示例:

| ?- L=[[0,0],[0,0,0],[0,0,0,0]], inserto(e,L,L1,3,2).
L = [[0,0],[0,0,0],[0,0,0,0]],
L1 = [[0,0],[0,0,e],[0,0,0,0]] ? ;
no

根据您的问题,我添加了这个谓词insert2D/4

代码:

% test : insert2D('E',2,3,[[1,2],['R'],[a,b,c]]).

insert2D(Elem,NC,NL,List) :- 
                    inserto(Elem,List,NvList,NC,NL),
                    write(NvList).

示例:

| ?- insert2D('E',2,3,[[1,2],['R'],[a,b,c]]).
[[1,2],[R],[a,E,c]]
yes