Swap two elements from list with specified indices

女生的网名这么多〃 提交于 2019-12-06 15:44:05

No need to write recursive code!

Simply use the builtin predicates length/2, same_length/2, and append/3 like so:

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

Done! Let's put it to use!

?- list_i_j_swapped([e0,e1,e2,e3,e4,e5],5,1,Ys).
  Ys = [e0,e5,e2,e3,e4,e1]
; false.

OK! Does it work in the "other direction", too?

?- list_i_j_swapped(Xs,5,1,[e0,e5,e2,e3,e4,e1]).
  Xs = [e0,e1,e2,e3,e4,e5]
; false.

Alright! What about the following quite general query?

?- list_i_j_swapped([A,B,C],I,J,Ys).
  I = 0, J = 0, Ys = [A,B,C]
; I = 0, J = 1, Ys = [B,A,C]
; I = 0, J = 2, Ys = [C,B,A] 
; I = 1, J = 0, Ys = [B,A,C]
; I = 1, J = 1, Ys = [A,B,C]
; I = 1, J = 2, Ys = [A,C,B]
; I = 2, J = 0, Ys = [C,B,A]
; I = 2, J = 1, Ys = [A,C,B]
; I = J, J = 2, Ys = [A,B,C]
; false.

It worked! At last, we run the most general query:

?- list_i_j_swapped(Xs,I,J,Ys).
  I = 0, J = 0, Xs = [_A]      , Ys = [_A]
; I = 0, J = 0, Xs = [_A,_B]   , Ys = [_A,_B]
; I = 0, J = 1, Xs = [_A,_B]   , Ys = [_B,_A]
; I = 1, J = 0, Xs = [_A,_B]   , Ys = [_B,_A]
; I = 1, J = 1, Xs = [_A,_B]   , Ys = [_A,_B]
; I = 0, J = 0, Xs = [_A,_B,_C], Ys = [_A,_B,_C]
...

Fair enumeration out-of-the-box? What's not to like?

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!