根据另一个列表中给出的索引交换元素

时间:2015-10-26 23:45:14

标签: list prolog

你好我的任务是交换列表元素,需要在另一个列表中交换索引,所以fx:

如果我有:

[3,1,2] as the list

[[1,2],[2,3]] as the index that needs to be swapped

那应该是这样的:

[1,2] = 3 and 1 getting swapped
[2,3] = 3 and 2 getting swapped

所以我最终会输出Output = [1,2,3]

谓词指定如下:

swap(C,Input,Output)

其中C是应该交换哪个元素的列表。

输入是应该交换的列表。

输出是交换列表。

我想就如何基于此交换这些元素提出一些建议,我已经看过这个:swap two elements from list with specified indices

希望有人能帮助我。

编辑:

到目前为止,我尝试过这样的事情:

swap( Input,[I|J], Input ) :-
    I = J.
swap( Input, [I|J], Output ) :-
    swap( Input, [I|J], Output, _, _ ).
swap( Input, [I|J], Output ) :-
    swap( Input, J, I, Output, _, _ ).

swap( [E2|Ls], I,  0,  [E1|Ls], E1, E2 ):-!.
swap( [E1|Es], 0, J, [E2|Rs], E1, E2 ) :-
    N2 is J - 1,
    swap( Es, -1, N2, Rs, E1, E2 ),!.
swap( [E|Es], [I|J], [E|Rs], E1, E2 ) :-
    N1 is I - 1,
    N2 is J - 1,
    swap( Es, N1, N2, Rs, E1, E2 ). 

但是我只能使用“一个”列表作为必须交换的索引,如[1,2],我正在寻找的是能够使用多个[[1,2] ,[2,3]]等等。

2 个答案:

答案 0 :(得分:3)

此答案基于this previous answer by @user27815

以下是 + 变体!

:- use_module(library(lambda)).

swap2(Ls0, Swaps, Ls) :-
   foldl(\[I,J]^S0^S^list_i_j_swapped(S0,I,J,S), Swaps, Ls0,Ls).

示例查询:

?- swap2([3,1,2], [[0,1],[1,2]], Xs).
  X = [1,2,3]
; false.

答案 1 :(得分:1)

使用list_i_j_swapped / 4

list_i_j_swapped(As,I,J,Cs) :-
 same_length(As,Cs),
 append(BeforeI,[AtI|PastI],As),
 append(BeforeI,[AtJ|PastI],Bs),
 append(BeforeJ,[AtJ|PastJ],Bs),
 append(BeforeJ,[AtI|PastJ],Cs),
 length(BeforeI,I),
 length(BeforeJ,J).

swap(List,[],List).
swap(List1,Swaps,ListSwapped):-
  Swaps =[[Index1,Index2]|T],
  list_i_j_swapped(List1,Index1,Index2,List2),
  swap(List2,T,ListSwapped).

问:

?- swap([3,1,2],[[0,1],[1,2]],X).
X = [1, 2, 3] ;
false.

这些头寸是零索引。