Prolog - 生成并测试,如何编写规则平方(S)

时间:2014-02-08 17:21:31

标签: prolog integer generator perfect-square

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

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

使用这个生成器我必须写规则平方(S)。我该怎么做? 感谢

2 个答案:

答案 0 :(得分:1)

这可能不适合作为家庭作业的解决方案,但这是使用ECLiPSe CLP Prolog中的约束逻辑编程来实现它的众多方法之一:

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

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

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

答案 1 :(得分:0)

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

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

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

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

我最初预计它会像X is sqrt(4), integer(X).一样简单但是,这不起作用(至少在SWI-Prolog 7.1.4中没有),因为X与float {{统一} 1}}和2.0为false(因为整数正在检查数据类型,而不是数字的值)。但这有效:

integer(2.0)

这取决于首先给出N作为理性的表示(在SWI-Prolog中,'由复合项rdiv(N,M)'表示)。 square_of_integer(N) :- Int is rationalize(sqrt(N)), integer(Int). ,即合理化计算为整数的整数。