Большие возможности для создания операторов с заданными свойствами предоставляет специальный оператор define. Он записывается в следующей форме:
define(oper, property1, property2. ._)
Здесь ореr — имя определяемого оператора, property!, property2 и т. д. — наименования свойств. В принципе, оператор define позволяет создавать операторы с новыми свойствами, которые отсутствуют у операторов и функций, встроенных в систему.
Могут быть указаны следующие свойства операторов:
Следующий пример задает линейный оператор L:
Для задания некоторых свойств операторов можно использовать уравнения и соотношения вида f(x)=value. Чтобы свойство выполнялось для всех аргументов (или некоторого класса аргументов), используется описание forall. Так, приведенный ниже пример задает оператор F, который вычисляет n-е число Фибоначчи (n > 2):
Обратите внимание на то, что соотношения fib(0)=l и fib(l)=l задают начальные значения целочисленного массива чисел Фибоначчи, которые нужны для реализации обычного итерационного алгоритма их нахождения, — напоминаем, что очередное число Фибоначчи равно сумме двух предшествующих чисел Фибоначчи.
Последний пример иллюстрирует применение системной функции time для определения времени, затраченного на вычисление значения функции fib(20). Это время задается в секундах. Нетрудно заметить, что даже для ПК с процессором Pentium II 350 МГц это время оказалось довольно значительным (более 3 с), поскольку каждое новое число Фибоначчи вычисляется заново.