2012-10-19 3 views
3

주어진 요소에서 프롤로그를 분할하려고했습니다. 나는 가까이 왔지만 목록의 왼쪽 부분을 얻을 수는 없다.지정된 요소에서 목록 나누기

split(X,[Y|L]) :- split(X,[Y|L],[Y|K],M). 
split(_,[],[],[]). 
split(X,[Y|L],K,[Y|M]) :- X < Y, split(X,L,K,M). 
split(X,[Y|L],[Y|K],M) :- X >= Y, split(X,L,K,M). 
split(X,[Y|L],[Y|K],M) :- X = Y, write(Y), write(' '), write(L). 

입력 :

split(2,[1,2,3,4,5]). 

결과 :

2 [3,4,5] 

가 나는

[1,2] [3,4,5]. 

답변

2

난 당신이 여기에 수행 할 작업을 모두 잘 모르겠어요 반환합니다. 예를 들어 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. 

희망을!

1

나는이 방법을 쓸 것이다, 그래서 당신은 '재사용'술어는 다른 유스 케이스를 필요로 할 수있는 경우

split(X, Xs) :- 
    split(X, Xs, L, R), format('~w ~w', [L, R]). 

split(_, [], [], []). 
split(X, [Y|Xs], [], [Y|Xs]) :- 
    X < Y. 
split(X, [X|Xs], [X], Xs). 
split(X, [Y|Xs], [Y|Ls], Rs) :- 
    X > Y, 
    split(X, Xs, Ls, Rs). 

시험 (출력 스트림에 쓰기는 우리가 가장 많은 시간을 필요로하지 않습니다)

?- split(2,[1,2,3,4,5]). 
[1,2] [3,4,5] 
true ; 
false.