2015-01-16 3 views
1

나는 누군가가이 무엇인지 패러다임 말씀 해주십시오 수 이 패러다임은 무엇입니까?

fib(0, 0). 
fib(1, 1). 
fib(V, VF) :­- 
    B is V ­- 1, C is V ­- 2, 
    fib(B, BF), fib(C, CF), 
    VF is BF + CF. 

프롤로그

에서이 코드 예제를 가지고 왜 즉, 서로 다른 패러다임에 대한 질문이? 미리 감사드립니다.

+2

':'대신': -'를 쓰고'fib (0,1)'은 종료하지 않는다는 것에주의하십시오. – false

+2

... 'V'와 1 사이와 'V'와 2 사이에 마이너스 연산자가 있어야합니다. –

+1

질문을 이해할 수 있을지 모르겠군요. ... 어떤 패러다임이 ...? * 재귀 적 (매우 비효율적으로 그렇다)이면 그것이 의미하는 바입니다. – lurker

답변

4

것은 내가 먼저 대신 낮은 수준의 연산의 정수 사이의 진정한 산술 관계를 사용하여 일반적인 프로그램도 이해하기 쉽고 만들어 보자 :

:- use_module(library(clpfd)). 

fib(0, 0). 
fib(1, 1). 
fib(V, VF) :- 
     V #> 1, 
     B #= V - 1, 
     C#= V - 2, 
     VF #= BF + CF, 
     fib(B, BF), 
     fib(C, CF). 

공지 사항을 그 우리는 사실의 관점에서 솔루션을 진술하고 있기 때문에 우리는 또한 자유롭게 목표를 이동할 수 있습니다. 모든 솔루션이 있습니까 :

첫째, 당신은 요청할 수 있습니다 :

다음 쿼리

지금 왜이 호출 로직 프로그래밍 꽤 명확하게?

?- fib(X, Y). 
X = Y, Y = 0 . 

예!

그런 다음 예를 들어 질문 할 수 있습니다. 피보나치 수는 20 번째가 무엇입니까?

?- fib(20, Y). 
Y = 6765 . 

다음과 같이 질문 할 수 있습니다. 피보나치 수는 233과 같습니다.

?- fib(X, 233). 
X = 13 . 

또한 다음과 같이 질문 할 수 있습니다.

?- fib(10, 54). 
false. 

아니요, 사실이 아닙니다. 따라서

, 우리는 논리적 인 질문을하고 논리적 관계의 측면에서을 보유하고 무엇 을 진술하여 해결 방법을 설명 할 수 있기 때문에, 그것은 논리 프로그램이라고합니다.

+0

이것은 좋은 질문입니다. (+1). 우리가 'is/2' 절을했을 때 적용된 OP에 대한 나의 원래 코멘트. – lurker

+1

'fib (X, 233) .'은'X = 13' 이후에 더 많은 해법을 요구할 것이고 무한 재귀로 죽을 것입니다. 하지만'BF #> 0, CF #> 0 '은 그것을 제한한다고 생각합니다. – lurker

+0

이것은'? - fib (2, Y)'가'false'를 산출하기 때문에 over-constrain이됩니다. 그럼에도 불구하고 당신의 사고는 올바른 방향 (+1)으로 진행되며, 인수 중 하나가 충분히 제한된 경우에만 쿼리가 종료되도록하는 추가적인 제약 조건 집합을 찾을 수 있습니다. – mat