我必须在 Prolog 中编写一个规则 square(S),以测试数字 S 是返回 false(例如 square(3))还是 true(例如 square(4))的整数的平方。我已经使用了一个生成 0 到 M 之间所有整数的规则:
isInteger(X,M) :- between(0,M,X).
使用这个生成器,我必须编写规则 square(S)。我该怎么做?谢谢
我必须在 Prolog 中编写一个规则 square(S),以测试数字 S 是返回 false(例如 square(3))还是 true(例如 square(4))的整数的平方。我已经使用了一个生成 0 到 M 之间所有整数的规则:
isInteger(X,M) :- between(0,M,X).
使用这个生成器,我必须编写规则 square(S)。我该怎么做?谢谢
这可能无法作为您作业的解决方案,但这是使用ECLiPSe CLP Prolog中的约束逻辑编程的众多方法之一:
:- lib(gfd).
square(S) :-
sqr(_) #= S.
这意味着:如果 S 是一个整数和某个其他值(我们不关心什么值,所以我们使用“抛出”变量_
),则 S 是一个平方等于 S。
所有现代 Prolog 系统都支持约束逻辑编程,代码与上面类似。
要以您的方式解决它,您只需要检查 S 是否是您生成的整数乘以自身的乘积。所以你可以这样做:
isInteger(X,M) :- between(0,M,X).
square(N) :-
isInteger(X, N),
N is X * X.
我想出了另一种可能的解决方案,使用sqrt
SWI-Prolog 的算术函数,但我认为必须有一个更优雅的解决方案。
X is sqrt(4), integer(X).
我最初X
预计它将像的数量)。但这有效:2.0
integer(2.0)
square_of_integer(N) :-
Int is rationalize(sqrt(N)),
integer(Int).
它取决于首先将 N 表示为有理数(在 SWI-Prolog 中,“由复合术语 rdiv(N,M) 表示”)。2 is rationalize(2.0)
,即,对于整数,有理化计算为整数。