了解prolog [列表]

时间:2010-04-27 18:34:32

标签: prolog clpfd

我要编写一个执行此操作的程序:

?- 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 个答案:

答案 0 :(得分: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.

答案 1 :(得分:2)

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

换句话说,在给定的解决方案中,XY的值为is<=<运算符仅使用在LH上,其值由用户提供。 (在给定的解决方案上,尝试pLeap(L,H,2,3),您将遇到与您相同的问题。)

但是,在您的情况下,您尝试在>=上使用=<X,而{{1}}尚无价值,因此解释程序会抱怨。