Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 布尔逻辑规则计算器_C#_Xml_Logic_Boolean_Rule Engine - Fatal编程技术网

C# 布尔逻辑规则计算器

C# 布尔逻辑规则计算器,c#,xml,logic,boolean,rule-engine,C#,Xml,Logic,Boolean,Rule Engine,我有一个调查,人们回答的问题很像考试, 有不同的路径,到目前为止非常简单,但我想让它更具动态性,这样我就可以有一个通用规则,用于所有路径的测试,使计算器更容易使用,目前我只允许和,每个或基本上成为集合中的另一个规则 问题ID,然后我形成了一系列的规则 这条规则1说,如果问题123和124的答案为真,而127和128的答案为假,则通过。或者(规则2)是如果123和125为真,127为假,它们也通过。 如果有很多组合,这会变得单调乏味,所以我想实现或在逻辑中,我只是不确定解决这个问题的最佳方法是

我有一个调查,人们回答的问题很像考试, 有不同的路径,到目前为止非常简单,但我想让它更具动态性,这样我就可以有一个通用规则,用于所有路径的测试,使计算器更容易使用,目前我只允许和,每个或基本上成为集合中的另一个规则

问题ID,然后我形成了一系列的规则

这条规则1说,如果问题123和124的答案为真,而127和128的答案为假,则通过。或者(规则2)是如果123和125为真,127为假,它们也通过。 如果有很多组合,这会变得单调乏味,所以我想实现或在逻辑中,我只是不确定解决这个问题的最佳方法是什么

我认为规则引擎太复杂了,必须有一个更简单的方法,也许像LINQ一样构造一个图,然后评估它们是否通过

谢谢


--不是compsci专业。

这不必复杂:您已经完成了大部分工作,因为您的and元素有效地实现了and类型规则。我将介绍一个可以容纳和元素的元素

在你的能力范围内,你可以:

  • 一个规则基类,带有“public abstract bool Evaluate()”方法
  • TrueRule、FalseRule和OrRule类,它们包含规则库对象的列表
  • QuestionRule类,它引用特定的问题
您将对其中的每一项实施评估方法,如下所示:

  • TrueRule:仅当包含的所有规则从Evaluate返回true时,才会返回true
  • FalseRule:仅当包含的所有规则从Evaluate返回false时,才会返回true
  • OrRule:如果包含的规则中至少有一个从Evaluate返回true,则返回true
  • 问题规则:返回原始问题的答案

这个类层次结构实现了一个简单的抽象语法树(AST)。LINQ,以System.Expressions.Expression类的形式,做了几乎相同的事情,但是如果不清楚所有东西是如何组合在一起的,那么编写自己的LINQ是很有帮助的。

我不确定我是否完全理解您试图解决的问题,但是您可以使用简单的XPath来获取ID:

这将为您提供规则ID=1的所有“true”ID: /规则[@id=“1”]/true/@id

与上面相同,只是它提供了假ID: /规则[@id=“1”]/false/@id

最后是指向.NET中XPath简介的链接


祝你好运

我建议把答案放在问题上,而不是用
true
false
来分组问题。我认为它使XML更易于阅读,这是有争议的。毋庸置疑的是,它使独立评估
问题
元素成为可能,也就是说,不知道您试图评估它的上下文。这使得代码更简单

我还将从XML模式中获取一个页面,并将OR逻辑实现为
选项
元素。如果某个
选项的子元素为true,则该元素为true。当然,您可以嵌套它们:

<rule id="1">
   <question id="123" answer="true" />
   <question id="124" answer="false" />
   <choice id="1">
      <question id="125" answer='true' />
      <choice id="2">
         <question id="126" answer='false' />
         <question id="127" answer='false' />
      </choice>
   </choice>
</rule>

isfoocrect
方法的参数中添加
列表
可能是值得的。(如果规则引擎在类中,则可以将其设置为类字段。)make`当答案错误时,所有方法都会将当前元素添加到列表中。然后,您可以检查该列表的内容,以确切了解规则失败的原因。

如果您使用支持推断的适当规则引擎,它将更加高效和可扩展


看看哪一个是灵活的、可扩展的规则引擎,它支持三种类型的规则。过程、推理和规则流规则可以从应用程序中外部化,并使用此框架执行。

您可以通过一些代码示例进行详细说明。
<rule id="1">
   <question id="123" answer="true" />
   <question id="124" answer="false" />
   <choice id="1">
      <question id="125" answer='true' />
      <choice id="2">
         <question id="126" answer='false' />
         <question id="127" answer='false' />
      </choice>
   </choice>
</rule>
 bool IsRuleSatisfied(XmlElement rule)
 {
    bool satisfied = true;
    foreach (XmlElement child in rule.SelectNodes("*"))
    {
       if (child.Name == "question")
       {
          satisfied = satisfied && IsQuestionCorrect(child);
       }
       if (child.Name == "choice")
       {
          satisfed = satisfied && IsChoiceCorrect(child);
       }
       if (!satisfied)
       {
          return false;
       }
   }
   return true;
}