【问题标题】:SWI-Prolog evaluate -1 raised to a fraction, can this be doneSWI-Prolog 评估 -1 提高到分数,可以这样做吗
【发布时间】:2017-10-16 05:46:34
【问题描述】:

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

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

例如(-1)^0.5

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

补充

当使用^/2**/2 时使用 SWI-Prolog,基数为 -1 和分数作为指数,结果为 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>

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

?- 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.5在R中没有解决方案,但在C中。不支持C。
  • @false 我不认为 SWI-Prolog 应该返回 ERROR: Arithmetic: evaluation error: 'undefined' 而是返回 complex not supported。当我第一次看到错误时,我以为我在代码中的某处被零除。研究了一个小时才发现根本原因是不支持复数。
  • @GuyCoder "undefined" 在这种情况下是一个合法的错误。该操作在操作支持的域内是真正“未定义的”。我确实同意诸如“复杂不支持”之类的错误消息可能会更有帮助,但可以梳理所有实时消息,如果愿意,可能会改进其中的一些消息。那么这里的问题是如何通过将想象的结果表示为某种术语来轻松处理它们?或者你只是想要一种获得真实部分的方法?我不清楚你到底在追求什么。您已经探索了问题中的几个分支...
  • @GuyCoder:LIA 模型似乎很自然地涵盖了这个特殊问题。但是,如果您对进一步调查感兴趣,特别是 w.r.t.结果的可靠性,我建议你看看unums
  • @lurker So is the question here how one could easily handle imaginary results by representing them as some kind of term? Or you just want a way to get the real part? 现在和这个问题我只需要实部,但将来(不是这个问题的一部分)我需要虚部。更具体地说,但在问题中未提及,我需要知道数学表达式是否会产生 oddeven 值以用于规则 -1^x。当x 为奇数时,术语可以重写为-1,当x 为偶数时,术语可以重写为1

标签: prolog exponentiation


【解决方案1】:

注意到(-1)^x 的图是一个类似于cos functionperiodic 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

【讨论】:

  • 顺便说一句;在 WA 中是否可以在同一坐标中绘制两个函数?
  • (这个,我明白了..)
猜你喜欢
  • 1970-01-01
  • 2012-02-19
  • 2017-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
相关资源
最近更新 更多