|
• Факториал
• Арифметика
• Пример
логической программы
• Структуры
и термы
• Атомы
• Списки во
Флэнге
• XML- документы
• Векторы
• Таблицы
• Перечисления
• XML-документы
(продолжение)
Описание встроенных
функций
|
|
Функции и структуры (funcstruc.fln)
Функции во Флэнге
различаются по двум
признакам:
- имени
- числу аргументов
Например, f в следующих выражениях
f(5) f(X, hello)
имя двух разных функций - одного и двух аргументов,
соответственно.
Чтобы учесть
этот факт, во Флэнге часто используется описание функции в виде строки,
явно
включающей как имя, так и количество аргументов: "f/1", "f/2".
Аналогично вызовам функций во Флэнге обозначаются
термы
-
структуры данных, играющие ту же роль, что
и записи в паскале и элементы классов в Java. Например, терм
person(Имя, Фамилия, ГодРождения)
аналогична записи (объекту класса) с именем person
(персона)и полями
Имя, Фамилия и ГодРождения.
Например, Ивана Иванова 1945 года рождения может представлять следующая
структура:
person("Иванов", "Иван", 1945)
Синтаксически структуры неотличимы от вызовов функций,
поэтому
необходимо явно
указывать Флэнг-системе, какие имена являются именами структур. Для
этого существует
операция struct, которой мы пользовались в примеры из арифметики, когда
определяли в
виде структуры операцию следования s(X). Причем если структуры
встречаются в тексте
программы, то имя структуры должно быть декларировано перед первым ее
вхождением в программу.
Это делается включением в текст программы запроса, например,
?- struct("person/3")
После этого person с тремя аргументами будет
пониматься Флэнг-системой
не как применение функции
person к своим аргументам, а как структура, имеющая три поля. |
Программа
на Флэнге (funcstruc.fln):
|
НЕ НУЖНА
|
|
mПримечания
НЕТ
|
|
Работа в интерпретаторе:
|
(1)?- person("Иванов", "Иван") :- 1945;
(2)?- person("Иванов", X);
1945 X = "Иван"
(3)?- person("Иванов", "Иван", 1945);
*** RunError: Function 'person/3' not defined
(4)?- struct("person/3");
true
(5)?- person("Иванов", "Иван", 1945);
person("Иванов", "Иван", 1945)
(6)?- getName(person(_, Name, _)) :- Name;
(7)?- getName(person("Иванов", "Иван", 1945));
"Иван"
(8)?- struct("person/2");
*** RunError: Functor person/2 is already in use in 'struct/1'
|
|
Что делалось
Последовательность
работы с интерпретатором
- Определяем двуместную функцию
'person', вычисляющую
по
имени-фамилии год рождения. Обратите внимание, что правила можно не
только загружать из программы, но и вводить непосредственно во
Флэнг-интерпретаторе.
- Вызываем функцию person/2 с первым
аргументом
'Иванов'.
Флэнг-система находит значение функции, уточняя при этом второй
аргумент
- Делаем запрос person("Иванов",
"Иван", 1945).
Флэнг-система
выдает ошибку, поскольку person/3 не определена ни как функция, ни как
структура.
- Определяем person/3 как структуру.
- Повторяем запрос person("Иванов",
"Иван", 1945).
Терм,
определяемый структурой person/3, равен сам себе.
- Определяем функцию getName,
которая, получая на вход
структуру person/3, возвращает имя
персоны. Обратите внимание на использование "пустой" переменной '_'.
Она используется в тех случаях, когда
значение соответствующего аргумента или поля нас совсем не интересует.
- Находим имя Иванова.
- Пытаемся определить как структуру
person/2. Система
не
позволяет это сделать, поскольку person/2 уже используется как функция.
|
664003 Иркутск, ул. К.
Маркса, 1, Иркутский государственный университет, Центр новых
информационных технологий

|
|
|