最简单的方法是构建BDT(二进制决策树),然后根据两个规则减少它:
- 合并任何同构子图.
- 消除两个孩子同构的任何节点.
但是与BDD相比,BDT存在一个主要问题.有没有办法在不首先构建BDT的情况下构建BDD?
algorithm implementation boolean-logic data-structures binary-decision-diagram
我有一个逻辑情况,最好描述为试图赢得任务的两个"团队".这项任务的结果可能是一个单一的胜利者,一个平局(平局),或者没有胜利者(僵局).
目前,我正在使用嵌套的if/else语句,如下所示:
// using PHP, but the concept seems language agnostic.
if ($team_a->win()) {
if ($team_b->win()) {
// this is a draw
} else {
// team_a is the winner
}
} else {
if ($team_b->win()) {
// team_b is the winner
} else {
// This is a stalemate, no winner.
}
}
Run Code Online (Sandbox Code Playgroud)
这似乎很像意大利面和重复.我可以使用更合乎逻辑的DRY模式吗?
这有点棘手,我认为这对于那些能够胜任这项任务的人来说是一个很好的挑战。我确实搜索了之前提出的所有问题,但找不到我想要的。
这里的目标是,给定2 个以二进制形式写入n位的整数,仅对每个整数的 n 位使用逻辑运算(AND、OR、...)来找到其中最大的一个(如果第一个整数的结果将为 0)整数为最大,否则为 1)。最终,我们的目标是能够绘制一个电子电路,其中 2*n 位将是有或没有张力的电线,并将电线插入到执行逻辑运算的实际电子组件中。
我开始思考这个问题,意识到无论发生什么(即无论 n 是什么),2^n 都大于 2^0 + ... + 2^(n-1) (从数学上来说,这很容易想到)。这意味着,当另一个整数中的相应位为 0 且 n 和 k 之间的所有其他位(k 左侧的所有位)相同时,无论哪个整数有一个位(例如数字 k)为 1,该位都是最大的。例子 :
A : 010(1)1011 大于 B : 010(0)1111 且有效位位于括号内。它左边的所有位都是相同的,我们不必关心其他位。
因此,可以对所有位对执行异或 (XOR) 操作:有效位将产生 1,然后我可以在 A 的相应位与 XOR 的结果之间执行 NAND,这样就会产生如果 A 的第 k 位是 1,则为 0;如果 B 的第 k 位为 1,则为 1。唯一的问题是……有效位右侧的位怎么样?它们可以不同(因此在执行 XOR 时也会产生 1),但我必须忽略这一点......有什么想法吗?
我正在开发一个应用程序,用户可以在其中向某些任务添加条件。
例如,他可以有条件 a、b、c、d 并将它们组合在一起,最终看起来像:
(a AND b) OR ( c AND d )
或
(a AND b AND c) or d
或
(a AND !b) AND c OR !d
等等。
如何通过删除括号将这些条件转换为等效条件?
据我了解,在类似 C 的语言中,我可以不使用运算符执行布尔值not
:(C)
int myBool = TRUE;
myBool = !myBool;
Run Code Online (Sandbox Code Playgroud)
但我的问题是:这在幕后是如何实现的?我的猜测是使用跳转,但如果过度使用,这些可能会效率低下:(Intel x86 语法)
; assume eax holds boolean
test eax, eax
jnz short boolTrue
inc eax ; eax was 0, now 1
jmp short after
boolTrue: ; eax non-zero
xor eax, eax ; eax now 0
after:
Run Code Online (Sandbox Code Playgroud)
如图所示,它需要 5 条指令,其中至少有 1 个跳转和 1 个按位and
( test
)。必须有一种更简单的方法来做到这一点,因为我已经看到代码库if (!!fileHandle)
由于某些奇怪的原因而执行“双重不”()。
那么(如上所述):编译器如何!
在 x86 上执行 boolean 操作?
我想检查每个列表中是否存在值.
以下True
按预期返回,但似乎不是pythonic.
这样做的正确/更优雅的方法是什么?
a = [1 ,2]
b = [1, 3]
c = [1, 4]
d = [2, 5]
False in [True if 1 in l else False for l in [a, b, c, d] ]
Run Code Online (Sandbox Code Playgroud) 我想解析逻辑字符串并获得"和"逻辑中所有元素的组合.例如,对于字符串'(A和(B或C))'我应该得到[[A,B],[A,C]]和字符串'(A和B以及(C或D和F)或者F和G)'我应该[[A,B,C],[A,B,D,F],[F,G]].
我正在尝试使用pyparsing.在这篇文章之后,在这里以二叉树方式解析pyparsing中的复杂逻辑表达式,我设法得到一个嵌套列表,其中字母按照首选项分组("和"优先于"或",括号覆盖此):
import pyparsing as pp
complex_expr = pp.Forward()
vars = pp.Word(pp.alphas, pp.alphanums + "_") | pp.Regex(r"[+-]?\d+(:?\.\d*)?(:?[eE][+-]?\d+)?").setName('proteins')
clause = pp.Group(vars ^ (pp.Suppress("(") + complex_expr + pp.Suppress(")") ))
expr = pp.operatorPrecedence(clause,[
("and", 2, pp.opAssoc.LEFT, ),
("or", 2, pp.opAssoc.LEFT, ),])
#print expr
complex_expr << expr
parseresult=complex_expr.parseString('( A and B and ( C or D and F ) or F and G )')
print parseresult
Run Code Online (Sandbox Code Playgroud)
这使:
[[[['A'],'和',['B'],'和',[[['C'],'或',[['D'],'和',['F ']]]]],'或',[['F'],'和',['G']]]]]
现在我该如何处理这个结果来实现所需的输出?我会很乐意帮助你.我试过pyparsing但我对其他可能更好的模块开放.
提前致谢.
结果应该不一样吗?我不明白.
[True,False] and [True, True]
Out[1]: [True, True]
[True, True] and [True,False]
Out[2]: [True, False]
Run Code Online (Sandbox Code Playgroud) 我有三个布尔值。false
如果所有三个都是true
或者如果所有三个都是 ,我需要返回false
。我会true
在所有其他情况下回来。根据我的研究,在某些规范中,这称为三变量异或。
编辑:一些规范声称三变量 XOR 涉及的唯一true
结果将来自只有一个参数的集合true
。我在这里指的 XOR 是另一个规范,其中多个值可能是true
,但不是全部。
执行此操作的最快方法是什么?a xor b xor c
不起作用
如果不是三个而是 n 个参数呢?
这是我想要的操作的真值表(带有三个参数的异或)。
A B C -
T T T F
T T F T
T F T T
T F F T
F T T T
F T F T
F F T T
F F F F
Run Code Online (Sandbox Code Playgroud) 我有这样的代码:
optionBoolean.getOrElse(false) && otherOptionBoolean.getOrElse(false)
Run Code Online (Sandbox Code Playgroud)
Scalastyle 告诉我它可以简化。如何?
boolean-logic ×10
boolean ×3
python ×3
list ×2
algorithm ×1
arrays ×1
assembly ×1
binary ×1
compilation ×1
integer ×1
max ×1
nested-if ×1
optional ×1
php ×1
pyparsing ×1
scala ×1
scala-option ×1
scalastyle ×1
x86 ×1
xor ×1