2014-12-14 2 views
2

저는 프롤로그 초보자이고이 코드의 출력을 반대로 할 방법을 찾고 있습니다.프롤로그 초보자 - 역방향 출력 목록

fib(N, F) :- fib(N, 0, [1], F). 
fib(0, _, A, A). 
fib(N, A, [B|Bs], F) :- N1 is N - 1, Sum is A + B, fib(N1, B, [Sum,B|Bs], F). 

코드 N의 값 피보나치 수를 계산하고, F에 결과를 출력한다.

예를 들어 fib(4,X).X=[5,3,2,1,1]을 생성합니다. 내가 원하는 것은 X=[1,1,2,3,5] (역전 출력)이다.

이 형식으로 가져 오지 못하고 꼬리 재귀 속성을 유지할 수 없습니다.

fib(N, F) :- fib(N, 0, [1], FRev), reverse(FRev, F). 

는 반대의 순서로 목록을 구축하려는 경우, 당신은해야합니다 : 어떤 도움

답변

0

방금 ​​끝에 목록을 되돌리고 싶은 경우에

덕분에, reverse/2 사용 절을 다시 생각해보십시오. 한 가지 해결책은 last/2append/3을 사용하여 누적 기의 끝에 새로운 요소를 삽입하는 것입니다. 최초의 솔루션을 반환 한 후


는 프롤로그는 두 번째를 찾습니다 당신은 아마 오류가 발생합니다 :

fib(0, ...) 프롤로그는 첫 번째 규칙을 사용하기 때문에 발생하지만를 생성
?- fib(5, F). 
F = [8, 5, 3, 2, 1, 1] ; 
ERROR: Out of global stack 

선택 지점을 선택하고 나중에 다시 추적합니다. 이 시점에서 스택은 목표로 채워집니다 : fib(-1,...), fib(-2,...) 등. 이들 중 어느 것도 만족하지 않습니다. 당신은 fib/4의 첫 번째 절에 절단 연산자를 넣어해야합니다

fib(0, _, A, A):-!. 

은 그래서 두 번째 규칙을 사용하여 fib(0,...)을 resatisfy하려고하지 않을 것입니다.

?- fib(5, F). 
F = [8, 5, 3, 2, 1, 1]. 
+0

고맙습니다. –