Среда, 27.11.2024
Ukrainiancontet.at.ua
Меню сайта
Категории раздела
Програмування [35]
Мови веб-програмування [5]
О компании [0]
Новости игры
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Главная » 2015 » Октябрь » 25 » РЕФАЛ
22:43
РЕФАЛ
РЕФАЛ (Рекурсивних Функцій Алгоритмічний) — один з найстаріших функціональних мов програмування, орієнтований на символьні обчислення: опрацювання символьних рядків (наприклад, алгебраїчні викладення); переклад з однієї мови (штучного чи природного) на інший; вирішення проблем, пов'язаних з штучним інтелектом. Поєднує в собі математичну простоту з практичною спрямованістю на написання великих і складних програм.

Відмінною рисою мови є використання зіставлення зі зразком і переписування термів як основного способу визначення функцій.

Програма на Рефале може складатися з одного або декількох модулів (файлів), кожен з яких, у свою чергу, складається з функцій.

Рефал-функція являє собою упорядкований набір речень, що складаються із зразка та шаблону. На вхід функції подається деякий вираз; обчислення функції полягає в зіставленні вираження почергово зразками, взятими з першого, другого і т. д. пропозицій. Якщо чергове зіставлення проходить успішно, то на підставі шаблону, взятого з того ж пропозиції, формується нове Рефал-вираз, який і буде результатом функції. У разі, якщо ні з одним з наявних зразків аргумент функції зіставити не вдалося (неуспіх), фіксується помилка (аварійно завершується вся програма). Щоб уникнути цього часто в кінці функції поміщають пропозиція, за зразком якого можна зіставити взагалі довільне вираження. У деяких сучасних реалізаціях Рефала (наприклад, Рефал+) неуспіх будь-якого виразу функції замість помилки породжує неуспіх самої функції.

Вирази мови Рефал являють собою послідовності термів, в якості яких можуть виступати:
звичайні символи (літери, цифри тощо), які в залежності від діалекту потрібно або не потрібно укладати в апострофи або лапки
символи-мітки (ідентифікатори, конкретна запис яких варіюється в залежності від діалекту мови; так, в Рефале-5 ідентифікатором може служити довільна послідовність латинських букв і цифр, що починається з літери)
макроціфри — цифровий запис невід'ємних цілих чисел, що не перевищують граничне значення
числа з плаваючою точкою
Рефал-змінні одного з декількох визначених типів
довільне вираження, укладена в круглі дужки (в документації Рефалу такий терм називається виразом в структурних дужках)
довільне вираження, укладену в «кутові» дужки і означає виклик функції (такий терм називається активним виразом)

Залежно від ситуації на вираження можуть бути накладені обмеження; так, у зразках заборонено використовувати вирази, що містять кутові дужки, а в полі зору Рефал-машини не можуть бути присутніми змінні.

Рефал-змінні використовуються в зразках і в залежності від свого типу можуть зіставлятися одному символу (тобто кожному терму, крім вираження в структурних дужках), одному терму (безпідставного), або довільним виразом (тобто послідовності термів довільної довжини). Відповідні типи змінних називаються S-змінними, T-змінними і E-змінними. У діалекті Рефал-2 підтримувались ще і V-змінні, що зіставляються безпідставного непустому виразу; в сучасних діалектах такі змінні не підтримуються.

Семантика мови Рефал описується в термінах віртуальної машини, званої «рефал-машина» або «рефал-автомат». Машина має поле зору, в якому може перебувати довільне рефал-вираження, що не містить рефал-змінних.

Виконання програми складається з кроків рефал-автомата, на кожному з яких виконується застосування функції до висловом. Для цього рефал-машина відшукує у своєму полі зору саме ліве з найбільш внутрішніх активних виразів; інакше кажучи, відшукуються парні кутові дужки, не містять інших кутових дужок, а якщо таких пар є кілька, вибирається та з них, яка текстуально в полі зору знаходиться лівіше інших. Перший терм вирази, укладеної в кутові дужки, повинен являти собою символ-мітку, яка ім'ям функції; частина виразу використовується як аргумент функції.

Як було сказано вище, серед пропозицій, складових функцію, знаходиться перше таке, зразок якого можна зіставити з аргументом функції; в ході зіставлення приписуються значення змінних, що містяться в зразку. Потім шаблон, взятий з того ж пропозиції, береться за основу для формування результату обчислення функції; попросту кажучи, результатом оголошується вираз, отримане з шаблону заміною змінних на їх значення. Необхідно відзначити, що шаблон може містити тільки змінні, наявні у зразку; таким чином, всі змінні, що входять в шаблон, виявляться при формуванні результату замінені на відповідні вирази, і результат вже містити змінні не буде. З іншого боку, шаблон цілком може містити вирази в кутових дужках.

