Kev*_*vin 5 numbers prolog number-theory clpfd logical-purity
我开始学习Prolog的,我想给定一个整数程序P给予整数A和B这样P = A² + B².如果没有的价值A和B满足这个方程,false应退还
例如:if P = 5,它应该给A = 1和B = 2(或A = 2和B = 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很新,所以我仍然犯了很多错误.
提前致谢!
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)约束是完全纯粹的关系,可以按照您期望的方式使用.有关更多信息,请参阅clpfd.
我注意到的其他事情:
use_underscores_for_readability_as_is_the_convention_in_prolog相反ofMixingTheCasesToMakePredicatesHardToRead.give_sum?如果总和已经给出,这个谓词也很有意义.那么,sum_of_squares/3例如呢?