title: Move Element of a list in Prolog
body: <p>I would like to move elements in a list in prolog to a new location within the same list, similar to a cut &amp; paste operation.</p>
  
  <p>For example, if i have the list [1,2,3,4,5]</p>
  
  <p>I want something like:</p>
  
  <pre><code>move(List, D1, D2, D3, Newlist)
  </code></pre>
  
  <p>List = original list, D1 = from what element, D2 = to what element of the list, D3 destination in the list.</p>
  
  <p>An example: </p>
  
  <pre><code>move([1,2,3,4,5,6,7,8,9], 1, 3, 5, NewList) :- (Implementation).
  
  NewList = [4,5,1,2,3,6,7,8,9].
  </code></pre>
  
  <p>I made that for when D3 > D2, and something similar for the case when D2 &lt; D3, but I think that I don't have it right.</p>
  
  <pre><code>% Move D3 &gt; D2 &amp; D2
  move([X|L], D1, D2, D3, Resultado) :-
      movevalue([X|L], D1, D2, Z),
      moveinsert([X|L], Z, D3, ParteB),
      primerapartel([X|L], D3, PrimeraParte),
      deleting(PrimeraParte, D1, D2, ParteA),
      append(ParteA, ParteB, Resultado),
      !.
  
  movevalue([X|L], D1, D2, Z) :-
      D1 &gt; 1,
      E1 is D1 - 1,
      E2 is D2 - 1,
      movevalue(L, E1, E2, Z),
      !.
  movevalue([X|L], 1, D2, [X|Z]) :-
      D2 &gt; 0,
      E2 is D2 - 1,
      movevalue(L, 1, E2, Z).
  movevalue([X|L], 1, 0, Z) :-
      Z = [].
  
  moveinsert([X|L], Z, D3, Resultado) :-
      D3 &gt; 1,
      E3 is D3 - 1,
      moveinsert(L, Z, E3, Resultado),
      !.
  moveinsert([X|L], Z, 1, Resultado) :-
      append(Z,L,Resultado).
  
  %append([X],Z,Resultado2)
  %Primera parte L
  primerapartel(_, 0, Resultado) :-
      Resultado = [], !.
  primerapartel([X|L], N, [X|Resultado]) :-
      N &gt; 0,
      N1 is N - 1,
      primerapartel(L, N1, Resultado),
      !.
  
  deleting(Lista, D1, D2, Resultado) :-
      deletingizq(Lista, D1, D2, ResultadoA),
      deletingder(Lista, D1, D2, ResultadoB),
      append(ResultadoA, ResultadoB, Resultado),
      !.
  
  deletingizq([Princi|Pal], D1, D2, [Princi|Resultado]) :-
      D1 &gt; 1,
      E1 is D1 - 1,
      E2 is D2 - 1,
      deletingizq(Pal, E1, E2, Resultado).
  deletingizq([X|L], 1, D2, Resultado) :-
      D2 &gt; 1,
      E2 is D2-1,
      deletingizq(L, 1, E2, Resultado).
  deletingizq([X|L], 1, 1, Resultado) :-
      Resultado = [].
  
  deletingder([Princi|Pal], D1, D2, Resultado) :-
      D1 &gt; 1,
      E1 is D1 - 1,
      E2 is D2 - 1,
      deletingder(Pal, E1, E2, Resultado).
  deletingder([X|L], 1, D2, Resultado) :-
      D2 &gt; 1,
      E2 is D2 - 1,
      deletingder(L, 1, E2, Resultado).
  deletingder([X|L], 1, 1, Resultado) :-
      Resultado = L.
  </code></pre>