Инференция с использованием NRules - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть вопросы о реализации логического вывода с использованием NRules.

У меня есть следующие вопросы о достижении логического вывода с использованием NRules. Было бы здорово, если бы вы могли предоставить свои входные данные.

Позвольте мне сначала объяснитьсценарий я пытаюсь.Это очень простой, где я создал 2 правила.Первое правило, когда клиент является предпочтительным клиентом, тогда предоставьте скидку 10%.Второе правило: всякий раз, когда применяется скидка, уведомляйте клиента.Здесь я приложил код для примера программы InferenceTest.cs для вашей справки.

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

Теперь вопрос - 1 / Должен ли автор правилапозаботиться о написании условий правила таким образом, чтобы оно не вызывало повторного запуска правила во время выполнения вывода?Это жесткое ограничение?Вероятно, в системе, имеющей большее количество правил, для автора правила может оказаться невозможным рассмотреть все различные правила и затем написать новое правило таким образом, чтобы оно не входило в бесконечный цикл.2 / Является ли установка для тега Repeatability значения false для каждого правила, является наилучшим и рекомендуемым решением в таких сценариях?

public class InferenceTest {
        static void Main(string[] args) {
            //Load rules
            var repository = new NRules.Fluent.RuleRepository();
            repository.Load(x => x.From(typeof(PreferredCustomerDiscountRule).Assembly));

    //Compile rules
    var factory = repository.Compile();

    //Create a working session
    var session = factory.CreateSession();            

    //Load domain model
    var customer = new Customer("John Doe") { IsPreferred = true };

    //Insert facts into rules engine's memory
    session.Insert(customer);            

    //Start match/resolve/act cycle
    session.Fire();

    Console.ReadLine();
}
}

public class PreferredCustomerDiscountRule : Rule {
    public override void Define() {            
        Customer customer = null;            
    When()
        .Match<Customer>(() => customer, c => c.IsPreferred);

    Then()
        .Do(ctx => ApplyDiscount(customer, 10.0))            
        .Do(ctx => ctx.Update(customer));
}

private static void ApplyDiscount(Customer customer, double discount) {
    customer.DiscountPercent = discount;
    Console.WriteLine("Discount applied----", customer.Name);
}
}

public class DiscountNotificationRule : Rule {
    public override void Define() {
        Customer customer = null;

    When()
        .Match<Customer>(() => customer, c => c.DiscountPercent.HasValue);            

    Then()
        .Do(_ => NotifyAboutDiscount(customer));            
}

private static void NotifyAboutDiscount(Customer customer) {
    Console.WriteLine("---Customer {0} has instant discount of {1}%", customer.Name, customer.DiscountPercent);
}
}

public class Customer {
    public string Name { get; private set; }
    public bool IsPreferred { get; set; }
    public Nullable<double> DiscountPercent { get; internal set; }

public Customer(string name) {
    Name = name;
}        
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...