我正在寻找一个重构布尔表达式的工具.我有像这样的表情
a1 => (b1 <=> c or d) AND
a2 => (b2 <=> c or d) AND
a2 => (b2 <=> c or d)
Run Code Online (Sandbox Code Playgroud)
该工具应该能够简化表达式,例如在上面的例子中提取子表达式"c或d".是否有免费的计算机代数系统可以做到这一点?
目前我想手动重构表达式,用一点haskell quickcheck脚本证明等价.
CS中的任何二年级学生应该能够回答什么,但我似乎无法绕过它......
我有一组位,我需要用不同的集替换一些位.在一个简化的例子中:
10101010 - 原始位设置
00001111-显示替换位置的掩码
00001100 - 新的位值
10101100 - 结果位设置
另一个例子:
10101010 - 原始位设置
00110011 -mask
11111111 - 新的比特值
10111011 - 结果位设置
通过迭代比特来做到这一点是微不足道的.
是否可以使用布尔逻辑(AND,OR等)来做到这一点?
在C#(3.5)中,我尝试以下方法:
byte byte1 = 0x00;
byte byte2 = 0x00;
byte byte3 = byte1 & byte2;
Run Code Online (Sandbox Code Playgroud)
我得到错误132:"不能隐式地将类型'int'转换为'byte'.存在显式转换(你是否错过了演员?)".|也是如此 和^.
我究竟做错了什么?为什么要问我关于整数?为什么我不能在字节上做布尔逻辑?
让我们说我有一个与主题有很多关系的文章表.分配给每个文章主题具有type
其可以含有1〜3中的值字段AND
,NOT
和OR
.
Articles
id
....
Topics
id
....
ArticleTopics
article_id
topic_id
type
Run Code Online (Sandbox Code Playgroud)
我想创建一个查询,说明返回所有文章:
ALL of the following topics: 1, 2, 3 (AND association)
AND
ANY of the following topics: 4, 5, 6 (OR association)
AND
NONE of the following topics 7, 8 (NOT association)
Run Code Online (Sandbox Code Playgroud)
如何创建此查询?
提前致谢!
我当前的项目是一个带有布尔检索功能的高级标签数据库.正在使用类似的布尔表达式查询记录(例如在音乐数据库中):
funky-music and not (live or cover)
Run Code Online (Sandbox Code Playgroud)
这应该会产生音乐数据库中所有时髦的音乐,但不能播放歌曲的现场或封面版本.
当涉及到缓存时,问题是存在等同但结构不同的查询.例如,应用de Morgan的规则,上面的查询可以这样写:
funky-music and not live and not cover
Run Code Online (Sandbox Code Playgroud)
例如,当通过散列查询字符串实现缓存时,它将产生完全相同的记录,但会产生中断缓存.
因此,我的第一个目的是创建查询的真值表,然后可以将其用作缓存键,因为等效表达式构成相同的真值表.不幸的是,这是不切实际的,因为真值表随着输入(标签)的数量呈指数增长,我不想限制一个查询中使用的标签数量.
另一种方法可以是遍历语法树,应用由布尔代数定义的规则来形成(最小的)规范化表示,这似乎也很棘手.
因此,整体问题是:是否有一种实用的方法来实现等效查询的识别,而无需电路最小化或真值表(编辑:或任何其他NP难的算法)?
ne plus ultra将识别已经缓存的子查询,但这不是主要目标.
根据代数定律的思考,我想知道在比特操作领域是否存在任何官方指导线,类似于代数.
代数例子
a - b =/= b - a
让我们a = 7
和b = 5
a - b = 2
b - a = -2
让我们a = 10
和b = 3
a - b = 7
b - a = -7
因此if a > b
,b - a
将是负面的等价物a - b
.因此,我们可以说
|a - b| = |b - a|
.
其中|x|
表示绝对值x
.
按位示例
a | b =/= a …
我注意到Python 2.7逻辑表达式的奇怪行为:
>>> 0 and False 0 >>> False and 0 False >>> 1 and False False >>> False and 1 False
并用True代替False
>>> 0 and True 0 >>> True and 0 0 >>> 1 and True True >>> True and 1 1
Python将逻辑语句转换为整数时是否有任何规则?为什么有时会显示0为假,1为真?
更重要的是,为什么会归还这个?
>>>"test" or "test" 'test'
对抗锯齿方法做了一些研究,我偶然发现了这段代码(从Nvidia的FXAA着色器中抓取):
if(!pairN) lumaN = lumaS;
if(!pairN) gradientN = gradientS;
if(!pairN) lengthSign *= -1.0;
Run Code Online (Sandbox Code Playgroud)
是不是有一个很好的理由不是作为以下内容写的?
if (!pairN) {
lumaN = lumaS;
gradientN = gradientS;
lengthSign *= -1.0;
}
Run Code Online (Sandbox Code Playgroud)
我认为这是某种优化?看起来真的违反直觉......
(注意:以下情况仅仅是示例性的.这个问题适用于任何可以评估为bool的事情)
如果用户未提供自定义列表,则应使用默认列表:
default_list = ...
custom_list = ...
if custom_list:
list = custom_list
else:
list = default_list
Run Code Online (Sandbox Code Playgroud)
你可以缩短到:
default_list = ...
custom_list = ...
list = custom_list if custom_list else default_list
Run Code Online (Sandbox Code Playgroud)
现在,根据https://docs.python.org/2.7/reference/expressions.html#or ...
表达式
x or y
首先评估x
; 如果x为真,则返回其值; 否则,将评估y并返回结果值.
...,or
不返回布尔值,而是返回布尔转换不为false的第一个值.因此,以下是有效的代码:
list = custom_list or default_list
Run Code Online (Sandbox Code Playgroud)
这与C#Null Coalescing运算符类似,不同之处在于它应该作为False Coalescing Operator在Python中重新生成,它返回第一个非false参数.
最后一个例子似乎更容易阅读,但它被认为是pythonic?
无论PEP8(程序),也不pylint的不抱怨.
python boolean-logic coding-style conditional-operator language-lawyer
我想解析逻辑字符串并获得"和"逻辑中所有元素的组合.例如,对于字符串'(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但我对其他可能更好的模块开放.
提前致谢.
boolean-logic ×10
python ×3
.net ×1
algorithm ×1
bit ×1
boolean ×1
byte ×1
c# ×1
caching ×1
coding-style ×1
evaluation ×1
glsl ×1
gpu ×1
hlsl ×1
mask ×1
mysql ×1
opengl ×1
proof ×1
pyparsing ×1
python-2.7 ×1
refactoring ×1
traversal ×1