我正在处理布尔函数,我只能(但安全地)假设它们作为 SOP 进来并且不包含否定(例如(A && B && C) || (A && B && D))。析取的数量通常> 5,连词的数量通常> 10。
因为在我的情况下,计算每个变量的值是困难的,并且结果被认为是短暂的,所以我需要能够最小化关于变量出现的所述函数。这种最小化的结果不需要是任何正常的形式,并且可以嵌套任意深度。
之前问过类似的问题,SO指出了使用扇出最小化、卡诺图、QM 或 BDD 的一般解决方案。在处理这些方法之前 - 这会大量破坏我的代码 - 我想仔细检查关于输入函数的先验已知事实是否不会产生使用更小但不太通用的最小化方法的可能性。
应用吸收和分配定律的 AFAICS 将始终提供最小形式。是否有可能利用函数作为 SOP 出现并且没有否定的事实?在我看来,应该有一个对变量进行简单交集和联合操作的递归算法,以产生所需的结果。
有人能描述一下那个算法吗?
编辑:征求意见:在对该主题进行了一些研究之后,在我看来,这里提出的问题等同于找到给定函数的减少 BDD 的最佳变量排序。
背景:最小化的函数被传递到作业队列以计算所有所需变量的值。之后对函数进行评估。考虑应用示例:
- 输入函数 (A && B && C) || (A && B && D)可以写成A && B && (C || D),这样就不必计算A和B两次。C和D的评估在作业队列中被序列化,因为只有其中一个需要被证明是正确的。
- (A && B && C) || (A && B && C && D) || (A && B && X && E)简化为A && B && (C || (X && E))。X && E的评估被认为更难,因此在队列中放在C的评估之后, D的评估被丢弃。