2012-04-14 3 views
1

나는 예를 들어 .. 재귀의 프롤로그 목록의 처음 두 요소를 작성하려고 :쓰기 목록의 첫 번째 요소는

내가 만약 내가 입력

List:[a,b,c,d,e,f] 

first_two(F,S,List). 
It returns 
F:a, S:b ; 
F:b, S:c ; 
F:c, S:d ; 
F:d, S:e ; 
F:e, S:f . 

다음과 같이 시도합니다.

가 대단히 감사합니다

하지만 실패 .. ..

+1

first_two (F, S, [F | [S | 꼬리]]) : - first_two (F, S, 꼬리). – Palindrom

+0

사실 나는 재귀를 시도했지만 어쩌면 그것은 내가 찾을 수없는 다른 방법으로 수행 할 수있다. – Palindrom

답변

2

first_two(F, S, [F|[S|_]]). 
당신은, 재귀의 기본 케이스를 잊어 종료 조건, 즉 : 나는 단순화도했습니다

first_two(F, S, [F, S|_Tail]). 
first_two(F, S, [_|Tail]) :- 
    first_two(F, S, Tail). 

을 친숙한 구문과 띄어쓰기를 사용하여 규칙을 위반했습니다.

나는 더 간단한 코드를 선호합니다. 그렇지 않습니까?

+0

그건 내가 뭘 찾고 .. 감사합니다. looooottt :) – Palindrom

+0

한가지 질문 : 나는이 종료를 얻지 못했을 것이라고 생각합니다.이 코드로 무엇을하고 있습니까? 언제 끝내나요? 당신은 설명 할 수 있습니까? 그것은 모든 재귀에 필요합니까? – Palindrom

+0

당신은 재귀 부분을 썼지 만 스콧 헌터 (Scott Hunter)가 제안한 정지 조건을 놓쳤지 만, 잘못된 방법으로 (IMHO)를 빠뜨렸다. '사실'이 없으면 Prolog는 재귀를 실행하지만 최종 목록에 도달하면 적용 대상을 알지 못합니다. – CapelliC

2

당신이 원하는 모든 다음 솔루션 꽤 가까이, 처음 두이지만, 재귀 필요로하지 않는 경우

+0

첫 번째 요소를 줄이면 두 번째 다른 조합을 볼 필요가있다. – Palindrom

관련 문제