标签: logic

在.NET中寻找简单的规则引擎库

有谁知道一个好的.NET库规则库(理想情况下是开源的)?我需要的东西,可以做嵌套的逻辑表达式,如(A和B)和(B或C或d).我需要对对象属性进行比较,例如A.P1和B.P1.(理想情况下,我可以比较任何属性 - A.P1和B.P2).

它应该将规则存储在数据库中(我有很多简单的可配置逻辑).它应该有一个规则创建/管理API.管理工具必须检查实例以确定哪些属性可用以及存在哪些约束.

谢谢!


哦,还有一件事.作为规则引擎,我需要包含Actions(Commands)的概念.这些是表达式返回时执行的操作:

If (expression.Evaluation) { actions.Execute(); }
Run Code Online (Sandbox Code Playgroud)

所以我看到一条规则如下:

class Rule
{
    Expression Exp;
    Actions[] Actions;
    Run() 
    { 
        if(Exp.Evaluate()) 
        { 
            foreach(action in Actions) 
            { 
                action.Execute(); 
            }
        } 
    }
}
Run Code Online (Sandbox Code Playgroud)

.net c# logic rule-engine .net-core

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

简化SQL语句的一般规则

我正在寻找一些"推理规则"(类似于设置操作规则或逻辑规则),我可以用它来减少复杂或大小的SQL查询.有没有这样的东西?任何文件,任何工具?您自己找到的任何等价物?它在某种程度上类似于查询优化,但不是在性能方面.

说明不同:使用JOIN,SUBSELECTs,UNIONs(复杂)查询是否可以(或不)通过使用某些转换规则将其减少为更简单的等效SQL语句,从而产生相同的结果?

因此,我正在寻找SQL语句的等效转换,例如大多数SUBSELECT可以重写为JOIN的事实.

sql complexity-theory logic reduction

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

为什么javascript在if语句中接受逗号?

我偶然发现了一些javascript语法似乎应该产生某种类型的解析错误但不会:

if (true, true) {console.log('splendid')} else {console.log('horrid')} // splendid
if (true, false) {console.log('splendid')} else {console.log('horrid')} // horrid
Run Code Online (Sandbox Code Playgroud)

虽然所有表达式都被执行,但似乎只有最后一个表达式会影响逻辑:

if  (console.log('super'), true) {console.log('splendid')} // super splendid
Run Code Online (Sandbox Code Playgroud)

任何人都知道为什么这是有效的JavaScript语法?它有什么实际用途吗?

javascript logic parsing

62
推荐指数
4
解决办法
2万
查看次数

在Java中,布尔的"操作顺序"是什么?

我们来看一个对象的简单例子Cat.我想确定"not null" cat是橙色还是灰色.

if(cat != null && cat.getColor() == "orange" || cat.getColor() == "grey") {
//do stuff
}
Run Code Online (Sandbox Code Playgroud)

我相信AND先来,然后是OR.我有点模糊,所以这是我的问题:

  1. 有人可以引导我完成这个陈述,所以我确定我会得到什么?

  2. 另外,如果我添加括号会发生什么; 这会改变运营的顺序吗?

  3. 我的操作顺序会因语言而异吗?

java evaluation logic boolean operator-precedence

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

高阶统一

我正在研究一个高阶定理证明器,其中统一似乎是最困难的子问题.

如果Huet的算法仍然被认为是最先进的,那么是否有任何人有任何与其解释的链接,这些解释是由程序员而不是数学家所理解的?

或者甚至是它的工作原理和通常的一阶算法的例子都没有?

algorithm logic artificial-intelligence unification

53
推荐指数
4
解决办法
4224
查看次数

库里 - 霍华德同构

我在互联网上搜索过,我找不到任何关于CHI的解释,这些解释不会迅速退化为逻辑理论的讲座,而这个讲座已经在我脑海中浮现.(这些人说话就好像"直觉主义命题演算"这个短语实际上对正常人来说意味着什么!)

粗略地说,CHI说类型是定理,程序是那些定理的证明.但到底是什么意思呢

到目前为止,我已经想到了这一点:

  • 考虑id :: x -> x.它的类型说"鉴于X是真的,我们可以断定X是真的".对我来说似乎是一个合理的定理.

  • 现在考虑foo :: x -> y.正如任何Haskell程序员都会告诉你的那样,这是不可能的.你不能写这个功能.(好吧,无论如何都没有作弊.)作为一个定理,它说"假设任何X都是真的,我们可以得出结论,任何Y都是真的".这显然是胡说八道.而且,果然,你不能写这个功能.

  • 更一般地,函数的参数可以被认为是"假设为真的",并且结果类型可以被认为是"假设所有其他事物都是真的".如果有一个函数参数,比如说x -> y,我们可以假设X为真意味着Y必须为真.

  • 例如,(.) :: (y -> z) -> (x -> y) -> x -> z可以假设"假设Y暗示Z,X暗示Y,并且X为真,我们可以断定Z为真".这对我来说在逻辑上是合理的.

