我正在寻找一个真理表生成器作为个人项目.
(Example screenshot of an existing Truth Table Generator
)
我有以下问题:
任何人都可以向我提供有关解析这些任意表达式并最终评估解析表达式的提示吗?
前言:我没有规则引擎,构建规则,建模规则,实现规则的数据结构等等方面的经验.因此,我不知道我在做什么,或者我在下面尝试的是什么.
我正在试图弄清楚如何存储和处理以下假设情景.为了简化我的问题,假设我有一种用户购买对象的游戏类型,其中可能有1000个可能的对象,并且必须按指定的顺序购买对象,并且只能在特定的组中购买.例如,假设我是用户并且我想购买对象F.在我购买对象F之前,我必须先前购买了对象A OR(B和C).我不能同时购买F和A,也不能购买F和B. 它们必须符合规则指定的顺序.先是,然后是F.或者,首先是B,C,然后是F. 我现在并不关心购买之间的时间跨度,或用户的任何其他特征,只是它们是现在的正确顺序.
为潜在的数千个对象存储此信息的最佳方法是什么,这些对象允许我读取所购买对象的规则,然后根据用户以前的购买历史记录进行检查?
我试过这个,但我一直试图实现A OR(B和C)这样的分组.我想将规则存储在我拥有这些表的数据库中:
Objects
(ID(int),Description(char))
ObjectPurchRules
(ObjectID(int),ReqirementObjectID(int),OperatorRule(char),Sequence(int))
Run Code Online (Sandbox Code Playgroud)
但显然,当您处理结果时,如果没有分组,您将得到错误的答案.如果可能,我想避免过多的字符串解析:).一个对象可能具有未知数量的先前所需购买.用于处理规则的SQL或伪代码片段将不胜感激.:)
在PostgreSQL中有一种更快的方法来基本上在几行中执行if吗?
说我有一张桌子
ticket | row | archived
1 | 1 | true
1 | 2 | true
1 | 3 | true
2 | 1 | false
2 | 2 | true
Run Code Online (Sandbox Code Playgroud)
有没有什么方法可以在ticket =的列下面做一个if语句?因此,ticket = 1的地方是真的
true && true && true = true
Run Code Online (Sandbox Code Playgroud)
并且ticket = 2将是假的,因为
false && true = false
Run Code Online (Sandbox Code Playgroud)
或者我应该坚持下去
SELECT ( (SELECT COUNT(*) FROM table WHERE ticket = 1)
= (SELECT COUNT(*) FROM table WHERE ticket = 1 AND archived = true) )
Run Code Online (Sandbox Code Playgroud) ~ & ^ | + << >>
是我可以使用的唯一操作
在我继续之前,这是一个功课问题,我已经坚持了很长时间.
我原来的方法:我认为!x可以用两个补码完成,并用它的加法逆做一些事情.我知道xor可能在这里,但我真的不知道如何处理这个问题.
为了记录:我也不能使用条件,循环==
等,只能使用上面提到的函数(按位).
例如:
!0 = 1
!1 = 0
!anything besides 0 = 0
Run Code Online (Sandbox Code Playgroud) 有人知道一个简化布尔表达式的算法吗?
我记得布尔代数和Karnaught地图,但这适用于EVERITHING为布尔值的数字硬件.我想要考虑一些子表达式不是布尔值的东西.
例如:
a == 1 && a == 3
Run Code Online (Sandbox Code Playgroud)
这可以转换为纯布尔表达式:
a1 && a3
Run Code Online (Sandbox Code Playgroud)
但这是表达是不可简化的,而对于算术的一点点知识,everibody可以确定表达式只是:
false
Run Code Online (Sandbox Code Playgroud)
有些人知道一些链接?
这是一个有效的表达吗?如果是这样,你能改写它以使它更有意义吗?例如,它是一样的(4 > y && y > 1)
吗?您如何评估链式逻辑运算符?
c++ conditional boolean-logic if-statement logical-operators
C#中的布尔值是1个字节的变量.并且因为bool是Boolean类的快捷方式,我希望覆盖&=,| =操作以使它们使用布尔类型,但我不太确定它.没有像&& =或|| =那样的东西.
这是我的问题,做的事情如下:
bool result = condition;
result &= condition1;
result &= condition2;
Run Code Online (Sandbox Code Playgroud)
会工作,但这只是因为bool将为00000000表示false而00000001表示true或者因为bool类下面会使用类似&& =和|| =的东西来调用前一个?使用以前的符号实际上是安全的还是更好用
bool result = condition;
result = result && condition1;
result = result && condition2;
Run Code Online (Sandbox Code Playgroud)
避免任何奇怪的行为?
请注意,条件可能类似于A> = B或任何其他可能会返回bool的检查.
假设我有一个布尔数组,其中5个bool变量都为真
bool boo[10];
for(int i = 0; i < 5; i++){
boo[i] = true;
}
Run Code Online (Sandbox Code Playgroud)
我希望它们一次比较到一个NAND逻辑门,因为我的问题是如果我总是比较两个变量并将合并的布尔值与i + 1布尔变量进行比较.这给出了错误的结果.
bool NANDGate(bool array[]){
bool at;
for(int i = 1; i < 5; i++){
if(i == 1){
at = !(array[i-1] && array[i]);
}else{
at = !(at && array[i]);
}
}
return at;
}
// result here is true even though it should be false
Run Code Online (Sandbox Code Playgroud)
当我将每个变量从boo放入NAND门时,我想要的是一个正确的结果,所以这可能是这样的:
bool func(bool array[]){
// some loop
result = !(array[0] && array[1] && array[2] && array[3] && array[4]);
return …
Run Code Online (Sandbox Code Playgroud) 如果我有这样的产品总和z*a + z*b + z*c + ... + z*y
,就可以z
在括号之前移动因子,这是相同的:z(a + b + c + ... y)
.
我想知道如果使用按位XOR而不是乘法,可能(如果是)可以做同样的技巧.
z^a + z^b + ... z^y -> z^(a + b + ... + y)
a, b, c ...
在添加之前,或许应该进行预处理,例如逻辑否定或其他内容?z
可能会发生变化,因此如果需要,预处理不应该依赖于特定的z
价值.
c++ boolean-logic multiplication logical-operators boolean-operations
boolean-logic ×10
c++ ×3
boolean ×2
c# ×2
algorithm ×1
c ×1
c++11 ×1
conditional ×1
database ×1
exists ×1
if-statement ×1
math ×1
negation ×1
parsing ×1
postgresql ×1
rule-engine ×1
sql ×1
truthtable ×1