Domanda

Io sono la progettazione di un sistema di valutazione delle regole che devono gestire un database fatto e certe regole sul database. Attualmente abbiamo un versione modificata di RETE che funziona parzialmente destro con alcuni inconvenienti.

Il problema è che le regole non limita a corrispondenze esatte ma devono anche sostenere la disuguaglianza (come in meno di) e altri tipi di calcoli fuzzy.

Gli esempi, si supponga di avere questo fatti

(Stipendio John 58000) (Stipendio Sara 78000) (Employee John) (Boss Sara) (Sposato Giovanni Sara) (Opere John StackOverflow)

si potrebbe avere una regola che dice:

(Stipendio? W <60000) / \ (Married? W) / \ (Works? W StackOverflow) ==> Qualunque sia

Ovviamente il risultato sarà innescando la regola con una? W valore di "John", ma il modo in cui stiamo facendo ora è di depressione loop ogni elemento nella base infatti che corrisponde al beggining della prima espressione (Stipendio XX ) e poi effettuare il confronto e memorizzare i risultati nel fatto di base è di per sé. Ad esempio, dopo il primo passaggio avrete il seguente elemento aggiunto alla base fatto:

(Stipendio John 58000 <60000)

e una volta che è fatto di eseguire i join sul solito modo RETE. In questo modo ci vuole un sacco di spazio nella base infatti, specialmente perché regola può riferirsi a qualsiasi numero e in modo da avere quei fatti "calcolato" fino a quando la regola è attiva.

D'altra parte è possibile applicare diverse regole con la prima espressione e si può continuare a utilizzare l'algoritmo di corrispondenza standard per innescare le regole.

Qualcuno sa di eventuali modelli, riferimenti o metodi che gestiscono questo tipo di comportamento? I salti usuali, tratta, algoritmo rete solo gestire (per quanto ne so) "esatta" di corrispondenza.

A proposito, questo è C # .NET.

È stato utile?

Soluzione

CLIP ha sostenuto elementi condizionali per tutto il tempo sono stato a conoscenza di esso - almeno 15 anni. Controlla la href="http://www.csie.ntu.edu.tw/~sylee/courses/clips/bpg/node5.4.8.html" rel="nofollow noreferrer"> guida di programmazione di base e questo tutorial per esempi. Potete guardare (o modificare) la fonte clip gratuitamente.

CLIP utilizza la notazione prefisso, così il vostro esempio condizionale potrebbe apparire come:

(defrule fat-boy
    (person-data (name ?name) (weight ?weight))
    (test (> ?weight 100))
=>
    (printout t ?name " weighs " ?weight " kg! " crlf)
)

Altri suggerimenti

Per quanto comprendo il problema, tutte le regole fuzzy dividono valore intero o in virgola mobile intervalli in un numero limitato di intervalli secondari. Per esempio, se uno stipendio è paragonato a 58000, 60000, 78000 valori, si dispone di 4 gamme:. <58000, 58.000-60.000, 60.000-78.000,> 78000

Se questo è il caso, forse è possibile ridefinire le variabili di essere interi che sono o 0,1,2,3, e quindi convertire le regole di disuguaglianza alle leggi di uguaglianza.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top