现在,到底是什么Int -> Int意思?O_O

我能想出的唯一明智的答案是:如果你有一个函数X - > Y - > Z,那么类型签名会说"假设可以构造一个X类型的值,另一个类型为Y,那么可以构造Z"类型的值.函数体将准确描述您将如何执行此操作.

这似乎有道理,但它不是很有趣.显然,它必须比这更多......

logic haskell types curry-howard

49
推荐指数
1
解决办法
7789
查看次数

为什么IQueryable.All()在空集合上返回true?

所以我遇到了今天的情况,其中一些生产代码正在失败,因为一个方法完全按照MSDN中的说明执行.因为没有阅读文档而感到羞耻.然而,我仍然在摸索为什么它会以这种方式行事,即使是"按设计",因为这种行为正好与我预期的(和其他已知行为)相反,因此似乎违反了原则最不惊讶的.

All()方法允许您提供谓词(例如lambda表达式)来测试IQueryable,返回一个布尔值,指示所有集合成员是否与测试匹配.到现在为止还挺好.这就是它变得奇怪的地方. 如果集合为空,All()也会返回true.由于以下原因,这似乎完全落后于我:

  • 如果集合为空,那么这样的测试充其量是未定义的.如果我的车道是空的,我不能断言停在那里的所有车都是红色的.有了这种行为,在空车道上停放的所有车辆都是红色和蓝色和棋盘 - 所有这些表达式都将返回true.
  • 对于熟悉SQL概念的人来说,NULL!= NULL,这是意外的行为.
  • Any()方法按预期行为,并且(正确)返回false,因为它没有任何与谓词匹配的成员.

所以我的问题是,为什么All()这样做?它解决了什么问题?这是否违反了最不惊讶的原则?

我将此问题标记为.NET 3.5,但该行为也适用于.NET 4.0.

编辑 好的,所以我掌握了这个逻辑方面,正如杰森和你们其他人所做的那样.不可否认,空集合是一种边缘情况.我想我的问题根植于斗争,只是因为某些东西是合乎逻辑的并不意味着如果你没有处于正确的思维框架中,它必然是有道理的.

.net linq logic

48
推荐指数
4
解决办法
5218
查看次数

哪个逻辑运算符优先

所以,我正在考虑在if-else语句中用逻辑运算符编写稍微复杂的操作.我知道我可以做括号,我知道这是更好的方法,但我已经好奇了,所以我会问.如果我做这样的事情:

if (firstRun == true || selectedCategory != undefined && selectedState != undefined) {
//Do something
} else {
//Do something else
}
Run Code Online (Sandbox Code Playgroud)

如何在不使用括号的情况下进行操作?我知道逻辑运算符有一个操作顺序,类似于PEMDAS,对吗?我很好奇它是否会像这样运行:

firstRun == true || (selectedCategory != undefined && selectedState != undefined)
Run Code Online (Sandbox Code Playgroud)

或者,如果'OR'运算符优先,它最终会像:

(firstRun == true || selectedCategory != undefined) && selectedState != undefined
Run Code Online (Sandbox Code Playgroud)

如果你能在某个地方找到完整列表,那么这个操作的顺序就会很好.谢谢!

javascript logic if-statement operator-precedence

48
推荐指数
3
解决办法
2万
查看次数

剪辑数字最有效/优雅的方式?

给定一个实数(n),这个实数可以是(上)的最大值,这个实数可以是(更低)的最小值,我们怎样才能最有效地剪切n,使它保持在低位和高位之间?

当然,使用一堆if语句可以做到这一点,但那很无聊!更紧凑,优雅/有趣的解决方案呢?

我自己的快速尝试(C/C++):

float clip( float n, float lower, float upper )
{
    n = ( n > lower ) * n + !( n > lower ) * lower;
    return ( n < upper ) * n + !( n < upper ) * upper;
}
Run Code Online (Sandbox Code Playgroud)

我确信还有其他更好的方法可以做到这一点,这就是为什么我把它放在那里......!

c++ algorithm math logic

47
推荐指数
7
解决办法
6万
查看次数

Django基于添加表单编辑表单?

我已经制作了一个很好的表格,并且有一个很复杂的"添加"功能来处理它.它像这样开始......

def add(req):
    if req.method == 'POST':
        form = ArticleForm(req.POST)
        if form.is_valid():
            article = form.save(commit=False)
            article.author = req.user
            # more processing ...
Run Code Online (Sandbox Code Playgroud)

现在我真的不想复制方法中的所有功能edit(),所以我想edit可以使用完全相同的模板,也许只是id在表单中添加一个字段,以便add函数知道它正在编辑什么.但是这有几个问题

  1. article.id在哪里设置add功能?它必须是form.save因为那是文章创建的地方,但它甚至永远不会达到,因为由于唯一约束,表单无效(除非用户编辑了所有内容).我可以删除is_valid支票,但后来form.save失败了.
  2. 如果形式实际上无效的,我在编辑功能动态添加字段不会被保留.

那么我该如何处理呢?

python forms django logic

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