2012-05-12 3 views
1

나는 프롤로그 목록에서 머리를 쓰려고 고심하고있다. 여기 주어진 목록에서 두 개의 목록 만들기

내 문제입니다 : 내가 목록과 두 변수에 걸릴 나는이있어하지만이 찾고 결과 메신저를 포기하지 않을

목록 B.에서리스트 A의 홀수 요소와 짝수 요소를 저장해야

store(X, [], []). 
store([X,Y|Z],[X|_],[Y|_]):-store(Z,X,Y). 

결과는 다음과 같아야합니다

where ?- store ([a,b,c,1,2,3], A, B). 
     A = [b,1,3]. 
     B = [a,c,2]. 

답변

1

은 적절한 요소를 저장, 그것의 재귀 방문 할 목록 인수에서 추가 목록을 구축 할 수 있습니다. 이 조각을 완료 할 수 있는지 확인

odd_even([], [], []). 
odd_even([N|Ns], [N|Odds], Evens) :- 
    odd(N), 
    !, odd_even(Ns, Odds, Evens). 
% here another odd_even for evens 

odd(N) :- 
    ... % use rem/2 to find the integer remainder of N is 1 

편집 : (일반적으로 을 분할이라고합니다) 또 다른의 이상한 장소, 방문에서도 목록에서 장소 및 요소에서 요소를 이동하는 단지 두 개의 추가 인수에 배치합니다. 하나의 종료 규칙이 더 필요합니다. 이제는 두 개의 인수 과 함께이 분할됩니다.

split([], [], []). 
split([X], [], [X]). 
split([X,Y|R], [X|Xs], [Y|Ys]) :- 
    split(R,Xs,Ys). 

고려하는 경우가 있습니다 : 심지어리스트의 끝에서 '계산'해야 대 홀수합니다. 그런 다음 우리는 (결국) 목록을 교환해야합니다 ... 재귀 방문에 2 개의 인수를 더 추가하거나 num.of.elements를 계산하여 그 위치를 미리 결정해야합니다.

+0

내 질문을 분명히 했어야 했어. 나는 목록 1의 위치 1,3,5에있는 원소들을 원했고 ....리스트 B에있는 원소 2,4,6에있는 원소들을 원했다. – STee

+0

고맙다. 나는 하나 이상의 원소를 원소들로부터 취하는 개념을 이해하기 위해 고심하고있다. 목록의 머리. – STee

+0

코드의 두 번째 부분 인 split ([X], [], [X])가 아닌 기본 케이스와 재귀 케이스를 이해할 수 있습니다. – STee

관련 문제