.
입력으로 빈 목록으로 결국, 당신은 당신이 지금까지 가지고 무엇에 빈 목록을 추가하고, 좋은 그것을 부를 것이다 . 다음으로 신경 쓰는 가장자리 사건은 무엇입니까?
J
당신은 입력 목록의 끝에 통과,
I
목록 첫 번째 경우에
의 시작 앞에있는 목록의 끝을 넘어이다. 두 번째 단계에서는 입력 목록의 시작 부분부터 시작합니다.
좋아요, 시도해 보겠습니다. 축전기를 사용하고 주변에서 호출을 감쌀 것입니다.
sublist(L1, L2, I, J):-
sublist(L1, Temp, I, J, []),
!,
reverse(Temp, L2).
우리는 우리의 출력에서 L2
로 통일 입력리스트 L1
을, 변수를 가지고, 상기 인덱스, 및 I
J
. 난 cut
그래서 내가 다른 솔루션에 대한 backtracking에 대해 걱정할 필요가 없으며, 그것을 역전 누적 된 목록이 반대로 내장되어 있기 때문에.
기본 케이스에 대해 작업 해 보겠습니다.
빈 목록을 입력으로 사용하여 누적기를 출력 목록으로 통합하면됩니다. 우리는이 시점에서 지표에 관심이 없다. 결과적으로, 이것은 또한 J
이리스트의 끝을 넘는 엣지 경우를 만족시킵니다. 이 시점에서 우리는 모든 입력리스트를 누산기에 축적하고 여전히 J 값을 남겨 둘 것입니다.
sublist([], L2, _I, _J, L2).
I> J 또한 출력 목록으로 누적기를 통합하십시오. 더 이상 입력 목록에 신경 쓰지 않습니다.
sublist(_L1, L2, I, J, L2):-
I > J.
이제 가장자리 경우.
J
위 목록의 끝 부분을 해결했습니다.
I
은 목록의 시작 앞에 있고, 그 색인을 0으로 설정하고 계속 이동하십시오.
sublist(L1, L2, I, J, L2):-
I < 0,
sublist(L1, L2, 0, J, L2).
이제 실제 로직을 구현하면됩니다. 올바른 I
부터 시작하여 누적되기를 원합니다. 따라서 I
을 감소시키고 우리가 원하는 위치에 도달 할 때까지 입력리스트를 버리자. 색인의 끝을 일치 시키려면 J
도 줄여야합니다. 이 방법으로 우리는 인덱스 사이의 동일한 거리를 유지합니다.
sublist([_L|Ls], L2, I, J, Acc):-
I > 0,
sublist(Ls, L2, I-1, J-1, Acc).
우리는 마침내 우리가되고 싶은 곳입니다. 이제 입력 목록의 조각으로 목록을 작성해 봅시다. 이것은 우리가 기본 사례 중 하나를 치기 전까지 계속됩니다. 그런 다음 누적 기가 원래 sublist
절로 반환됩니다. 모든 퍼팅
는 sublist([L|Ls], L2, I, J, Acc):-
sublist(Ls, L2, I, J-1, [L|Acc]).
함께 우리와 끝까지 :
sublist(L1, L2, I, J):-
sublist(L1, Temp, I, J, []),
!,
reverse(Temp, L2).
sublist([], L2, _I, _J, L2).
sublist(_L1, L2, I, J, L2):-
I > J.
sublist(L1, L2, I, J, L2):-
I < 0,
sublist(L1, L2, 0, J, L2).
sublist([_L|Ls], L2, I, J, Acc):-
I > 0,
sublist(Ls, L2, I-1, J-1, Acc).
sublist([L|Ls], L2, I, J, Acc):-
sublist(Ls, L2, I, J-1, [L|Acc]).
그리고 우리는 지금처럼 테스트 할 수
?- sublist([1,2,3,4,5], S, 0,3).
S = [1, 2, 3, 4].
?- sublist([1,2,3,4,5], S, -1,30).
S = [1, 2, 3, 4, 5].
?- sublist([1,2,3,4,5], S, 3,1).
S = [].
?- sublist([1,2,3,4,5], S, 3,3).
S = [4].
?- sublist([1,2,3,4,5], S, 3,4).
S = [4, 5].
그리고 * 당신은 무엇을 지금까지 * 어떤 문제가 있습니까? 여기 사람들은 당신에게 답을주기위한 것이 아니라 오히려 설명을하기로되어 있습니다. – Rubens
@Rubens 오, 죄송합니다, 포함하는 것을 잊었습니다. 두 번째 술어가 작동하지 않습니다. 현재'I'와'J'가 목록에 있어야합니다. –