0

我必须在 Prolog 中编写一个规则 square(S),以测试数字 S 是返回 false(例如 square(3))还是 true(例如 square(4))的整数的平方。我已经使用了一个生成 0 到 M 之间所有整数的规则:

isInteger(X,M) :- between(0,M,X).

使用这个生成器,我必须编写规则 square(S)。我该怎么做?谢谢

4

2 回答 2

1

这可能无法作为您作业的解决方案,但这是使用ECLiPSe CLP Prolog中的约束逻辑编程的众多方法之一:

:- lib(gfd).
square(S) :-
    sqr(_) #= S.

这意味着:如果 S 是一个整数和某个其他值(我们不关心什么值,所以我们使用“抛出”变量_),则 S 是一个平方等于 S。

所有现代 Prolog 系统都支持约束逻辑编程,代码与上面类似。

于 2014-02-08T20:57:42.457 回答
0

要以您的方式解决它,您只需要检查 S 是否是您生成的整数乘以自身的乘积。所以你可以这样做:

isInteger(X,M) :- between(0,M,X).

square(N) :-
    isInteger(X, N),
    N is X * X.

我想出了另一种可能的解决方案,使用sqrtSWI-Prolog 的算术函数,但我认为必须有一个更优雅的解决方案。

X is sqrt(4), integer(X).我最初X预计它将像的数量)。但这有效:2.0integer(2.0)

square_of_integer(N) :-
    Int is rationalize(sqrt(N)),
    integer(Int).

它取决于首先将 N 表示为有理数(在 SWI-Prolog 中,“由复合术语 rdiv(N,M) 表示”)。2 is rationalize(2.0),即,对于整数,有理化计算为整数。

于 2014-02-08T21:13:59.213 回答