]]> ]]>
Править | Обсудить | История

APLAN

Русское название:
Аплан
Дата создания:
1993
Создан под влиянием:
Повлиял на:
Парадигма:
Типизация:
Принятые расширения файлов:
.ap
Реализации и версии (свернуть все | развернуть все):
Язык программирования

APLAN — язык алгебраического программирования для системы Algebraic Programming System (далее APS), созданный в Институте Кибернетики им. В.М.Глушкова Национальной Академии Наук Украины. Система APS предназначена для прототипирования алгоритмов.

Первая версия системы APS и, соответственно, языка была разработана в 1989 году. За ней последовали версии 2004 года (использование умных указателей для борьбы с утечками памяти, присущими первым версиям) и 2009 года (оптимизация механизма переписывания, добавление недетерминированных возможностей).

Ключевая парадигма языка — правила переписывания, причем системы правил переписывания отделены от стратегий их применения. Программа на APLAN состоит из двух основных частей: процедур и систем правил переписывания. При применении систем правил они транслируются в программу REM (Rewriting Machine Language) — внутренний язык команд переписывающей машины.

Синтаксис описания системы правил переписывания:

<rewriting system> ::= rs(<list of variables separated by ",">)
      (<list of rules separated by "," >)
<rule> ::= <simple rule> | <conditional rule>
<simple rule> ::= <algebraic expression> = <algebraic expression>
<conditional rule> ::= <condition> -> <simple rule>
<variable> ::= <identifier>

Синтаксис определения процедуры:

<procedure definition> ::= proc(<formal parameters list>)
<local names> <statement>
<local names> ::= loc(<local names list>) | <empty>
<formal parameter> ::= <identifier>

Примеры:

Hello, World!:

Пример для версий APS APLAN

Эта программа не требует использования правил переписывания и выполнена в процедурном стиле. Модуль std.ap позволяет использовать арифметические операции, предикаты сравнения, логические операции, императивные элементы и ряд специальных функций; его включение необходимо во всех программах. При запуске в онлайн-интерпретаторе все модули подключены автоматически, поэтому в явном виде их можно не подключать.

Вместо функции put можно использовать эквивалентную ей prn.

INCLUDE <include/std.ap>

task := put("Hello, World!");

Факториал:

Пример для версий APS APLAN

В первой строке объявляются имена процедур и систем переписывающих правил, которые будут определены в этой программе. Имя task объявлять не нужно, т.к. это имя самой программы (совпадает с именем файла).

Следующий блок — определение функции вычисления факториала как системы переписывающих правил; на это указывает ключевое слово rs в определении. Правила, применяющиеся к аргументу, перечислены в круглых скобках через запятую. В данном случае все правила простые, т.е. применяются к аргументам безусловно.

Затем следует процедура вывода факториалов на печать (ключевое слово proc). Ключевое слово loc задает список локальных переменных. После него в круглых скобках перечислены операторы процедуры через точку с запятой. Вместо конкатенации аргументов функции prn (вывод на печать) можно просто перечислить аргументы подряд.

При выполнении программы в онлайн-интерпретаторе вывод имеет заданный вид; при выполнении в интерпретаторе локально в выводе появляются лишние кавычки:

0 "! = " 1
1 "! = " 1

и т.д.

INCLUDE <include/std.ap>

NAMES factorial, print_factorials;

factorial := rs(x) (
    0 = 1,
    1 = 1,
    x = x * factorial(x - 1)
);

print_factorials := proc(n)loc(i)(
    i := 0;
    while(i < n,
        prn i"! = "factorial(i);
        i := i + 1
    )
);

task := print_factorials 17;

Числа Фибоначчи:

Пример для версий APS APLAN

В языке не предусмотрены операции работы со строками, а команды вывода на печать обязательно заканчивают выведенное переводом строки, поэтому форматирование не соблюдено — числа выводятся просто в столбик.

INCLUDE <include/std.ap>

NAMES fibonacci, print_fibonacci;

fibonacci := rs(x) (
    0 = 1,
    1 = 1,
    x = fibonacci(x - 1) + fibonacci(x - 2)
);

print_fibonacci := proc(n)loc(i, res)(
    i := 0;
    while(i < n,
        prn fibonacci(i);
        i := i + 1
    )
);

task := print_fibonacci 16 ;

Комментарии

]]>

blog comments powered by Disqus

]]>

Работа программистам