Moteur de règles légères en Javascript

Je suis à la recherche de suggestions pour un moteur de règles légères mis en œuvre en version Javascript.

La raison d'une telle implémentation est de construire une simulation basée sur le navigateur très rapide mais rapide en utilisant un petit ensemble de règles (moins de 20). La simulation prendrait une demi-douzaine de paramètres et exécuterait les règles et afficherait les résultats dans le navigateur sans qu'il soit nécessaire de retourner au serveur. Pensez à une interface utilisateur avec quelques boutons radio, cases à cocher, boîtes de texte et curseurs pour contrôler les paramètres. La simulation serait rapidement ré-exécutée en fonction de tout changement de paramètre.

Caisse le moteur de règles de noels mis en œuvre dans JavaScript pur pour node.js. Il existe une syntaxe assez simple pour les définitions de règles.

J'ai mis en œuvre une version (plus compliquée) de ce que vous décrivez en c #, et réfléchir au code, tout cela serait faisable avec JavaScript. Je suis d'accord avec les commentaires posés que l'écriture de votre propre est une option viable. Il peut être aussi simple ou complexe que vous le souhaitez.

Observations générales pour ce type de moteur de règles (sans ordre particulier):

  1. Les recherches non linéaires sont votre ami. En JavaScript, il serait facile d'utiliser la syntaxe obj[key] = val . Une fois que vous avez déterminé la sortie d'une règle pour un ensemble donné de paramètres, cachez les résultats afin de pouvoir l'utiliser à nouveau sans exécuter la règle à nouveau.

  2. Déterminez si vous devez ou non traiter des combinaisons d'entrées uniques. Par exemple, disons que vous autorisez l'utilisateur à saisir plusieurs noms et à demander des suggestions sur XYZ. En réalité, vous devez maintenant exécuter toutes les règles pour chaque valeur d'entrée. Cela peut être sans importance, simple ou immensément compliqué (imaginez un système de réservation d'hôtel qui prend plusieurs dates, horaires, lieux et critères, et fait des suggestions).

  3. SetTimeout () peut être utilisé pour lisser le comportement de l'interface utilisateur, mais les règles que vous décrivez devraient s'exécuter en quelques millisecondes ou moins, alors faites-vous vous soucier des performances dernières. La performance est moins préoccupante que ce que vous pourriez penser avec un moteur de règles de base.

  4. Les définitions de règles seront plus faciles à manipuler si elles sont des objets (ou même des objets simples).

  5. Ne pas lier les éléments d'IU aux résultats de sortie; C'est-à-dire mettre les résultats de l'exécution de la règle dans une liste d'objets flexible afin que vous puissiez créer n'importe quelle sortie visuelle que vous voulez.

  6. Les messages de sortie personnalisés sont très utiles pour un utilisateur. En d'autres termes, plutôt que de déclencher un message générique lorsqu'une condition est remplie, essayez d'insérer une valeur réelle dans le message de sortie comme "Votre pointage de crédit est seulement 550. Vous avez besoin d'un minimum de 600 pour continuer".

C'est sur le dessus de ma tête. Bonne chance.

Réacteur de règles ( https://github.com/anywhichway/rule-reactor ) est un moteur léger, rapide et expressif de la chaîne de gestion de l'enchaînement vers l'avant, utilisant des composants internes JavaScript, des produits croisés paresseux et des fonctions en tant qu'objets plutôt que Rete. Il peut être utilisé dans le navigateur ou sur le serveur.

C'est un moteur de règle très simple, qui utilise le javascript côté serveur (moteur Rhino de Mozilla) (peut-être que cela vous sera utile) http://jubyrajan.blogspot.com/2010/04/implementing-simple-deterministic-rule.html

J'ai créé un exemple de moteur de règle html / javascript pour un configurateur de produit. Le moteur de règles est basé sur les instructions if then. Les instructions if then seront vérifiées avec un tableau. Ce tableau est rempli de toutes les options possibles chaque fois qu'une option est modifiée. Consultez mon blog pour l'exemple. Lien vers mon blog "Forward chaining javascript rule engine"

Je pense que le "obj [key] = val" est la clé d'un moteur de règles javascript. Jquery aide à gérer javascript.

Veuillez vérifier (JSL) https://www.npmjs.com/package/lib-jsl .

À partir du document de synthèse, JSL est une bibliothèque de programmation logique basée sur JSON destinée à une utilisation intégrée dans les programmes JS. Il utilise JSON comme sa syntaxe ainsi que la méthode E / S, et fournit des rappels dans l'environnement hôte pour l'optimisation des performances.