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