2016-01-26 4 views
0

J'ai du mal à évaluer correctement les valeurs entières d'une valeur multiflux. En fin de compte, ce dont j'ai besoin est de faire correspondre un multislot contenant uniquement des entiers et être capable de dire si la "liste" est dans l'ordre croissant.CLIPS: Comment évaluer les valeurs multiflux comme entiers

Ce que j'ai jusqu'à présent:

(defclass status 
    (is-a USER) 
    (role concrete) 
    (pattern-match reactive) 
    (multislot numbers 
     (create-accessor write) 
     (type INTEGER) 
     (range 1 ?VARIABLE) 
     (default 1) 
    ) 
) 

(defrule asc 
    ?st <- (object (is-a status) (numbers $?n)) 
    (test (> (length ?n) 2)) 
    (test (< (first$ ?n) (rest$ ?n))) 
=> 
    (printout t "List " ?n " is ascending" crlf) 
) 

(make-instance of status (numbers 1 2 3)) 

Je comprends que probablement ce n'est pas la façon de développer un multislot et remplir les arguments pour (<) mais je ne peux pas sembler trouver la bonne façon. Et même si les arguments développés correctement, il dit encore qu'il exige un argument entier, mais

(first$ ?n) 

n'évalue pas à un nombre entier.

Ma question est: Comment puis-je prendre une valeur d'une liste de valeurs et "l'analyser" comme un entier? Deuxièmement, comment puis-je développer ces valeurs pour les rendre arguments de (<) et dire si la liste est dans l'ordre croissant?

Répondre

1

Utilisez la fonction nth $ pour extraire une seule valeur d'un multifield. Pour la première valeur, vous utiliseriez (nth $ 1? N). Dans votre règle, cependant, tout ce que vous devez faire est d'utiliser la fonction expand $ pour fusionner la valeur de l'emplacement des nombres dans la liste d'arguments de la fonction <.

CLIPS> 
(defclass status 
    (is-a USER) 
    (multislot numbers)) 
CLIPS> 
(defrule asc 
    (object (is-a status) (numbers $?n)) 
    (test (> (length ?n) 1)) 
    (test (< (expand$ ?n))) 
    => 
    (printout t "List " ?n " is ascending" crlf)) 
CLIPS> (make-instance of status (numbers 1 2 3)) 
[gen1] 
CLIPS> (make-instance of status (numbers 2 3 1 4)) 
[gen2] 
CLIPS> (run) 
List (1 2 3) is ascending 
CLIPS>