CLIPS:如何将多字段值评估为整数

CLIPS: How to evaluate multifield values as integers

我正在努力正确评估多字段值的整数值。

最终我需要的是对仅包含整数的多槽进行模式匹配,并能够判断 "list" 是否按升序排列。

我目前拥有的:

(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))

我知道这可能不是扩展多槽和填充 (<) 参数的方法,但我似乎找不到正确的方法。 即使参数扩展得当,它仍然说它需要一个整数参数,但是

(first$ ?n)

计算结果不是整数。

我的问题是: 如何将值列表的值 "parse" 取为整数? 其次,我如何扩展这些值以使它们成为 (<) 的参数并判断列表是否按升序排列?

使用 nth$ 函数从多字段中检索单个值。对于第一个值,您将使用 (nth$ 1 ?n)。然而,在您的规则中,您需要做的就是使用 expand$ 函数将数字槽的值拼接到 < 函数的参数列表中。

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>