我如何从 CLIPS 中的列表中找到最大元素?

How do I find the maximum element from a list in CLIPS?

我正在尝试找出列表中的最大元素,例如

(deffacts list 
   (list 1 2 3 4 5 6 7 6 5 4 3 2 1))

在 CLIPS 中。我怎样才能以非常简单的方式做到这一点?

此外,如果我有一个用于患者的模板,具有以下插槽:

(deftemplate patient
   (slot name)
   (slot age)
   (multislot tens_max)
   (multislot tens_min))

(deffacts data_patient
    (patient (name John) (age 22) (tens_max 13 15 22 11) (tens_min 6 7 14 6))
)

我想找出最后一个多槽的最大元素,tens_min,我该怎么做?

如有任何建议,我将不胜感激。

您可以使用 max 函数来查找其参数的最大值。您可以将数字列表绑定到规则条件中的多字段变量。然而,max 函数需要单独的参数,因此您不能只向它传递一个多字段值。您可以使用 expand$ 函数将多字段值拆分为函数调用的单独参数。 max 函数在 CLIPS 6.3 中需要至少 2 个参数,在 CLIPS 6.4 中至少需要 1 个参数,因此为了完整性,您需要处理这些情况。您可以创建一个 deffunction 来处理代码中的这些边缘情况。

         CLIPS (6.31 6/12/19)
CLIPS> 
(deffunction my-max ($?values)
   (switch (length$ ?values)
      (case 0 then (return))
      (case 1 then (return (nth$ 1 ?values)))
      (default (return (max (expand$ ?values))))))
CLIPS> 
(deffacts list 
   (list 1 2 3 4 5 6 7 6 5 4 3 2 1))
CLIPS> 
(defrule list-max
   (list $?values)
   =>
   (printout t "list max = " (my-max ?values) crlf))
CLIPS> 
(deftemplate patient
   (slot name)
   (slot age)
   (multislot tens_max)
   (multislot tens_min))
CLIPS> 
(deffacts data_patient
    (patient (name John) (age 22) (tens_max 13 15 22 11) (tens_min 6 7 14 6)))
CLIPS> 
(defrule patient-max
   (patient (tens_min $?values))
   =>
   (printout t "patient max = " (my-max ?values) crlf))
CLIPS> (reset)
CLIPS> (run)
patient max = 14
list max = 7
CLIPS>