我要编写一个执行此操作的程序:
?- 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.
为什么不起作用(忽略最后的特殊情况)?
答案 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)
>=
和=<
运算符不会实例化它们的参数,只有在参数已经实例化后才能使用它们。
换句话说,在给定的解决方案中,X
和Y
的值为is
,<
和=<
运算符仅使用在L
和H
上,其值由用户提供。 (在给定的解决方案上,尝试pLeap(L,H,2,3)
,您将遇到与您相同的问题。)
但是,在您的情况下,您尝试在>=
上使用=<
和X
,而{{1}}尚无价值,因此解释程序会抱怨。