Codice di analisi e analisi del set di regole concatenato: raccomandazioni?

1

Quindi devo scrivere un sistema di filtraggio, che può applicare una serie di regole preelaborate ai dati - e attivare alcune azioni definite nel set di regole continuando la sua valutazione.

<ruleset name="1">
 <rule>
  <conditions>
   <and>
    <or>
     <match image="aceofspades" level="70" />
     <match image="aceofdiamonds" level="66" />
    </or>
    <not>
     <match image="aceofclubs" level="60" />
    </not>
   </and>
  <action name="apply_ruleset" ruleset="2">
 </rule>
 <rule>
  ...
 </rule>
</ruleset>
<ruleset name="2">
</ruleset>

(Un buon esempio di come ci si sente ad essere simili: config di sendmail, alcune configurazioni di Apache, set di regole IPTables, con più tabelle, JOIN / ACCEPT / DROP, ecc.)

Ciò che mi infastidisce di ogni progetto attuale a cui riesco a pensare:

  • mantenendo lo stato di and-or nodes
  • essere in grado di saltare facilmente tra le regole principali e secondarie
  • tracciamento di riferimenti circolari
  • mantenendo un vasto insieme di possibili condizioni
  • velocità di runtime: parsing / hashing potrebbe richiedere del tempo, ma ogni pacchetto di dati deve essere passato attraverso il set di dati il più velocemente possibile.

Che cosa dovrei leggere / pensare per essere sicuro che il mio parser sarà abbastanza carino da lavorare con set di grandi dimensioni e non compromettere troppo la velocità / flessibilità? (per non parlare del codice iptables) .

Il linguaggio di destinazione è C ++ (comunque vorrebbe implementare un sistema simile in Perl più tardi ..), stava leggendo questo - ma ancora non si vede una buona soluzione per cambiare i set di regole / mantenere le logiche booleane all'interno delle regole.

    
posta kagali-san 26.02.2014 - 14:39
fonte

1 risposta

2

Questo è il motivo per cui raccomandavano di prendere la classe di Intelligenza Artificiale.

Negli anni '70 e '80, c'è stata una quantità enorme di lavoro svolto su sistemi basati su regole, principalmente per il lavoro sui sistemi esperti. Ciò includeva enormi quantità di lavoro svolto sui motori delle regole. Una buona parte di questo lavoro ha trovato la sua strada nei libri di testo universitari di intelligenza artificiale.

Dai un'occhiata al manuale di intelligenza artificiale di Winston . Winston & Horn "LISP" ha una buona informazione. Buchanan e Shortliffe "Sistemi esperti basati su regole" dovrebbero avere informazioni utili.

Ora, gran parte di ciò che è là fuori si concentra su LISP. Esistono numerosi interpreti LISP e Scheme di piccole dimensioni che possono essere aggiunti al tuo codice C ++. Se lavori nel Software Libero (come in GPL), GNU GUILE sarebbe un ottimo punto di partenza. C'è anche Tiny Scheme , che è la licenza BSD.

E ci sono CLIPS . Dall'articolo Wikipedia : "CLIPS è probabilmente lo strumento di sistema esperto più ampiamente utilizzato. CLIPS incorpora un linguaggio orientato agli oggetti completo COOL per scrivere sistemi esperti CLIPS stesso è scritto in C, le estensioni possono essere scritte in C e CLIPS può essere chiamato da C. La sua interfaccia utente assomiglia molto a quella del linguaggio di programmazione Lisp. COOL combina i paradigmi di programmazione procedurale, object oriented e linguaggi logici (teorema dimostrativo). "

--- aggiunto più tardi ---

Qualcos'altro che potresti trovare interessante. Don Batory ha fatto un po 'di lavoro 20 anni fa, compilando basi di regole in efficienti C. Era una reimplementazione di alcuni lavori precedenti. Il documento è "Algoritmi LEAPS" . Dal primo paragrafo del documento: "OPS5 è un sistema esperto di catene avanzate [McD78, For81]. LEAPS (Lazy Evaluation Algorithm for Production Systems) è un compilatore di sistema di produzione all'avanguardia per la regola OPS5 set [Mir90] .2 I risultati sperimentali hanno dimostrato che LEAPS produce gli eseguibili sequenziali più veloci delle serie di regole OPS5, i tempi di esecuzione possono essere superiori a due ordini di grandezza rispetto agli interpreti OPS5. Questa fenomenale accelerazione è dovuta al fatto che LEAPS si basa su complesse strutture dati e algoritmi di ricerca per aumentare notevolmente i tassi di attivazione delle regole È risaputo che le strutture e gli algoritmi di dati LEAPS sono difficili da comprendere, in parte dovuti all'incapacità dei concetti di database relazionali (ad esempio, relazioni e select-project-join operatori) per acquisire le funzioni critiche di valutazione lazy degli algoritmi LEAPS. "

    
risposta data 28.02.2014 - 21:51
fonte