Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Detecting equivalent expressions

I'm currently working on a Java application where I need to implement a system for building BPF expressions. I also need to implement mechanism for detecting equivalent BPF expressions.

Building the expression is not too hard. I can build a syntax tree using the Interpreter design pattern and implement the toString for getting the BPF syntax.

However, detecting if two expressions are equivalent is much harder. A simple example would be the following:

A: src port 1024 and dst port 1024
B: dst port 1024 and src port 1024

In order to detect that A and B are equivalent I probably need to transform each expression into a "normalized" form before comparing them. This would be easy for above example, however, when working with a combination of nested AND, OR and NOT operations it's getting harder.

Does anyone know how I should best approach this problem?

like image 317
StackedCrooked Avatar asked Jan 19 '23 03:01

StackedCrooked


1 Answers

One way to compare boolean expressions may be to convert both to the disjunctive normal form (DNF), and compare the DNF. Here, the variables would be Berkeley Packet Filter tokens, and the same token (e.g. port 80) appearing anywhere in either of the two expressions would need to be assigned the same variable name.

There is an interesting-looking applet at http://www.izyt.com/BooleanLogic/applet.php - sadly I can't give it a try right now due to Java problems in my browser.

like image 177
NPE Avatar answered Jan 30 '23 01:01

NPE