Факториал

Рассмотрит онтологию "Факториал".
В этом примере определяется рекурсивно функция n!.
Для этого вводится шаблон "fact(@n,@i,@y)" локальной функции, рекурсивно накапливающей результат. Далее вводится внешний шаблон "@n!", действие которого определяется через ранее определенную локальную функцию fact(n,i,y).

Текст онтологии "Факториал" имеет вид:

****************************************************
Введем шаблон "fact(@n,@i,@y)"
с переменными:
"n,i,y :real_выражение"
и переменной результата " z:real_выражение " ;
Пояснения: [Вычисляет факториал]
Условие применения шаблона:
[]
Действие шаблона:
[
if n==i then z=y else z=fact(n,i+1,(y)*(i+1))
]
Тип доступа шаблона:[локальный].

Введем шаблон "@n!"
с переменными:
"n :real"
и переменной результата " z:real " ;
Пояснения: [Вычисляет факториал]
Условие применения шаблона:
[]
Действие шаблона:
[
z=fact(n,1,1)
]
Тип доступа шаблона:[внешний].
****************************************************************

Примеры вопросов к онтологии:
"Вопрос: 5! ?
Ответ: 120";
"Вопрос: 132! ?
Ответ: 1.118248651E+224".

Заметим, что так как эта онтология разработана в среде ядра, и шаблон "@n!" был определен как внешний, то этот шаблон будет видим из любой онтологии (если он в этой онтологии не удален) и, следовательно, в этих онтологиях теперь может вычисляться факториал по запросу.

Другой способ описать функцию факториал с помощью правил переписывания термов приводится в онтологии "FactorialRul2":

*****************************************************************
FactorialRul: real_выражение->real_выражение.
FactorialRul(1)=1.

Для всех [n, k: real ]
[ (n)*(k) ] => [n*k] ("произведение").

Для всех[n: real_выражение ],
если[ n>1 ],
то [ FactorialRul(n)] => [(FactorialRul(n-1))*(n)] ("шаг факториала"),
если, кроме того,[].

Для всех [n, k, m: real_выражение ]
[((n)*(k))*(m)] => [ (n)*((k)*(m)) ] ("ассоциативность").

/*Примеры вопросов:
" Вопрос: FactorialRul(5)?
Ответ: 120"
"Вопрос: FactorialRul(3+2*3)?
Ответ: 362880"*/.
*****************************************************************
Здесь вводится имя функции и три правила переписывания для ее вычисления.