我必须在Prolog中编写一个规则平方(S)来测试数字S是否为返回false(例如square(3))或true(例如square(4))的整数的平方。 我已经使用了一个生成0和M之间所有整数的规则:
isInteger(X,M) :- between(0,M,X).
使用这个生成器我必须写规则平方(S)。我该怎么做? 感谢
答案 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).
,即合理化计算为整数的整数。