на порожній терм, записуваний по ключу alias. опис цього псевдоніма типу включається у вигляді предиката declared. p> type (B, tid (A, B)) ->
[array, `[, n (M),`:, n (N), `], of], type (B, T),
{recorda (alias, _, A),
assert (declared (A, B, type (arr (M, N, T)))}.
type (B, tid (A, B)) ->
[record], field (B, F), fields (B, LF),
{correct (F, LF),
recorda (alias, _, A),
assert (declared (A, B, type (rec ([F | LF])))},
[end].
type (B, tid (A, B)) ->
[`^, id (I)],
{(type_id2 (I, B, B1, type (_));
assert (declared (I, B, type (referred))),
B1 = B),
recorda (alias, _, A),
assert (declared (A, B, type (ref (I, B1)))}.
Предикат consist в цьому випадку визначається таким чином:
consist (T1, T2): T1 = int, T2 = real;%, що приводиться
equiv (T1, T2) ;% Еквівалентність
error ("Несумісні типи ").
equiv (T, T).
equiv (tid (I, B), tid (I1, B1)): declared (I, B, type (tid (I1, B1)));
declared (I1, B1, type (tid (I, B))).
Іменна еквівалентність порівняно просто реалізується. Але це - відношення (Рефлексивне і симетричне) не транзитивній, і тому не є еквівалентністю ні в математичному, ні в звичному, повсякденному сенсі. Поняття псевдоніма типу зазвичай не дається програмістам, Тому початківці програмісти на Паскалі часто роблять помилки, на зразок зазначених у прикладі. Мотивацією для введення іменний еквівалентності в 1970-і роки послужило бажання уникнути помилок програмування, начебто присвоювання "яблукам" "крабів", коли і ті, й інші описані як цілі. З розвитком об'єктно-орієнтованого програмування подібні хитрощі стали зайвими, а іменна еквівалентність залишилася в деяких мовах як анахронізм.
Структурно-іменна еквівалентність
Цей тип еквівалентності найпростіший: еквівалентними вважаються типи, що мають однаковий базовий тип. Предикат consist в цьому випадку визначається наступним чином:
consist (T1, T2): base_type (T1, BT1), base_type (T2, BT2),
(BT1 = int, BT2 = real ;%, Що приводиться
BT1 = BT2 ;% Еквівалентність
error ("Несумісні типи ")).
При цьому немає необхідності вводити псевдоніми типу, як у випадку іменний еквівалентності. Замість предиката acc_type при аналізі доступу можна застосовувати предикат base_type. p> Ставлення структурно-іменний еквівалентності рефлексивно, симетрично і транзитивній. За вкладенню воно лежить строго між структурним та іменний еквівалентності. Їм легко користуватися на практиці.
Приклади
1.
З допомогою нескладної програми ми зможемо дізнатися внутрішній код довільного символу.
Program Code_pf_Char;
{Програма читає символ з клавіатури і виводить на екран
цей символ і відповідний йому внутрішній код}
var p> ch: Char; {У цю змінну читається символ}
begin p> Write (&...