Факториал
Рассмотрит онтологию "Факториал".
В этом примере определяется рекурсивно функция 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"*/.
*****************************************************************
Здесь вводится имя функции и три правила переписывания для ее вычисления.