난 당신이 여기에 수행 할 작업을 모두 잘 모르겠어요 반환합니다. 예를 들어 split(5, [1,2,3,4,5])
은 무엇입니까? 그렇다면 입력 목록이 정렬되어 있다고 가정하는 것이 안전할까요? 나는 그렇게 생각할 것이다.
규칙의 기본 문제 split/2
은 out 매개 변수가 없다는 것입니다. 프롤로그는 대부분의 프로그래밍 언어와 다르게 작동합니다. return
과 같은 것이 없습니다. 처음에는 이것이 극단적 인 한계를 느끼지 만 실제로 Prolog는 원하는만큼 많은 결과를 "반환"할 수 있습니다. 이 코드를 살펴보면 split/2
에는 매개 변수가없는 것 같아서이 이해의 중간 정도 인 것 같지만 필요한 외 매개 변수가 모두있는 split/4
을 호출합니다.
처음에는 split/2
의 아이디어를 포기하고 split/4
을 사용해 봅니다. 당신이 가지고있는 것은 너무 미친 것처럼 보이지 않습니다 :
?- split(2, [1,2,3,4,5], X, Y).
X = [1, 2],
Y = [3, 4, 5] .
?- split(5, [1,2,3,4,5], X, Y).
X = [1, 2, 3, 4, 5],
Y = [] .
?- split(1, [1,2,3,4,5], X, Y).
X = [1],
Y = [2, 3, 4, 5] .
이것은 대부분의 규칙이 정확하다는 것을 나타냅니다. 어디에 문제가 들어갈하면 추가 솔루션입니다 :
?- split(2, [1,2,3,4,5], X, Y).
... ;
2 [3,4,5]
X = [1, 2|_G317] ;
false.
?- split(5, [1,2,3,4,5], X, Y).
... ;
5 []
X = [1, 2, 3, 4, 5|_G326] ;
false.
?- split(1, [1,2,3,4,5], X, Y).
... ;
1 [2,3,4,5]
X = [1|_G314].
당신은 쓰기가 이러한 추가 솔루션은 단순히 규칙을 제거하는 등 마지막 규칙
X = Y, write(Y)...
에 의해 생성 된 것을에가는 것을 볼 수 있습니다
원하는 행동을 생산 split/4
.
계속 전진하다 아마 split/2
이 실제로 원하는 것은 split/3
이고 하나는 출력 매개 변수이고 list는 목록입니다. 우리가 지금까지 무엇을 기반으로 생성 정말 어렵지 않을 것이다 : 그것을 실행
split(X, List, [Before, After]) :- split(X, List, Before, After).
우리는 우리가 원하는 결과가 당신이 언급 한 걸보고 :이 도움이
?- split(3, [1,2,3,4,5], X).
X = [[1, 2, 3], [4, 5]] ;
false.
?- split(1, [1,2,3,4,5], X).
X = [[1], [2, 3, 4, 5]] ;
false.
?- split(5, [1,2,3,4,5], X).
X = [[1, 2, 3, 4, 5], []] ;
false.
희망을!