2010-04-27 90 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). 

我这样做只是这样的:

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

为什么它不工作(忽略末尾的特殊情况)?

回答

2

>==<运算符没有实例化它们的参数,只有在实例化参数后才能使用它们。

换句话说,在给定的溶液中,XY给出值与is<=<和运营商仅在LH,其值由用户给出使用。 (在给定的解决方案,尝试pLeap(L,H,2,3)你会得到你遇到了同样的问题。)

在你的情况,不过,您尝试使用上X>==<,它没有价值着呢,所以翻译抱怨。

4

你可以使用库clpfd为你解决问题。

:- use_module(library(clpfd)). 

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

这里是输出:

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