2015-10-26 3 views
1

Здравствуйте моя задача, чтобы поменять элементы списка с индексом, который должен быть заменен в другом списке, так что 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 

Так я бы в конечном итоге с выходом = [1,2,3]

предикат задается быть таким:

swap(C,Input,Output) 

Где C является перечень которых elemenst, который должен быть заменен.

Ввод - это список, который следует поменять местами.

Выход - это список замененных.

Я хотел бы несколько советов о том, как замене этих элементов, основанных на этом, я уже смотрели на это: swap two elements from list with specified indices

Надеется, что кто-то может помочь мне с этим.

Edit:

До сих пор я пытался что-то вроде этого:

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

Сообщение отредактировано с тем, что я пробовал сейчас. – VHdk

ответ

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). 

Q:

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

Позиции равны нулю, индексированную.

+0

s (X): как насчет выполнения варианта на основе [tag: meta-predicate] 'foldl/4' (как отдельный ответ, если вы выберете)? – repeat

+1

Я не уверен, как сфотография будет работать для этого? Я понимаю это только для того, чтобы суммировать список. Мне было бы интересно посмотреть, как это будет работать для обмена/3. – user27815

+0

Понял? Конечно! Также обратите внимание, что 'foldl/4' также можно использовать с [tag: dcg] s как' foldl // 2'. – repeat

Смежные вопросы