|
• Факториал
Арифметика
• Пример
логической программы
• Структуры
и термы
• Атомы
• Списки во
Флэнге
• XML-документы
• Векторы
• Таблицы
• Перечисления
• XML-документы
(продолжение)
Описание встроенных
функций
|
|
Арифметика (arith.fln)
|
Еще
один классический пример: задача
построения арифметических функций
с помощью константы
0 и операции прибавления 1 (операции следования) - s(X) = X+1. Числа в
этом случае имеют следующий вид:
0=0; 1=s(0), 2=s(s(0)), 3=s(s(s(0)))
и т.д. Например, операция сложения определяется
через s(X) следующим образом:
plus(0, Y) = Y plus(s(X), Y) = s(plus(X, Y))
Определим на Флэнге операции сложения, умножения и
факториал. |
Программа
на Флэнге (arith.fln):
|
?- struct("s/1");
plus(0, Y) :- Y; plus(s(X), Y) :- s(plus(X, Y));
mult(0, Y) :- 0; mult(s(X), Y) :- plus(Y, mult(X,Y));
fact(0) :- s(0); fact(s(X)) :- mult(s(X), fact(X));
fold(0) :- 0; fold(s(X)) :- 1+fold(X);
|
|
mПримечания
- Строка
?- struct("s/1");
в теле программы означает, что в момент загрузки
программы должен быть
вызван Флэнг-интерпретатор
для вычисления запроса struct("s/1").
- Операция
прибавления единицы представлена в этой
программе
с помощью терма s(X).
Чтобы подсказать Флэнг-системе, что s(X) является структурой, а не
вызовом функции,
используется специальная операция struct, декларирующая новую
структуру. Аргументом
struct является строка, задающая имя структуры и количество аргументов.
-
Функция fold - вспомогательная. Она считает
количество "s"
в терме.
Например, fold(s(s(0))) = 2.
|
|
Работа в интерпретаторе:
|
?- plus(s(s(s(0))), s(s(0)));
s( s( s( s( s(0)))))
?- mult(s(s(s(0))), s(s(0)));
s( s( s( s( s( s(0))))))
?- fact(s(s(s(s(s(0))))));
s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s ( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s ( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s( s(0))))))) )))))))))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))
?- fold(fact(s(s(s(s(s(s(s(0)))))))));
5040
|
|
m Что
делалось
Сначала
нашли сумму 3+2. Затем нашли произведение 3*2. Следующий шаг -
вычисление
5!. В результате получили терм со ста двадцатью "s". Наконец, вычислили
факториал 7.
Поскольку получается слишком длинный терм, вывели его не напрямую, а с
помощью функции
fold подсчитали число "s".
|
664003 Иркутск, ул. К.
Маркса, 1, Иркутский государственный университет, Центр новых
информационных технологий

|
|
|