【发布时间】: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?现在和这个问题我只需要实部,但将来(不是这个问题的一部分)我需要虚部。更具体地说,但在问题中未提及,我需要知道数学表达式是否会产生odd或even值以用于规则-1^x。当x为奇数时,术语可以重写为-1,当x为偶数时,术语可以重写为1。
标签: prolog exponentiation