Convalida delle combinazioni in base a serie di regole (o meccanismo simile)

0

Diciamo che ho molte funzioni e ogni funzione accetta una lista non ordinata (l'ordine non ha importanza). Per ogni funzione voglio vedere se questo elenco è valido in base a determinate regole (una knowledgebase che ha le regole per l'elenco di ciascuna funzione).

Ciascuno di questi elenchi è al centro di una combinazione, giusto? E ogni combinazione può essere:

  1. accettabile
  2. Non valido a causa di un determinato elemento che non è accettabile
  3. Non valido a causa di alcune combinazioni non accettabili (diciamo che permetto [1, 2] e [1, 3] ma [2, 3] non è accettabile)

Sto cercando di trovare un modo per:

  1. Ogni set di regole / possibilità in una base di conoscenza, che può essere aggiornato ogni volta che voglio (magari leggendo da un file? In realtà preferirei una DSL per scrivere le regole, se possibile) e può essere caricato a avvio

  2. Un modo per convalidare queste regole / possibilità in modo intelligente ed elegante e non ricorrere a nidificato se altro e così.

Esempio

fun_1([a, b, c]) :
  check_knowledgebase([a, b, c]) # => valid

fun_1([a, b, d]):
  check_knowledgebase([a, b, d]) # => element d is invalid

fun_1([a, c, d]):
  check_knowledgebase([a, c, d]) # => combining c with d is invalid

Ci stavo pensando, ma non so quale tipo di teoria o algoritmi dovrei esaminare per questo. Ho pensato a Rule Engine, ma implementarne uno richiederebbe troppo tempo per qualcosa di così piccolo?

EDIT: Non sto cercando esattamente una soluzione specifica per la lingua, voglio una soluzione che sia essenzialmente indipendente dal linguaggio.

    
posta combham 15.10.2016 - 00:09
fonte

1 risposta

0

Lingue orientate agli oggetti

È estremamente semplice scrivere un semplice motore di regole in un linguaggio orientato agli oggetti, usando il seguente schema:

Laknowledgebaseèuncontenitore(adesempiounelenco)diregoleeRuleEnginefungedacontrolloredellaknowledgebase,cheapplicatutteleregolealsuoinput.

Inquestocostruttopotrestiricavareunanuovaclasseperogninuovotipodiregole.Perevitareun'esplosioneinutiledelleclassidiregole,potrestiancheconsiderarel'usodiregoleparametrizzate,ades.RuleForbidElement('D')anzichéRuleForbidD.

Potrestisalvarequesteregoleocaricarequesteregoledaunfileconleconsuetetecnichediserializzazione.

Aproposito,riconosceraiquiunaversionesemplificatadel modello di interprete con solo nodi terminali.

Lingue funzionali

Se il concetto di classe nella tua lingua supporta il polimorfismo, potresti benissimo applicare lo stesso design di cui sopra.

Tuttavia, potresti anche pensare alla variazione ( calcolo lambda ):

  • ogni regola sarebbe una funzione che prende una lista in input e restituisce un booleano in output.
  • una knowledge base kb sarebbe una lista di funzioni
  • il motore di regole dovrebbe scorrere l'elenco per applicare ogni funzione al suo input e combinare tutte le uscite. Una possibile implementazione potrebbe essere una funzione ricorsiva re(x, kb) che restituisce true se kb è vuota oppure (head(kb))(x) AND re(x,tail(kb)) , dove head() è il primo elemento di una lista e tail() è la lista senza il suo primo elemento (ad es. hd / tl in caml o car / cdr in lisp)

Ogni regola è una funzione distinta, quindi è molto flessibile scriverle e aggiungerne di nuove.

Si noti che le classi parametrizzate nella progettazione orientata agli oggetti verranno sostituite qui da funzioni che accettano alcuni parametri per restituire una funzione che può essere applicata a una lista per restituire un valore booleano.

    
risposta data 15.10.2016 - 00:44
fonte