Je travaille sur un système de traitement d'événements complexes. Il prend en charge le filtrage des ensembles d'enregistrements en fonction des membres de ces enregistrements, en utilisant un langage de requête. Le langage prend en charge les opérateurs logiques, arithmétiques et définis par l'utilisateur sur des membres arbitraires.Comment combiner et optimiser un prédicat, en général?
Voici un exemple d'une requête pris en charge:
(MemberA > MemberB) &&
(@in MemberC { "str1", "str2" }) &&
(com.foo.Bar.myPred(MemberD, MemberE))
Mon problème est que je veux combiner les requêtes dans une super requête, puis je veux optimiser cette super-requête pour éliminer les redondances, les tautologies et les contradictions. par exemple. Je veux prendre
A > 0
et le combiner avec
A > 1
qui est assez facile:
A > 0 || A > 1
mais je veux optimiser afin qu'il réduit à
A > 0
S'il existe des URL ou des livres sur ce disque utilise ce sujet général, j'apprécierais savoir à leur sujet.
Merci Pavel. Mon sentiment était que la solution entièrement optimale serait intraitable, mais qu'il devrait être possible de faire quelques optimisations raisonnables dans une période de temps limitée. Les SMT ont l'air intéressants, merci de les signaler, mais j'ai du mal à comprendre cette phrase à partir de votre réponse: "Alors ils peuvent, par exemple, raisonner si (oui, deux conjonctions égales) si un prédicat en implique un autre est une tautologie ", Pouvez-vous clarifier s'il vous plait? –
@Bill: Clarification. Dans votre exemple, vous deviez ignorer le prédicat 'A> 1' car il était impliqué par' A> 0'. C'est à dire. dans tous les cas où 'A> 1' est vrai,' A> 0' est vrai aussi (cela s'appelle "implication"). Étant donné que votre solveur SMT a les axiomes arithmétiques formels téléchargés, il peut raisonner que la formule '(A> 0) implique (A> 1)' est une tautologie. Après ce raisonnement, vous pouvez retirer 'A> 0' de votre expression. Mais ce n'est qu'une des nombreuses applications des solveurs SMT et je l'ai décrite simplement parce que vous l'avez utilisée dans votre question. –
D'accord, c'est logique, merci Pavel. –