Prolog程序得到一个(整数)数作为两个整数平方的总和,为什么它不起作用?

Kev*_*vin 5 numbers prolog number-theory clpfd logical-purity

我开始学习Prolog的,我想给定一个整数程序P给予整数AB这样P = A² + B².如果没有的价值AB满足这个方程,false应退还

例如:if P = 5,它应该给A = 1B = 2(或A = 2B = 1)因为1² + 2² = 5.

我以为这应该工作:

giveSum(P, A, B) :- integer(A), integer(B), integer(P), P is A*A + B*B.
Run Code Online (Sandbox Code Playgroud)

查询:

giveSum(5, A, B).
Run Code Online (Sandbox Code Playgroud)

但事实并非如此.我该怎么办?我对Prolog很新,所以我仍然犯了很多错误.

提前致谢!

mat*_*mat 6

integer/1是一个非单调的谓词.在这种情况下,它不是允许您期望应用的推理的关系.举例说明:

?- integer(I).
false.

不存在整数,是吗?至少可以说,让我感到惊讶!

而不是这种非关系结构,使用您的Prolog系统的CLP(FD)约束来推理整数.

例如:

?- 5 #= A*A + B*B.
A in -2..-1\/1..2,
A^2#=_G1025,
_G1025 in 1..4,
_G1025+_G1052#=5,
_G1052 in 1..4,
B^2#=_G406,
B in -2..-1\/1..2

对于具体的解决方案:

?- 5 #= A*A + B*B, label([A,B]).
A = -2,
B = -1 ;
A = -2,
B = 1 ;
A = -1,
B = -2 ;
etc.

CLP(FD)约束是完全纯粹的关系,可以按照您期望的方式使用.有关更多信息,请参阅.

我注意到的其他事情:

  • use_underscores_for_readability_as_is_the_convention_in_prolog相反ofMixingTheCasesToMakePredicatesHardToRead.
  • 使用声明性名称,避免命令.例如,为什么要打电话呢give_sum?如果总和已经给出,这个谓词也很有意义.那么,sum_of_squares/3例如呢?