Domanda

Voglio fare un programma in video che genera tutte le partizioni di un numero. Prima di tutto mi metto con il numero come la sua partizione di base: (1 1 1 1 1) se è il numero 5, ecc

(deftemplate partition (multislot p) )
(deffacts facts (p 1 1 1 1 1) )
(defrule adds
    (p $?a ?b ?c $?d)
    (not (p $?a (+ ?b ?c) $?d))
    (not (p (+ ?b ?c) $?a $?d))
    (not (p $?a $?d (+ ?b ?c)))
=>  (assert (p $?a (+ ?b ?c) $?d)) 
)

Il problema è che, anche se il codice sembra bene, ha gli errori sulle linee con "non" - dove Preciso che la nuova partizione creata non deve esistere già nei fatti. Non so qual è il problema, ogni idea è il benvenuto. Grazie

È stato utile?

Soluzione

Nella condizione di parte di una regola, è necessario utilizzare l'operatore = per valutare un'espressione e determinare che corrisponda un valore nel fatto:

(defrule adds
   (p $?a ?b ?c $?d)

   (not (p $?a =(+ ?b ?c) $?d))

   (not (p =(+ ?b ?c) $?a $?d))

   (not (p $?a $?d =(+ ?b ?c)))

   => 

   (assert (p $?a (+ ?b ?c) $?d)))
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top