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

Я попытался определить эту функцию, которая принимает несколько целых чисел и сохраняет те, которые отличаются от 0. Она не работает, по-видимому, рекурсивный вызов (filter $?tail) не соответствует списку параметров. Можно ли это сделать в КЛИПСАХ?

(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)
)

person Paul Manta    schedule 27.05.2013    source источник


Ответы (1)


Функциональный фильтр объявлен с двумя параметрами 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> 
person Evans    schedule 28.05.2013
comment
Мне действительно не нужна эта конкретная функция, но мне нужна функция, которая работает примерно так же. Я разместил эту более простую версию только для уменьшения беспорядка. - person Paul Manta; 29.05.2013
comment
@PaulManta Тогда заменит вызовы (filter $?tail) на (filter (first$ $?tail) $?tail), решит? - person Evans; 29.05.2013
comment
Разве это не должно быть что-то вроде (filter (first$ $?tail) (tail$ $?tail)), иначе рекурсия никогда не закончится? - person Paul Manta; 29.05.2013