Prolog的表达式相同,但结果不同

Prolog的表达式相同,但结果不同,prolog,clpfd,Prolog,Clpfd,我编写了以下代码,但需要帮助: kip(A,B) :- A#= 2*B. ?- kip(100,L). L=50 我用不同的方式写了几乎相同的东西: kip_v1(A,B) :- A#= (B+1)*(B+1) - B*B -1. (B+1)*(B+1)-B*B-1是2*B与kip相同,但这并没有给出50: ?- kip_v1(100,P). P+1#=_G12699, P+1#=_G12711, P^2#=_G12723, _G12699 in inf.. -1\/1..sup,

我编写了以下代码,但需要帮助:

kip(A,B) :- A#= 2*B.

?- kip(100,L).

L=50
我用不同的方式写了几乎相同的东西:

kip_v1(A,B) :- A#= (B+1)*(B+1) - B*B -1.
(B+1)*(B+1)-B*B-1
2*B
kip
相同,但这并没有给出
50

?- kip_v1(100,P).

P+1#=_G12699,
P+1#=_G12711,
P^2#=_G12723, 
_G12699 in inf.. -1\/1..sup,
_G12711*_G12699#=_G12753,
_G12711 in inf.. -1\/1..sup,
_G12753 in 101..sup,
101+_G12723#=_G12753,
_G12723 in 0..sup.

有人能帮我写这段代码吗?

我发现,在第二种情况下,SWI似乎要求您限制域。如果使用默认值,其中max为
sup
,则在查询中会得到“参数未充分实例化”:
100#=(B+1)*(B+1)-B*B-1,标签([B])。
。但是,如果您在0..100100中使用,
B=(B+1)*(B+1)-B*B-1,标签([B])。
您将得到
B=50
。我在GNU Prolog中尝试了相同的查询,在这种情况下,我不需要限制域。有趣的结果,我现在无法解释。prolog是解决表达式还是解决表达式需要真正的值?例如,它是否从(a+1)*(a+1)-a*a中得到2*a+1,或者我们是否应该给a一些值来查找结果?prolog不会自动简化表达式。(请注意,您的意思是
2*A+1
不是
2*A+1
,因为
A
不是变量。)关于:-使用模块(库(clpfd))。abv(A,B):-A#=(B+1)*(B+1)-(B*B)-1。它正确地适用于-abv(A,4)。A=8。但不是abv(8,R)。我该怎么办?就像我在第一条评论中提到的,你可以将
R
的域限制为
R在0..
后接
abv(8,R)