List sicstus prolog移动谓词

List sicstus prolog移动谓词,list,prolog,predicate,List,Prolog,Predicate,我有一个列表,我想根据以下描述在Prolog中操作: 原始清单: ABC DEF GHI 移动C,我可以得到两个结果(从右上到左上,从右上到下): 从原始列表中移动G,我还可以得到两个结果(从左下角到左上角或从左下角到右下角) 从原始列表中移动D,我可以得到三个结果(从左中到左上,从左中到左下,从左中到右中): 这里的想法是,每当我获取一个元素(我们称之为当前元素)并将其放置到一个新位置时,我都会推送子列表中的其他元素,以便当前元素的旧邻居占据当前元素的旧位置。旧邻居旧位置将保留另一个正在被当

我有一个列表,我想根据以下描述在Prolog中操作:

原始清单:

ABC
DEF
GHI
移动C,我可以得到两个结果(从右上到左上,从右上到下):

从原始列表中移动G,我还可以得到两个结果(从左下角到左上角或从左下角到右下角)

从原始列表中移动D,我可以得到三个结果(从左中到左上,从左中到左下,从左中到右中):

这里的想法是,每当我获取一个元素(我们称之为当前元素)并将其放置到一个新位置时,我都会推送子列表中的其他元素,以便当前元素的旧邻居占据当前元素的旧位置。旧邻居旧位置将保留另一个正在被当前元素替换的元素。总的来说,由于每个元素都属于两个列表,列列表和行列表,通过移动一个元素并放置到另一个位置,将执行两个操作:旋转一个列表并在另一个列表中用我正在移动的当前元素替换一个元素。 请注意,中间的元素(例如原始列表中的E)不能是当前元素,但在推送时可以有一个新位置。 唯一允许作为“当前元素”(来自原始列表)的元素是A、B、C、D、F、G、H和I

到目前为止,我为解决这个问题所做的努力如下。我创建了一个谓词,可以旋转列表中的元素:

rotate([],_,[]) :- !.
rotate(L1,N,L2) :-
    length(L1,NL1),
    N1 is N mod NL1,
    split(L1,N1,S1,S2),
    append(S2,S1,L2).

split(L,0,[],L).
split([X|Xs],N,[X|Ys],Zs) :-
    N > 0,
    N1 is N - 1,
    split(Xs,N1,Ys,Zs).
但是这个谓词只给出了我想要的解决方案的一小部分。它只适用于我要处理的原始列表四个角中的元素。这不适用于位于左中或右中的图元

| ?- rotate([a,b,c,d,e],1,X).
 X = [b,c,d,e,a] ? 
 yes [This result if fine for me]

| ?- rotate([a,b,c,d,e],-1,X).
 X = [e,a,b,c,d] ? 
yes (This one is also fine)

| ?- rotate([a,b,c,d,e],2,X).
X = [c,d,e,a,b] ?
yes (This is not fine because I expect X = [a,c,d,e,b])

这个问题的另一个挑战是,我同时处理两个列表:一个列表构成一列,另一个列表构成一行

我只是做了一个版本的文章来添加我对旋转谓词代码的研究。
DBC             ABC             ABC
AEF     or      GEF      or     EFD
GHI             DHI             GHI
rotate([],_,[]) :- !.
rotate(L1,N,L2) :-
    length(L1,NL1),
    N1 is N mod NL1,
    split(L1,N1,S1,S2),
    append(S2,S1,L2).

split(L,0,[],L).
split([X|Xs],N,[X|Ys],Zs) :-
    N > 0,
    N1 is N - 1,
    split(Xs,N1,Ys,Zs).
| ?- rotate([a,b,c,d,e],1,X).
 X = [b,c,d,e,a] ? 
 yes [This result if fine for me]

| ?- rotate([a,b,c,d,e],-1,X).
 X = [e,a,b,c,d] ? 
yes (This one is also fine)

| ?- rotate([a,b,c,d,e],2,X).
X = [c,d,e,a,b] ?
yes (This is not fine because I expect X = [a,c,d,e,b])