【问题标题】:How to check whether two expressions are equivalent or not in java [closed]如何在java中检查两个表达式是否等价[关闭]
【发布时间】:2016-12-19 07:49:57
【问题描述】:

我想检查Java 中的两个表达式是否等价。假设我有两个表达式:
exp 1:

A && B && ( C || D)  

exp 2:

B && ( C || D ) && A  

我想检查这两个表达式是否等价。

我所说的等价的意思是,如果说我们有两个表达式,那么这两个表达式必须具有相同的标记(A、B、C、D)和它们之间的相同关系运算符。并且应该为所有输入返回相同的值。我不想考虑java如何执行这些事情的顺序。我需要的是一个库或一些 java 代码 sn-p 这样做。关于算法的信息也很好。

【问题讨论】:

  • 试试看怎么样?
  • 它们在逻辑上是相同的,但在性能方面并不相同。只要ABC || D 评估为false,那么检查其他的就没有意义了,VM 也不会这样做。虚拟机按顺序检查它们,因此顺序对性能很重要。因此,例如,如果 A 可能是 true,并且对性能很重要,请像在第二个示例中那样检查它last
  • 一般来说,您必须检查所有可能的真假值,这会给您 2^4 个排列,即 16。但是在这种特殊情况下,它们看起来是相同的。
  • 很简单:它们并不相同。如果 Java 没有副作用,它们将是相同的,但事实并非如此。短路不是唯一的原因 - 这个表达式是从左到右计算的,因此早期子表达式之一中的任何副作用都会影响整个评估,并且两个表达式中的顺序不同
  • 您是否在问表达式是否等效,因为它们返回相同的结果,因为 A、B、C 和 D 都是布尔值?在这种情况下,您想从数学的角度评估给定的表达式等价性。这不一定符合语言规则(因为如前所述,Java 语言并不认为表达式是等价的)。最好的办法可能是找到一个做这种事情的图书馆。它可能涉及将表达式解析为字符串,并且问题超出了范围,因为它要求库执行此操作。

标签: java pattern-matching expression


【解决方案1】:

它们不是由于简短的评估。在 Java 中,当 A 被评估为 false 时,A && B 立即返回 false。它有所作为,例如当涉及到Exceptions 或非纯函数的布尔方法时。

你可以试试下面的实验:

public class Test {

    public n = 0;
    public boolean A() {
        System.out.println("A");
        return false;
    }
    public boolean B() {
        System.out.println("B");
        return true;
    }
    public boolean C() {
        n++;
        return true;
    }
    public boolean D() {
        n = n*2;
        return false;
    }
    public static void main(String[] args) {
        Test test = new Test();
        if (test.A() && test.B()) { System.out.println("true"); }
        if (test.B() && test.A()) { System.out.println("true"); }
        if (test.C() && test.D()){}
        else {System.out.println(t.n);}
        t.n = 0;
        if (test.D() && test.C()){}
        else {System.out.println(t.n);}
        t.n = 0;
        boolean c = test.C();
        boolean d = test.D();
        if (d && c){}
        else {System.out.println(t.n);}
    }
}

它显示了与副作用相关的简短评估的后果。

【讨论】:

  • 嘿,我正在寻找一些算法或java中的一些包,以便我可以检查相同的表达式
  • @Naruto 但它们并不相同
  • @AndyTurner:我同意你和 xenteros 的观点;我认为 OP 是 a) 有点幼稚,并且 b) 想要对涉及 & 和 | 的逻辑布尔公式执行此操作而不是 && 和 ||
  • @IraBaxter 我认为有人正在从 Prolog 或 Haskel 切换到 Java,并希望它表现得像个玩具:p
  • @AndyTurner:即使您忽略副作用,如果操作数可以抛出异常,它们也不是等价的。是的,明白了。你应该给 OP 怀疑的好处,并解释了限制,然后回答剩下的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多