SWI-Prolog评估-1提升到一个分数,可以这样做

时间:2017-05-16 23:56:31

标签: prolog exponentiation

在使用SWI-Prolog评估数学表达式时,我需要将-1计算为指数。当指数是整数时,结果与预期一致,但当指数是非整数时,结果为undefined

是否可以使用SWI-Prolog评估-1为非整数?

e.g。 (-1)^0.5

首选答案不应超过几行才能完成。使用包装是可以接受的。使用另一种语言是可以接受的,但不太受欢迎。

补编

使用SWI-Prolog时,使用基数为-1的^/2**/2,并将分数作为指数导致undefined

?- V is **(-1.0,-0.5).
ERROR: Arithmetic: evaluation error: `undefined'
ERROR: In:
ERROR:    [8] _3688 is -1.0** -0.5
ERROR:    [7] <user>

?- V is **(-1.0,0.5).
ERROR: Arithmetic: evaluation error: `undefined'
ERROR: In:
ERROR:    [8] _43410 is -1.0**0.5
ERROR:    [7] <user>

?- V is ^(-1.0,-0.5).
ERROR: Arithmetic: evaluation error: `undefined'
ERROR: In:
ERROR:    [8] _6100 is -1.0^ -0.5
ERROR:    [7] <user>

?- V is ^(-1.0,0.5).
ERROR: Arithmetic: evaluation error: `undefined'
ERROR: In:
ERROR:    [8] _7294 is -1.0^0.5
ERROR:    [7] <user>

但是,当使用基数为-1的^/2**/2以及作为指数的整数时,会产生有效值。

?- V is ^(-1.0,-3.0).
V = -1.0.

?- V is ^(-1.0,-2.0).
V = 1.0.

?- V is ^(-1.0,-1.0).
V = -1.0.

?- V is ^(-1.0,0.0).
V = 1.0.

?- V is ^(-1.0,1.0).
V = -1.0.

?- V is ^(-1.0,2.0).
V = 1.0.

?- V is ^(-1.0,3.0).
V = -1.0.

?- V is **(-1.0,-3.0).
V = -1.0.

?- V is **(-1.0,-2.0).
V = 1.0.

?- V is **(-1.0,-1.0).
V = -1.0.

?- V is **(-1.0,0.0).
V = 1.0.

?- V is **(-1.0,1.0).
V = -1.0.

?- V is **(-1.0,2.0).
V = 1.0.

?- V is **(-1.0,3.0).
V = -1.0.

我知道SWI-Prolog math基于GNU multiple precision arithmetic library (GMP),如Wikipedia所述,它不支持复数。

我也知道plot of -1^X是实部和虚部的连续函数。目前我只对真实部分感兴趣。

1 个答案:

答案 0 :(得分:1)

注意到(-1)^x的情节是periodic function类似于cos function的频移,以

开头
cos((10 * x) / pi)

要调整函数的频率,请将函数绘制为X轴上的平移10,然后调整cos函数以匹配,例如

cos((9.9 * x) / pi)

然后继续进一步翻译并调整。经过几次迭代调整后,即使x为10,000,也接近于所需的功能。

cos((9.8696 * x) / pi)

?- V is cos((9.8696*(10000.0))/pi).
V = 0.9999018741279994.

补编

为了更容易进行调整,使用Wolfram Alpha绘制了函数。请注意,由于SWI-Prolog和Wolfram Alpha之间的差异,调整因素略有不同。对于Wolfram Alpha,因子为9.86955,而使用SWI-Prolog则为9.8696