2013-06-29 6 views
1

프롤로그의 목록에있는 요소를 붙여 넣기 작업 &과 비슷한 동일한 목록 내의 새 위치로 옮기고 싶습니다. ,프롤로그에서 목록의 요소 이동

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. 
+0

귀하의 측면에서 어떤 노력을 반복 피할 수 있습니까? – CapelliC

+0

@ CapelliC 이제 사례 중 하나에서 수행 한 작업을 붙여 넣었습니다. 누군가 코드를 작성하지 않아도되는데, 좋은 방법으로 수행하는 방법에 대한 아이디어는 내가 길을 잃을 때 해결책이되지만 문제는 내가 정말로 그렇게하는 가장 좋은 방법은 아니라고 생각한다. 나는 25 줄을 소비한다고 생각하지 않았다. (모든 경우를 할 때) 나는 그것이 최적화 될 수 있다고 생각하지만, 나는 일 해왔다. 2 일 동안 이걸 가지고 최적의 방법으로 문제를 해결하는 좋은 진전을 얻지 못했습니다. 답장을 보내 주셔서 감사합니다. –

+0

각 규칙을 완전히 한 줄에 표시해도 읽을 수있는 코드는 아닙니다. –

답변

2

당신은 프롤로그 목록 인덱스에 의해 취급이 용이 아니라는 것을 어려운 방법을 발견했다.

더 많은 선언적 문제를 해결하고 Prolog에서 해결할 수있게하려면 length/2 및 nth1/3을 사용하여 색인 생성을 매핑과 구분해야합니다.

시작하려면 Result는 List와 길이가 같을 것입니다. 주변 요소를 이동

move(List, Start, Stop, Target, Result) :- 
    length(List, N), 
    length(Result, N), 
    move_elements(1, N, List, Start, Stop, Target, Result). 

가 결과리스트에서 인덱스를 매핑이 필요하며, 우리는 각 요소에 대해 수행해야합니다 :이 적용

/* edit: see the code below - this is buggy  
move_elements(I, N, _List, _Start, _Stop, _Target, _Result) :- 
    I =:= N + 1. 
move_elements(I, N, List, Start, Stop, Target, Result) :- 
    nth1(I, List, E), 
    index_map(I, Start, Stop, Target, P), 
    nth1(P, Result, E), 
    J is I + 1, 
    move_elements(J, N, List, Start, Stop, Target, Result). 
*/ 
move_elements(I, N, List, Start, Stop, Target, Result) :- 
    I =< N, 
    nth1(I, List, E), 
    index_map(I, Start, Stop, Target, P), 
    nth1(P, Result, E), 
    J is I + 1, 
    !, move_elements(J, N, List, Start, Stop, Target, Result). 
move_elements(_I, _N, _List, _Start, _Stop, _Target, _Result). 

우리는 어려운 부분으로 남아 있습니다 : 해야 index_map 할 일부 산술, 가능한 위치 사이에서 저글링. 나는 그 문제가 지금까지는 약간 구체적이지 않다고 생각한다. 다음은 테스트 쿼리를 포함하는, 단지 기본 경우입니다 : 당신은 더 많은 제약 조건을 지정하기 위해 더 많은 테스트를 추가 할 수 있지만 index_map/5 의 마지막 절은 수 있음을 유의

index_map(I, Start, Stop, Target, P) :- 
    I >= Start, 
    I =< Stop, 
    P is Target - (Stop - Start + 1) + I. 
index_map(_I, _Start, _Stop, _Target, _P). 

프롤로그는 일치 요소를 검색 할 수 (nth1(P, Result, E)을 통해), 따라서 간단한 방식으로 매핑을 완료하십시오.

편집 : foreach/2 도움으로 우리가

move(List, Start, Stop, Target, Result) :- 
    length(List, N), 
    length(Result, N), 
    foreach(nth1(I, List, E), assign(I, E, Start, Stop, Target, Result)). 

assign(I, E, Start, Stop, Target, Result) :- 
    index_map(I, Start, Stop, Target, P), 
    nth1(P, Result, E). 
관련 문제