Можно ли получить аргументы параметра в виде единого списка для устранения неисправности? - PullRequest
0 голосов
/ 15 октября 2019

Я хотел бы написать функцию all-neq, которая похожа на встроенную neq, за исключением того, что она также обеспечивает, что никакие два элемента не могут быть одинаковыми (вместо того, чтобы только первый отличался от остальных).

Итак, хотя вывод (neq 3 4 5 5) равен ИСТИНА, я хочу, чтобы (all-neq 3 4 5 5) был ЛОЖЬ, так как есть два 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.

1 Ответ

1 голос
/ 15 октября 2019

Вы можете использовать подстановочный параметр, чтобы сгруппировать все оставшиеся аргументы 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.

...