Оценщик правил логической логики

По сути, у меня есть опрос, который показан, и люди отвечают на вопросы во многом как тест, и есть разные пути, пока это довольно просто, но я хотел сделать его более динамичным, чтобы у меня было общее правило для теста со всеми путями, чтобы упростить работу оценщику в настоящее время. просто разрешите И, и каждое ИЛИ станет еще одним Правилом в наборе,

QuestionID, затем я формирую кучу правил И вот так

<rule id = "1">
<true>
 <question ID=123>
 <question ID=124>
</true>
<false>
 <question ID=127>
 <question ID=128>
</false>
</rule>
<rule id = "2"><true>
 <question ID=123>
 <question ID=125>
</true>
<false>
 <question ID=127>
</false>
</rule>

это правило 1 гласит, что если на вопросы 123 и 124 даны верные ответы, а на вопросы 127, 128 - ложные, они проходят. ИЛИ (правило 2): если 123 и 125 истинны, а 127 - ложно, они также проходят. Это становится утомительным, если есть много комбинаций, поэтому я хочу реализовать OR в логике, я просто не уверен, какой лучший подход для этой проблемы.

Я думаю, что механизм правил слишком сложен, должен быть более простой способ, возможно, построить график, как в LINQ, а затем оценить, проходят ли они,

Благодарность!

- не дипломированный специалист.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
2 207
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Это не должно быть сложно: вы уже прошли большую часть пути, поскольку ваши элементы и эффективно реализуют правило типа AND. Я бы представил элемент, который может содержать элементы и.

В вашем случае вы могли бы иметь:

  • Класс RuleBase с методом «public abstract bool Evaluate ()»
  • Классы TrueRule, FalseRule и OrRule, которые содержат списки объектов RuleBase
  • Класс QuestionRule, который относится к конкретному вопросу

Вы должны реализовать метод Evaluate для каждого из них следующим образом:

  • TrueRule: возвращает истину, только если все содержащиеся правила возвращают истину из Evaluate
  • FalseRule: возвращает true, только если все содержащиеся правила возвращают false из Evaluate
  • OrRule: возвращает истину, если хотя бы одно из содержащихся правил возвращает истину из Evaluate
  • Вопрос Правило: возвращает ответ на исходный вопрос

Эта иерархия классов реализует простое абстрактное синтаксическое дерево (AST). LINQ в форме класса System.Expressions.Expression делает примерно то же самое, но полезно написать свой собственный, если не очевидно, как все сочетается друг с другом.

Я не уверен, что полностью понимаю проблему, которую вы пытаетесь решить, но вы можете использовать простой XPath для получения идентификатора:

Это даст вам все "истинные" идентификаторы, где идентификатор правила = 1: / rule [@ id = "1"] / true // @ ID

То же, что и выше, только дает вам ложные идентификаторы: / rule [@ id = "1"] / false // @ ID

Наконец, ссылка на введение в XPath в .NET. http://www.developer.com/xml/article.php/3383961

Удачи

Я бы посоветовал дать ответы на вопросы, а не использовать true и false для группировки вопросов. Я думаю, что это упрощает чтение XML, что является спорным вопросом. Что не подлежит обсуждению, так это то, что он позволяет оценивать элемент question независимо, то есть без какого-либо знания контекста, в котором вы пытаетесь его оценить. Это упрощает код.

Я бы также взял страницу из XML-схемы и реализовал вашу логику OR как элемент choice. Элемент choice истинен, если любой из его дочерних элементов истинен. Вы можете, конечно, вложить их:

<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 GetProvidedAnswer(int questionID)
  • bool IsQuestionCorrect(XmlElement question)
  • bool IsChoiceCorrect(XmlElement choice)
  • bool IsRuleSatisfied(XmlElement rule)

Структура XML упрощает реализацию этих методов:

 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;
}

Возможно, стоит добавить List<XmlElement> в параметры методов IsFooCorrect. (Если механизм правил находится в классе, вы можете сделать его полем класса.) Сделайте так, чтобы все методы добавляли текущий элемент в список, если ответ неправильный. Затем вы можете изучить содержимое этого списка, чтобы точно узнать, почему правило не сработало.

Если вы используете правильный механизм правил, поддерживающий логический вывод, он будет более эффективным и расширяемым.

Взгляните на http://www.flexrule.com, который представляет собой гибкий, расширяемый механизм правил, поддерживающий три типа правил. Процедурные правила, правила вывода и правила потока могут быть выведены из вашего приложения и выполняться с использованием этой структуры.

Вы могли бы немного подробнее рассказать на каком-нибудь примере кода.

Devraj Gadhavi 24.11.2012 15:26

Другие вопросы по теме