На завершення кроку рефал-автомат замінює у своєму полі зору тільки що обчислене активне вираз (включаючи обмежують його кутові дужки) на отриманий в ході обчислення функції результат. Слід зазначити, що кількість кутових дужок, які перебувають у полі зору рефал-машини, може при цьому і зрости.

Виконання програми закінчується, коли в поле зору рефал-машини не виявиться більше кутових дужок. Вираз, що міститься в цей момент в полі зору, оголошується результатом виконання рефал-програми.

Розглянемо найпростіший приклад виконання програми на Рефале. Нехай дана наступна функція:

Palindrom {
s.1 e.2 s.1 = <Palindrom e.2> ;
s.1 = True ;
= True;
e.1 = False ;
}

Ця функція аналізує вираз і повертає в якості результату символ-мітку True, якщо вираз є паліндромом, і False в іншому випадку. Функція має ім'я Palindrom. Пояснимо, що s.1 — це змінна S-типу, e.1 і e.2 — змінні E-типу. Таким чином, тіло функції складається з чотирьох пропозицій, перше з яких спрацює, якщо аргумент функції являє собою вираз, що починається і закінчується одним і тим же символом; друге буде використовуватися, якщо аргумент складається рівно з одного символу; третє задіюється для порожнього аргументу і, нарешті, четверте підійде для всіх інших випадків.

Зазначимо, що шаблон у першому реченні містить активну вираз, що представляє собою рекурсивний виклик функції Palindrom. Це відображає той факт, що, якщо перший та останній символи збіглися, їх можна відкинути і перевірити на палиндромичность залишок вираження.

Нехай у полі зору рефал-автомата виявилося таке активне вираження:

<Palindrom 'abcba'>

Тоді виконання буде складатися з трьох кроків, після яких у полі зору будуть знаходитися наступні вирази:

<Palindrom 'bcb'>
<Palindrom 'c'>
True


На перших двох кроках використовувалося перше речення, на останньому кроці — друге. Оскільки після третього кроку поле зору більше не містить кутових дужок, робота рефал-автомата на цьому завершується.

Перша версія РЕФАЛа була створена в 1966 році Валентином Турчиным як метаязыка для опису семантики інших мов. Згодом, в результаті появи досить ефективних реалізацій на ЕОМ, він став знаходити практичне використання в якості мови програмування.

В даний час основними діалектами мови є РЕФАЛ-2 (1970-ті), РЕФАЛ-5 (1985) і РЕФАЛ+ (1990), що відрізняються один від одного деталями синтаксису і набором «додаткових коштів», що розширюють початковий варіант.

Наступна програма на діалекті РЕФАЛ-5 звертає і друкує подається на вхід рядок даних:
$ENTRY Go
{
= <Prout <Reverse <Card>>>;
}

Reverse
{
e.Text = <DoReverse () e.Text>;
}

DoReverse
{
(e.Scanned) = e.Scanned;
(e.Scanned) s.Next e.Tail = <DoReverse (s.Next e.Scanned) e.Tail>;
}

Цю ж програму можна записати інакше:
$ENTRY Go
{
= <Prout <Reverse <Card>>>;
}

Reverse
{
/* Якщо рядок не порожній, то переносимо перший символ в кінець */
s.First e.Tail = <Reverse e.Tail> s.First;

/* Обробка пустого рядка */
/* порожньо */ = /* порожньо */;
}

Наступна програма на діалекті РЕФАЛ-5 одержує на вході рядок даних, що представляє собою десяткове подання деякого натурального числа N, після чого обчислює і друкує число Фібоначчі з номером N:
$ENTRY Go
{
= <Prout <Symb <FN <Numb <Card>>>>;
}

FN
{
/* Виклик допоміжної функції, реалізує остаточно-рекурсивний цикл. */
s.Number = <DoFN s.Number 0 1>;
}

/*
Функція реалізує остаточно-рекурсивний цикл.
Інваріант циклу <DoFN s.Counter s.Current s.Next>
s.Counter -- кількість ітерацій.
s.Current -- число Фібоначчі, відповідне поточної ітерації.
s.Next -- значення числа Фібоначчі на следующией ітерації.
*/
DoFN
{
0 s.Current s.Next = s.Current;
s.Counter s.Current s.Next =
<DoFN <Sub s.Counter 1> s.Next <Add s.Current s.Next>>;
}
Категория: Програмування | Просмотров: 475 | Добавил: Admin | Теги: РЕФАЛ | Рейтинг: 0.0/0
Всего комментариев: 0
avatar
Вход на сайт

Поиск
Интернет
Здоровье
Афиша
Ситуация на восток
Религия
Архив записей
Каталог сайтов Всего.RU
Рейтинг@Mail.ru
Copyright Ukrainiancontet.at.ua © 2024
uCozЯндекс.Метрика