Функция фильтра в клипах

Я попытался определить эту функцию, которая принимает несколько целых чисел и сохраняет те, которые отличаются от 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> 
Другие вопросы по тегам