2010-04-27 5 views
2

나는이 작업을 수행하는 프로그램 작성입니다 :이해 프롤로그 [목록]

?- pLeap(2,5,X,Y). 
X = 2, 
Y = 3 ; 
X = 3, 
Y = 4 ; 
X = 4, 
Y = 5 ; 
X = 5, 
Y = 5 ; 
false. 

것은 (모든 쌍을 제공 X, X + 1 2 5 플러스 끝에 특별한 케이스 사이).

이것은 아마도 해결책 일 것입니다. 나는 그것이 어떻게 작동하는지 정말로 이해하지 못한다. 누군가 그것을 통해 나를 인도 할 수 있을까?

pLeap(X,X,X,X). 
pLeap(L,H,X,Y) :- 
     L<H, 
     X is L, 
     Y is X+1. 
pLeap(L,H,X,Y) :- 
     L=<H, 
     L1 is L+1, 
     pLeap(L1,H,X,Y). 

I는 다음과 같이 간단하게 할 거라고 :

이 가
pLeap(L,H,X,Y) :- 
     X >= L, 
     X =< H, 
     Y is X+1. 

가 왜 (끝에 특별한 경우를 무시) 작동하지 않습니다 ?

답변

2

>==< 연산자는 인수를 인스턴스화하지 않으며 인수가 이미 인스턴스화 된 후에 만 ​​사용할 수 있습니다. 주어진 용액에, 바꾸어 말하면

, XYis로 값을 부여하고, <=< 사업자 만 그 값이 사용자에 의해 주어진 LH에 사용된다. (주어진 솔루션에서 pLeap(L,H,2,3)을 시도하고 당신은 당신이 발생하는 것과 같은 문제를 얻을 수 있습니다.)

를 귀하의 경우에는, 그러나, 아직 값이없는 X>==<를 사용하려고하고, 그래서 통역관은 불평한다.

4

clpfd 라이브러리를 사용하면 문제가 발생할 수 있습니다.

?- pLeap(2,5,X,Y). 
X = 2, 
Y = 3 ; 
X = 3, 
Y = 4 ; 
X = 4, 
Y = 5 ; 
X = 5, 
Y = 5. 
: 여기
:- use_module(library(clpfd)). 

pLeap(L,H,X,Y) :- 
    X in L..H, 
    Y #= min(H, X+1), 
    label([X]). 

가 출력되고