SWI-Prolog 评估 -1 提高到分数,可以这样做吗

SWI-Prolog evaluate -1 raised to a fraction, can this be done

在用 SWI-Prolog 计算数学表达式时,我需要计算 -1 的指数。当指数为整数时,结果符合预期,但当指数为非整数时,结果为 undefined.

是否可以使用 SWI-Prolog 将 -1 计算为非整数?

例如(-1)^0.5

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

补充

使用 SWI-Prolog,当使用底数为 -1 且分数为指数的 ^/2 or **/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 or **/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 is based on GNU multiple precision arithmetic library (GMP), which as noted on Wikipedia 不支持复数。

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

注意到(-1)^x的情节是periodic function similar to 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