标签: boolean-logic

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

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

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

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

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

优化布尔逻辑树评估

我有很多真/假结果保存为long[]数组中的位.我确实拥有大量的这些(数百万和数百万的长).

例如,假设我只有五个结果,我会:

+----- condition 5 is true
|
|+---- condition 4 is false
||
||+--- condition 3 is true
|||
|||+-- condition 2 is true
||||
||||+- condition 1 is false
10110
Run Code Online (Sandbox Code Playgroud)

我也有一些树代表如下的语句:

condition1 AND (condition2 OR (condition3 AND condition 4))
Run Code Online (Sandbox Code Playgroud)

树很简单但很长.他们基本上看起来像这样(下面是过于简单化,只是为了表明我得到了什么):

class Node {    
    int operator();
    List<Node> nodes;
    int conditionNumber();    
}
Run Code Online (Sandbox Code Playgroud)

基本上,Node是一个叶子,然后有一个条件号(匹配long []数组中的一个位)或者Node不是叶子,因此引用了几个子节点.

它们很简单,但它们允许表达复杂的布尔表达式.它很棒.

到目前为止一切都很好,一切都很好.但是我确实有一个问题:我需要评估很多表达式,确定它们是真还是假.基本上我需要对一个问题进行一些暴力计算,而这个问题除了暴力破解之外还没有比这更好的解决方案.

所以我需要走树然后回答,true或者false取决于树的内容和内容long[].

我需要优化的方法如下所示:

boolean solve( Node node, long[] trueorfalse ) {
   ...
}
Run Code Online (Sandbox Code Playgroud)

在第一次调用时,它node …

java optimization boolean-logic bytecode-manipulation

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

无法弄清楚C程序中的逻辑错误

一个程序,每行打印一个输入的单词.

int main() {

    int c;

    while ((c=getchar()) != EOF) {

        if (c== ' ' || c== '\n' ||c == '\t')
                putchar('\n');
        else {
            putchar(c);
        }
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

上面的程序正确打印结果,每行一个字.在相应地改变条件之后,我期望下面的程序也每行打印一个单词.但是我没有得到正确的结果.我犯了一些愚蠢的错误还是错了?

int main() {

    int c;

    while ((c=getchar()) != EOF) {

        if (c != ' ' || c != '\n' || c != '\t')
            putchar(c);
        else {
            putchar('\n');
        }
    }

    return 0;

}
Run Code Online (Sandbox Code Playgroud)

c logic boolean-logic boolean-expression

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

仅使用AND布尔运算转换函数

我有一些功能

(A and ( B or c)) or (D and E and (F or H or R or P )))
Run Code Online (Sandbox Code Playgroud)

并且我想将该函数转换为仅与函数一起运行(当然,如果可能的话)我发现使用DeMorgan的定律可以进行某种转换,但我没有设法将这个函数转换为任何想法?

我知道那个功能

!(A or B) is equal to function !A and !B
Run Code Online (Sandbox Code Playgroud)

但是我找不到与上面相同的功能

logic boolean-logic boolean boolean-expression boolean-operations

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

Bash脚本对于两个但是相反的字符串测试都返回true

在我运行我输入的脚本之前

# export CPIC_MAX_CONV=500
Run Code Online (Sandbox Code Playgroud)

以下是test1.script文件

#!/bin/bash

function cpic () {
  var="`export | grep -i "CPIC_MAX_CONV" | awk '/CPIC_MAX_CONV/ { print $NF } '`"
  [[ $var=="" ]] && (echo "Empty String <<")
  [[ $var!="" ]] && (echo "$CPIC_MAX_CONV")
  echo "$var" ;
}

cpic
Run Code Online (Sandbox Code Playgroud)

输出是:

# test1.script  ---- Me running the file

Empty String <<
500
CPIC_MAX_CONV="500"
Run Code Online (Sandbox Code Playgroud)

无论我使用什么""或""或[或[结果是相同的.该CPIC_MAX_CONV变量由上述脚本找到.

我在Linux/CentOS 6.3上运行它.

这个想法很简单:找到是否CPIC_MAX_CONV在环境中定义并返回它的值.如果有空的空间,那么当然系统中不存在变量.

linux bash ubuntu boolean-logic centos

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

5
推荐指数
3
解决办法
6657
查看次数

快速算法来求积的布尔值之和

我正在尝试实现一个非常非常快的布尔表达式引擎。我使用它来表示非常大的状态空间中的状态,因此我需要它每秒处理尽可能多的操作。该引擎的根本是产品的总和。我遇到了一个优化NOT运算符的问题。例如,如果我有一个带有N个小项的乘积之和,每个小项都有大约M个变量,则尝试求反,将创建M ^ N个小项,然后使用espresso算法对其进行简化。如果在逆操作期间间歇运行espresso算法,则可以加快速度并节省一些内存,但这还不够。我怀疑自己是第一个遇到此问题的人,并且我尝试进行研究,但似乎找不到有效的方法来解决此问题。

有人能指出我正确的方向吗?

algorithm boolean-logic inverse

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

如果所有N个变量都不同,则测试Python

我目前正在做一个程序,我已经搜索过但我找不到解决方案; 我的问题是我想要制作一个条件,其中所有选择的变量都不相等,我可以这样做,但只有长行的文本,有更简单的方法吗?到目前为止我的解决方案是:

if A!=B and A!=C and B!=C:
Run Code Online (Sandbox Code Playgroud)

但我想为几组五个变量做这件事,而且很多人都很困惑.我该怎么做才能让它变得更简单?

python boolean-logic idiomatic logical-operators

5
推荐指数
2
解决办法
1753
查看次数

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
查看次数

PostgreSQL是否会短路其BOOL_OR()评估?

EXISTSCOUNT(*)它可以短路更快

很多时候,我喜欢检查SQL中存在的东西.例如,我这样做:

-- PostgreSQL syntax, SQL standard syntax:
SELECT EXISTS (SELECT .. FROM some_table WHERE some_boolean_expression)

-- Oracle syntax
SELECT CASE 
  WHEN EXISTS (SELECT .. FROM some_table WHERE some_boolean_expression) THEN 1 
  ELSE 0 
END
FROM dual
Run Code Online (Sandbox Code Playgroud)

在大多数数据库中,EXISTS"短路",即一旦找到一行,数据库就可以停止在表中查找行.这通常比比较快得多,COUNT(*) >= 1正如本博文中所见.

使用EXISTSGROUP BY

有时,我想在GROUP BY查询中为每个组执行此操作,即我想"聚合"存在值.没有EXISTS聚合函数,但PostgreSQL幸运地支持BOOL_OR()聚合函数,就像在这个语句中一样:

SELECT something, bool_or (some_boolean_expression)
FROM some_table
GROUP BY something
Run Code Online (Sandbox Code Playgroud)

COUNT(*)由于计算计数所需的明显顺序扫描,文档提到了一些缓慢的问题.但不幸的是,它并没有说明BOOL_OR()被短路的事情.是这样的吗?BOOL_OR()一旦遇到第一个TRUE …

sql postgresql boolean-logic exists boolean-expression

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