Функция фильтра в клипах
Я попытался определить эту функцию, которая принимает несколько целых чисел и сохраняет те, которые отличаются от 0. Она не работает, по-видимому, рекурсивный вызов (filter $?tail)
не совпадает со списком параметров. Можно ли это сделать в CLIPS?
(deffunction filter (?head $?tail)
(if (= (length $?tail) 0) then
(if (!= ?head 0) then (return ?head))
(return $?tail))
(if (= ?head 0) then
(return (filter $?tail)))
(bind $?result ?head (filter $?tail))
(return $?result)
)
1 ответ
Решение
Функциональный фильтр объявлен с 2 параметрами filter(?head $?tail)
но вы звоните только с одним (filter $?tail)
Нужна ли рекурсия? Эта проблема может быть легко решена с помощью функции delete-member$
:
(delete-member$ $?list 0)
Пример:
CLIPS> (delete-member$ (create$ 6 7 0 8 0 7) 0)
(6 7 8 7)
CLIPS>