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
在用 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