是否可以将参数 args 作为 deffunction 的单个列表获取?

Is it possible to get the parameter args as a single list for a deffunction?

我想写一个类似于内置 neq 的函数 all-neq 除了它还强制两个元素不能相同(而不是只有第一个不同)比其他人)。

因此,虽然 (neq 3 4 5 5) 的输出为 TRUE,但我希望 (all-neq 3 4 5 5) 为 FALSE,因为有两个 5。

这是我尝试过的方法,但我一直收到关于参数列表作为输入的错误。

(deffunction all-neq ?args
  (foreach ?arg1 ?args
    (foreach ?arg2 ?args
      (if (and (not (eq ?arg1-index ?arg2-index))
               (eq ?arg1 ?arg2)) then
          (return FALSE))))
  (return TRUE))

这个错误信息是:

[PRNTUTIL2] Syntax Error:  Check appropriate syntax for parameter list.

您可以使用通配符参数将 deffunction 的所有剩余参数分组为单个多字段值:

         CLIPS (6.31 6/12/19)
CLIPS> 
(deffunction all-neq ($?args)
  (foreach ?arg1 ?args
    (foreach ?arg2 ?args
      (if (and (not (eq ?arg1-index ?arg2-index))
               (eq ?arg1 ?arg2)) then
          (return FALSE))))
  (return TRUE))
CLIPS> (all-neq 3 4 5 5)
FALSE
CLIPS> (all-neq 3 4 5 6)
TRUE
CLIPS>

这也会将所有多字段值合并为一个多字段值,因此在比较多字段值时您将无法获得正确的行为:

CLIPS> (all-neq (create$ 3 4) (create$ 5 5))
FALSE
CLIPS> 

为了获得多字段值的正确行为,您需要按照高级编程指南中的描述在 C 中创建一个用户定义的函数,而不是使用 deffunction。