标签: boolean-logic

如何有效地实现二元决策图(BDD)?

关于二元决策图的背景可以在维基百科上找到BDD.

最简单的方法是构建BDT(二进制决策树),然后根据两个规则减少它:
- 合并任何同构子图.
- 消除两个孩子同构的任何节点.
但是与BDD相比,BDT存在一个主要问题.有没有办法在不首先构建BDT的情况下构建BDD?

algorithm implementation boolean-logic data-structures binary-decision-diagram

5
推荐指数
1
解决办法
6317
查看次数

处理"一个,两个或没有"逻辑的正确方法是什么?

我有一个逻辑情况,最好描述为试图赢得任务的两个"团队".这项任务的结果可能是一个单一的胜利者,一个平局(平局),或者没有胜利者(僵局).

目前,我正在使用嵌套的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模式吗?

php language-agnostic boolean-logic nested-if

5
推荐指数
1
解决办法
399
查看次数

仅使用位逻辑查找二进制中两个整数的最大值

这有点棘手,我认为这对于那些能够胜任这项任务的人来说是一个很好的挑战。我确实搜索了之前提出的所有问题,但找不到我想要的。

这里的目标是,给定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),但我必须忽略这一点......有什么想法吗?

binary boolean-logic integer max

5
推荐指数
1
解决办法
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

等等。

如何通过删除括号将这些条件转换为等效条件?

boolean-logic boolean boolean-expression

5
推荐指数
1
解决办法
5374
查看次数

布尔值在汇编中如何“注释”?

据我了解,在类似 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 操作?

x86 assembly boolean-logic compilation

5
推荐指数
1
解决办法
5423
查看次数

测试多个列表中是否存在值

我想检查每个列表中是否存在值.

以下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)

python boolean-logic list-comprehension list

5
推荐指数
1
解决办法
875
查看次数

使用Python在逻辑字符串中获取"AND"中的元素

我想解析逻辑字符串并获得"和"逻辑中所有元素的组合.例如,对于字符串'(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但我对其他可能更好的模块开放.

提前致谢.

python boolean-logic pyparsing

5
推荐指数
1
解决办法
111
查看次数

python中的布尔列表操作

结果应该不一样吗?我不明白.

[True,False] and [True, True]
Out[1]: [True, True]

[True, True] and [True,False]
Out[2]: [True, False]
Run Code Online (Sandbox Code Playgroud)

python arrays boolean-logic boolean list

5
推荐指数
1
解决办法
960
查看次数

三个值的异或运算

我有三个布尔值。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)

boolean-logic boolean xor logical-operators

5
推荐指数
1
解决办法
6775
查看次数

简化 Scala 中的 Option[Boolean] 表达式

我有这样的代码:

optionBoolean.getOrElse(false) && otherOptionBoolean.getOrElse(false)
Run Code Online (Sandbox Code Playgroud)

Scalastyle 告诉我它可以简化。如何?

boolean-logic scala optional scalastyle scala-option

5
推荐指数
1
解决办法
277
查看次数