Je développe un moteur d'inférence, ce qui signifie que j'ai un certain nombre de "faits" qui sont fondamentalement la représentation du monde à un certain moment. Avec les faits (qui sont généralement seulement deux, l'état de départ et l'état d'objectif), j'ai beaucoup de règles (pourrait littéralement être des centaines pour certains problèmes). Le but du moteur d'inférence est, étant donné un état de départ et un ensemble de règles, de trouver le chemin le plus court vers l'un des états de but acceptables. Cela peut être fait avec plusieurs algorithmes comme DFS, BFS ou A *. La structure de base du programme est:Substitution de variable dans la correspondance de modèle?
fact factname attribute1 = "value"; attribute2 = [ 1, 2, 3]; attribute3 = 4; attribute4 = 7; ... endFact rule ruleOne equalsto(attribute, "value") or greaterthan(attribute, 5) > remove(attribute); endRule rule ruleTwo isprimeinteger(attribute) > add(attribute, 1) endRule
Dans la règle, le LHS (la partie avant la>) correspond chaque attribut dans le fait factname
qui est égale à la « valeur ». Dans ce cas, c'est seulement un, mais il peut y en avoir beaucoup. Cela signifie que je dois résoudre des variables (souvent plusieurs fois pour le même fait), et que le LHS de la règle peut avoir plusieurs conditions entrées et/ou avec une analyse de priorité appropriée.
Le problème est: existe-t-il un moyen de résoudre ce type de variables efficacement? Ce que je fais maintenant, c'est d'itérer sur chaque attribut dans le fait et, en gros, je génère un assez grand arbre n-aire qui est même déséquilibré, et c'est TRÈS lent, surtout étant donné les conditions ci-dessus.
J'avais des pointeurs d'amour des papiers pour ce genre de motif correspondant à
Pouvez-vous expliquer votre problème un peu plus précis? J'ai du mal à le comprendre. Comment obtenez-vous les états qui peuvent être atteints d'un état donné? Que voulez-vous dire par variables? (Je ne vois que 'attribut', qui semble être une variable très spéciale Y en a-t-il d'autres?) Je ne peux pas détecter de correspondance (ou d'unification) et ne pas voir la pertinence du système expert des balises 'et' C++ '. Enfin, DFS ne semble pas être un excellent choix si vous voulez un chemin le plus court. – mweerden