2011-05-10 3 views
4

Prolog에서 일반적인 차이 (http://www.purplemath.com/modules/nextnumb.htm)에 대한 간단한 알고리즘을 구현하려고합니다.) 나는 올바른 규칙을 내놓는데 어려움을 겪고있는 것 같다. ,Prolog 공통 차이점, 다항 시퀀스의 다음 번호

nextitem([A|B], NextI):-lastitem([A|B],X), 
rowbelow([A|B],[Z]),lastitem([Z],Y), nextI is X+Y. 
nextitem([],0). 

%% recursive case: ignore first item, seek last item of rest of list 
lastitem([First | Rest], Last) :-lastitem(Rest, Last). 
lastitem([OnlyOne], OnlyOne). 

%%at least two things in the list 
rowbelow([A,B|T], [X|Y]) :-X is B-A, rowbelow([B|T],Y). 
rowbelow([A,B|T], [X]) :-X is B-A. 

문제는 내 옆에있는 항목을 것 같다 (내가 어딘가에 다음 항목에 재귀 호출을해야처럼 느낌하지만, 아마?) 예를 들어

: 내가 가진 rowbelow ([6,7,14,33], X). 은이 [1,7,19]를 (폴리 위해^3 + 6 ×)

트레이스는 다음 항목의 콜 아래 내 로우 같아

그러나 다음의 아이템 (70)을 생성하지 않는다 ..이다 적절한 생산 잘못된, 그리고 행을 계속 이동하는 재귀 호출이없는 것 같아요 ...

어떤 아이디어를 다음 단계 규칙을 수정하는 방법 ?? 정말 여기에 20 시간이 걸리므로 도움을 주셔서 감사합니다. '아직 클릭하지 않았습니다.'...

+0

여기서 계산하려는 것을 얻지 못했습니다. 하지만 다음은 몇 가지 메모입니다. nextI는 다음 항목에서 철자가 잘못되었습니다 (NextI이어야 함). 또한 rowbelow를 호출 할 때 rowbelow ([A | B], [Z]) 대신 rowbelow ([A | B], Z) 여야합니다. rowbelow의 두 번째 절은 행렬 ([_], [])이어야한다고 생각합니다. 기본 경우처럼 – gusbro

답변

3

nextitem 규칙에 오타가 있습니다. NextI은 대소 문자를 구분해야합니다. 정의에서 nextI으로. 또한 [Z] 주위의 목록 대괄호가 필요합니까, rowbelow 결과는 해당 피연산자의 목록이되므로 필요하지 않습니다. 당신이 자리에있는 논리로부터 부여 될 것 인 X = 52에 장소에두고

nextitem([A|B], NextI):-lastitem([A|B],X), 
rowbelow([A|B],Z),lastitem(Z,Y), NextI is X+Y. 
nextitem([],0). 

, nextitem([6,7,14,33],X) 결과 : 그래서 당신이와 끝까지.

  • lastitem([6,7,14,33],X)X = 33
  • rowbelow([6,7,14,33], Z) 당신이
  • lastitem([1,7,19],Y)Y = 19
  • NextI is 33+19하게 상태로 Z = [1,7,19]을 줄 것이다 만들 것 NextI = 52
,369을 제공합니다

를 통해 추적하려면

차이점의 첫 번째 단계 만 평가 중이므로 x^3 + 6의 시퀀스에서 다음 항목을 얻으려면 70이라고 말한 것처럼 이전 값 (33)에 37을 추가해야합니다 차이, 19, 플러스 18, 아래에있는 것입니다. [6,12]입니다.

예제는 재귀 적 정의입니다. 예제 웹 사이트에 나와 있듯이 차이가 일정한 수준까지 내려와야합니다. 또한 추가 규칙이 단독 필요 당신이 원하는 것을 얻을 것입니다 rowbelow에 의해 반환 된 목록을 처리하는 일관 6.

재정 당신의 nextitem 규칙에 다운 받고 귀하의 경우에는

Difference example, purplemath.com

, 목록을 작성하십시오.

nextitem([A|B], NextI):-lastitem([A|B],X), rowbelow([A|B],Z), nextitem(Z,Y), NextI is X+Y. 
nextitem([A],A). 
nextitem([],0). 
관련 문제