프롤로그의 목록에있는 요소를 붙여 넣기 작업 &과 비슷한 동일한 목록 내의 새 위치로 옮기고 싶습니다. ,프롤로그에서 목록의 요소 이동
move(List, D1, D2, D3, Newlist)
목록 = 원래 목록, 어떤 요소로부터 D1 = 내가 목록이있는 경우
예를 들어, [1,2,3,4,5]
는 뭔가처럼 원하는 D2 = 목록의 어떤 요소, 목록의 D3 대상.
예 :
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].
내가 만든 그 D3> D2, 케이스 비슷한 뭔가 D2 < D3,하지만 내가 바로이 없다고 생각하는 경우에 대해.
% Move D3 > D2 & 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 > 1,
E1 is D1 - 1,
E2 is D2 - 1,
movevalue(L, E1, E2, Z),
!.
movevalue([X|L], 1, D2, [X|Z]) :-
D2 > 0,
E2 is D2 - 1,
movevalue(L, 1, E2, Z).
movevalue([X|L], 1, 0, Z) :-
Z = [].
moveinsert([X|L], Z, D3, Resultado) :-
D3 > 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 > 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 > 1,
E1 is D1 - 1,
E2 is D2 - 1,
deletingizq(Pal, E1, E2, Resultado).
deletingizq([X|L], 1, D2, Resultado) :-
D2 > 1,
E2 is D2-1,
deletingizq(L, 1, E2, Resultado).
deletingizq([X|L], 1, 1, Resultado) :-
Resultado = [].
deletingder([Princi|Pal], D1, D2, Resultado) :-
D1 > 1,
E1 is D1 - 1,
E2 is D2 - 1,
deletingder(Pal, E1, E2, Resultado).
deletingder([X|L], 1, D2, Resultado) :-
D2 > 1,
E2 is D2 - 1,
deletingder(L, 1, E2, Resultado).
deletingder([X|L], 1, 1, Resultado) :-
Resultado = L.
귀하의 측면에서 어떤 노력을 반복 피할 수 있습니까? – CapelliC
@ CapelliC 이제 사례 중 하나에서 수행 한 작업을 붙여 넣었습니다. 누군가 코드를 작성하지 않아도되는데, 좋은 방법으로 수행하는 방법에 대한 아이디어는 내가 길을 잃을 때 해결책이되지만 문제는 내가 정말로 그렇게하는 가장 좋은 방법은 아니라고 생각한다. 나는 25 줄을 소비한다고 생각하지 않았다. (모든 경우를 할 때) 나는 그것이 최적화 될 수 있다고 생각하지만, 나는 일 해왔다. 2 일 동안 이걸 가지고 최적의 방법으로 문제를 해결하는 좋은 진전을 얻지 못했습니다. 답장을 보내 주셔서 감사합니다. –
각 규칙을 완전히 한 줄에 표시해도 읽을 수있는 코드는 아닙니다. –