如何在Z3中表示整数无穷大?

如何在Z3中表示整数无穷大?,z3,Z3,我需要能够比较两个整数表达式,其中可能包括文字整数、加法、一元求反、整数常量和无穷大,并确定它们之间的不等式是否可满足。这是一个更大的程序的一部分,所以我无法提前知道这些表达式会是什么样子 我曾经考虑过定义一个整型常量,让它取任意值,但后来我意识到无穷大N。说明N大于所有其他整数也会产生一个矛盾,即N>M,其中M=N+1。是,这就是为什么我认为它行不通的原因——如果我告诉Z3,我想要的无穷大本身就是一个整数。我曾想过告诉Z3无穷大是另一种东西(另一种),但我以前从未这样做过,所以我不知道如何正确

我需要能够比较两个整数表达式,其中可能包括文字整数、加法、一元求反、整数常量和无穷大,并确定它们之间的不等式是否可满足。这是一个更大的程序的一部分,所以我无法提前知道这些表达式会是什么样子

我曾经考虑过定义一个整型常量,让它取任意值,但后来我意识到无穷大<5是可以满足的


我考虑过定义一个常数,并做出一个普遍量化的断言,它大于所有整数,但我不知道应该说它是什么类型。如果我告诉Z3,我的无穷大常数的种类是整数,我想它可能会很高兴地离开,并试图找到我最大的整数!我很确定这不会以我想要的方式结束。

我将创建一个复合类型,由一个整数和一个布尔值组成,表示这个特定值是否为无穷大。然后,您需要在此基础上定义算术。例如,如果其中一个操作数是无穷大,则加法的结果也是无穷大。否则,它是整数的实际和。比较将以类似的方式定义(基于案例)

没有必要在Z3系统中实际创建类型。只需在代码中始终以int/bool对创建值。一些辅助函数可以做到这一点


这样做可能会给Z3带来一个更难解决的问题,甚至可能会升级您正在使用的逻辑。

我会创建一个由整数和布尔值组成的复合类型,该类型表示该特定值是否为无穷大。然后,您需要在此基础上定义算术。例如,如果其中一个操作数是无穷大,则加法的结果也是无穷大。否则,它是整数的实际和。比较将以类似的方式定义(基于案例)

没有必要在Z3系统中实际创建类型。只需在代码中始终以int/bool对创建值。一些辅助函数可以做到这一点


这样做可能会给Z3带来一个更难解决的问题,甚至可能会升级您正在使用的逻辑。

Z3的这个扩展允许无穷小:。它提到了一个实现,但我不知道它的当前状态。无穷小是接近零的值(非常小的值)。无穷大不是无穷小。它也不是一个超越常数(你提到的论文也讨论过)。看来这并没有给我想要的。对不起,我的错。不知怎的,我相信论文中讨论的扩展也包括无穷大。顺便说一句,你的第二个建议应该产生一个矛盾:说明对于某些整数N,N大于所有整数,意味着N>N。说明N大于所有其他整数也会产生一个矛盾,即N>M,其中M=N+1。是,这就是为什么我认为它行不通的原因——如果我告诉Z3,我想要的无穷大本身就是一个整数。我曾想过告诉Z3无穷大是另一种东西(另一种),但我以前从未这样做过,所以我不知道如何正确地做到这一点。此外,我不知道它是否会起作用,或者做我想做的事情,我希望有人会说,“当然,这样做,就这样做。”或者,“不,那是浪费时间,改为这样做。”Z3的这个扩展允许无穷小:。它提到了一个实现,但我不知道它的当前状态。无穷小是接近零的值(非常小的值)。无穷大不是无穷小。它也不是一个超越常数(你提到的论文也讨论过)。看来这并没有给我想要的。对不起,我的错。不知怎的,我相信论文中讨论的扩展也包括无穷大。顺便说一句,你的第二个建议应该产生一个矛盾:说明对于某些整数N,N大于所有整数,意味着N>N。说明N大于所有其他整数也会产生一个矛盾,即N>M,其中M=N+1。是,这就是为什么我认为它行不通的原因——如果我告诉Z3,我想要的无穷大本身就是一个整数。我曾想过告诉Z3无穷大是另一种东西(另一种),但我以前从未这样做过,所以我不知道如何正确地做到这一点。此外,我不知道它是否会起作用,或者做我想做的事情,我希望有人会说,“当然,这样做,这是怎么做的。”或者,“不,那是浪费时间,改为这样做。”