2

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

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

(给出 2 到 5 之间的所有对 X,X+1,加上最后的特殊情况)。

这应该是解决方案。我真的不明白它是如何工作的,有人可以指导我吗?

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.

为什么它不起作用(最后忽略特殊情况)?

4

2 回答 2

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.
于 2010-04-28T15:39:39.737 回答
2

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

换句话说,在给定的解决方案中,XandY被赋予了值is<and=<运算符仅用于Land H,其值由用户给出。(在给定的解决方案上,尝试一下pLeap(L,H,2,3),您会遇到与您遇到的相同的问题。)

但是,在您的情况下,您尝试使用>=and =<on X,它还没有任何价值,因此解释器会抱怨。

于 2010-04-27T18:53:54.413 回答