// 2025-2026 Богданович Давид Когут Прихожденко (кдб.дійсність.укр)

взяти означення мавка/машина;

простір мавка {
  внутрішня дія звільнити_предмет(М: адреса<Машина>, значення: адреса<Предмет>);
  внутрішня дія звільнити_предмет_структури(М: адреса<Машина>, предмет_структури: адреса<ПредметСтруктури>);
  внутрішня дія звільнити_предмет_даних(М: адреса<Машина>, предмет_даних: адреса<ПредметДаних>);
  внутрішня дія звільнити_предмет_діапазону_чисел(М: адреса<Машина>, предмет_діапазону_чисел: адреса<ПредметДіапазонуЧисел>);
  внутрішня дія звільнити_предмет_дії(М: адреса<Машина>, предмет_дії: адреса<ПредметДії>);
  внутрішня дія звільнити_предмет_коду(М: адреса<Машина>, предмет_коду: адреса<ПредметКоду>);
  внутрішня дія звільнити_предмет_модуля(М: адреса<Машина>, предмет_модуля: адреса<ПредметМодуля>);
  внутрішня дія звільнити_предмет_параметра(М: адреса<Машина>, предмет_параметра: адреса<ПредметПараметра>);
  внутрішня дія звільнити_предмет_перебору_даних(М: адреса<Машина>, предмет_перебору_даних: адреса<ПредметПереборуДаних>);
  внутрішня дія звільнити_предмет_перебору_діапазону_чисел(М: адреса<Машина>, предмет_перебору_діапазону_чисел: адреса<ПредметПереборуДіапазонуЧисел>);
  внутрішня дія звільнити_предмет_перебору_послідовності(М: адреса<Машина>, предмет_перебору_послідовності: адреса<ПредметПереборуПослідовності>);
  внутрішня дія звільнити_предмет_перебору_словника(М: адреса<Машина>, предмет_перебору_словника: адреса<ПредметПереборуСловника>);
  внутрішня дія звільнити_предмет_перебору_списку(М: адреса<Машина>, предмет_перебору_списку: адреса<ПредметПереборуСписку>);
  внутрішня дія звільнити_предмет_перебору_тексту(М: адреса<Машина>, предмет_перебору_тексту: адреса<ПредметПереборуТексту>);
  внутрішня дія звільнити_предмет_послідовності(М: адреса<Машина>, послідовність: адреса<ПредметПослідовності>);
  внутрішня дія звільнити_предмет_словника(М: адреса<Машина>, предмет_словника: адреса<ПредметСловника>);
  внутрішня дія звільнити_предмет_списку(М: адреса<Машина>, предмет_списку: адреса<ПредметСписку>);
  внутрішня дія звільнити_предмет_тексту(М: адреса<Машина>, предмет_тексту: адреса<ПредметТексту>);
  внутрішня дія звільнити_складений_предмет(М: адреса<Машина>, складений_предмет: адреса<СкладенийПредмет>);
  внутрішня дія звільнити_користувацькі_дані(М: адреса<Машина>, користувацькі_дані: адреса<КористувацькіДані>);
  внутрішня дія звільнити_методи(М: адреса<Машина>, методи: Методи);
  дія звільнити_призначення(М: адреса<Машина>, призначення: Призначення);
  внутрішня дія звільнити_притримувач(М: адреса<Машина>, притримувач: адреса<Притримувач>);

  // позначка: прохід по типах предметів
  внутрішня дія звільнити_предмет(
    М: адреса<Машина>,
    значення: адреса<Предмет>
  ) {
    якщо значення.тип == М.предмет_структури_Структура {
      // надрукувати_кд(М, "звільнення дійсного предмету структури");
      звільнити_предмет_структури(М, значення як адреса<ПредметСтруктури>);
      вернути;
    }

    якщо значення.тип == М.предмет_структури_Модуль {
      // надрукувати_кд(М, "звільнення дійсного предмету модуля");
      звільнити_предмет_модуля(М, значення як адреса<ПредметМодуля>);
      вернути;
    }

    якщо значення.тип == М.предмет_структури_Параметр {
      // надрукувати_кд(М, "звільнення дійсного предмету параметра");
      звільнити_предмет_параметра(М, значення як адреса<ПредметПараметра>);
      вернути;
    }

    якщо значення.тип == М.предмет_структури_Число {
      ЗАПАНІКУВАТИ(М, "[Помилка Машини][звільнити_предмет]: значення.тип == М.предмет_структури_Число");
      вернути;
    }

    якщо значення.тип == М.предмет_структури_Текст {
      // вивести_кд(М, "звільнення предмету тексту: ");
      // надрукувати_кд(М, (значення як адреса<ПредметТексту>).значення);
      звільнити_предмет_тексту(М, значення як адреса<ПредметТексту>);
      вернути;
    }

    якщо значення.тип == М.предмет_структури_Код {
      // надрукувати_кд(М, "звільнення предмету коду");
      звільнити_предмет_коду(М, значення як адреса<ПредметКоду>);
      вернути;
    }

    якщо значення.тип == М.предмет_структури_Дія {
      // вивести_кд(М, "звільнення предмету дії ");
      // змінна предмет_дії = значення як адреса<ПредметДії>;
      // якщо предмет_дії.назва != пусто {
      //   надрукувати_кд(М, предмет_дії.назва.значення);
      // } інакше {
      //   надрукувати_кд(М, "<без назви>");
      // }
      звільнити_предмет_дії(М, значення як адреса<ПредметДії>);
      вернути;
    }

    якщо значення.тип == М.предмет_структури_Список {
      // надрукувати_кд(М, "звільнення предмету списку");
      звільнити_предмет_списку(М, значення як адреса<ПредметСписку>);
      вернути;
    }

    якщо значення.тип == М.предмет_структури_Словник {
      // надрукувати_кд(М, "звільнення предмету словника");
      звільнити_предмет_словника(М, значення як адреса<ПредметСловника>);
      вернути;
    }

    якщо значення.тип == М.предмет_структури_Дані {
      // надрукувати_кд(М, "звільнення предмету даних");
      звільнити_предмет_даних(М, значення як адреса<ПредметДаних>);
      вернути;
    }

    якщо значення.тип == М.предмет_структури_ДіапазонЧисел {
      // надрукувати_кд(М, "звільнення предмету діапазону чисел");
      звільнити_предмет_діапазону_чисел(М, значення як адреса<ПредметДіапазонуЧисел>);
      вернути;
    }

    якщо значення.тип == М.предмет_структури_ПеребірДіапазонуЧисел {
      // надрукувати_кд(М, "звільнення предмету перебору діапазону чисел");
      звільнити_предмет_перебору_діапазону_чисел(М, значення як адреса<ПредметПереборуДіапазонуЧисел>);
      вернути;
    }

    якщо значення.тип == М.предмет_структури_ПеребірДаних {
      // надрукувати_кд(М, "звільнення предмету перебору даних");
      звільнити_предмет_перебору_даних(М, значення як адреса<ПредметПереборуДаних>);
      вернути;
    }

    якщо значення.тип == М.предмет_структури_ПеребірПослідовності {
      // надрукувати_кд(М, "звільнення предмету перебору послідовності");
      звільнити_предмет_перебору_послідовності(М, значення як адреса<ПредметПереборуПослідовності>);
      вернути;
    }

    якщо значення.тип == М.предмет_структури_ПеребірСловника {
      // надрукувати_кд(М, "звільнення предмету перебору словника");
      звільнити_предмет_перебору_словника(М, значення як адреса<ПредметПереборуСловника>);
      вернути;
    }

    якщо значення.тип == М.предмет_структури_ПеребірСписку {
      // надрукувати_кд(М, "звільнення предмету перебору списку");
      звільнити_предмет_перебору_списку(М, значення як адреса<ПредметПереборуСписку>);
      вернути;
    }

    якщо значення.тип == М.предмет_структури_ПеребірТексту {
      // надрукувати_кд(М, "звільнення предмету перебору тексту");
      звільнити_предмет_перебору_тексту(М, значення як адреса<ПредметПереборуТексту>);
      вернути;
    }

    якщо значення.тип == М.предмет_структури_Послідовність {
      // надрукувати_кд(М, "звільнення предмету послідовності");
      звільнити_предмет_послідовності(М, значення як адреса<ПредметПослідовності>);
      вернути;
    }

    // надрукувати_кд(М, "звільнення складеного предмету");

    звільнити_складений_предмет(М, значення як адреса<СкладенийПредмет>);
  }

  внутрішня дія звільнити_предмет_послідовності(
    М: адреса<Машина>,
    послідовність: адреса<ПредметПослідовності>
  ) {
    // надрукувати_кд(М, "звільнити_предмет_послідовності");
    якщо послідовність.користувацькі_дані != пусто {
      звільнити_користувацькі_дані(М, послідовність.користувацькі_дані);
    }
    звільнити_памʼять(М, послідовність.елементи);
    звільнити(М, послідовність);
  }

  внутрішня дія звільнити_предмет_структури(
    М: адреса<Машина>,
    предмет_структури: адреса<ПредметСтруктури>
  ) {
    // надрукувати_кд(М, "звільнити_предмет_структури");
    якщо предмет_структури.користувацькі_дані != пусто {
      звільнити_користувацькі_дані(М, предмет_структури.користувацькі_дані);
    }
    звільнити_методи(М, предмет_структури.методи);
    звільнити_призначення(М, предмет_структури.властивості);
    звільнити(М, предмет_структури);
  }

  внутрішня дія звільнити_предмет_модуля(
    М: адреса<Машина>,
    предмет_модуля: адреса<ПредметМодуля>
  ) {
    // надрукувати_кд(М, "звільнити_предмет_модуля");
    якщо предмет_модуля.користувацькі_дані != пусто {
      звільнити_користувацькі_дані(М, предмет_модуля.користувацькі_дані);
    }
    звільнити_призначення(М, предмет_модуля.властивості);
    звільнити(М, предмет_модуля);
  }

  внутрішня дія звільнити_предмет_параметра(
    М: адреса<Машина>,
    предмет_параметра: адреса<ПредметПараметра>
  ) {
    // вивести_кд(М, "звільнити_предмет_параметра: ");
    // надрукувати_кд(М, предмет_параметра.назва.значення);
    якщо предмет_параметра.користувацькі_дані != пусто {
      звільнити_користувацькі_дані(М, предмет_параметра.користувацькі_дані);
    }
    звільнити(М, предмет_параметра);
  }

  внутрішня дія звільнити_предмет_тексту(
    М: адреса<Машина>,
    предмет_тексту: адреса<ПредметТексту>
  ) {
    // надрукувати_кд(М, "звільнити_предмет_тексту");
    якщо предмет_тексту.користувацькі_дані != пусто {
      звільнити_користувацькі_дані(М, предмет_тексту.користувацькі_дані);
    }
    звільнити_памʼять(М, предмет_тексту.значення.дані);
    звільнити(М, предмет_тексту);
  }

  внутрішня дія звільнити_предмет_коду(
    М: адреса<Машина>,
    предмет_коду: адреса<ПредметКоду>
  ) {
    // надрукувати_кд(М, "звільнити_предмет_коду");
    якщо предмет_коду.користувацькі_дані != пусто {
      звільнити_користувацькі_дані(М, предмет_коду.користувацькі_дані);
    }
    звільнити_памʼять(М, предмет_коду.місцезнаходження_вказівок.дані);
    звільнити(М, предмет_коду);
  }

  внутрішня дія звільнити_предмет_дії(
    М: адреса<Машина>,
    предмет_дії: адреса<ПредметДії>
  ) {
    // надрукувати_кд(М, "звільнити_предмет_дії");
    якщо предмет_дії.користувацькі_дані != пусто {
      звільнити_користувацькі_дані(М, предмет_дії.користувацькі_дані);
    }

    якщо предмет_дії.дійсність_створення != пусто {
      відпустити_дійсність(М, предмет_дії.дійсність_створення);
    }

    звільнити(М, предмет_дії);
  }

  внутрішня дія звільнити_предмет_списку(
    М: адреса<Машина>,
    предмет_списку: адреса<ПредметСписку>
  ) {
    // надрукувати_кд(М, "звільнити_предмет_списку");
    якщо предмет_списку.користувацькі_дані != пусто {
      звільнити_користувацькі_дані(М, предмет_списку.користувацькі_дані);
    }
    звільнити_памʼять(М, предмет_списку.елементи);
    звільнити(М, предмет_списку);
  }

  внутрішня дія звільнити_предмет_словника(
    М: адреса<Машина>,
    предмет_словника: адреса<ПредметСловника>
  ) {
    // надрукувати_кд(М, "звільнити_предмет_словника");
    якщо предмет_словника.користувацькі_дані != пусто {
      звільнити_користувацькі_дані(М, предмет_словника.користувацькі_дані);
    }
    звільнити_памʼять(М, предмет_словника.елементи);
    звільнити(М, предмет_словника);
  }

  внутрішня дія звільнити_предмет_даних(
    М: адреса<Машина>,
    предмет_даних: адреса<ПредметДаних>
  ) {
    // надрукувати_кд(М, "звільнити_предмет_даних");
    якщо предмет_даних.користувацькі_дані != пусто {
      звільнити_користувацькі_дані(М, предмет_даних.користувацькі_дані);
    }
    звільнити_памʼять(М, предмет_даних.дані);
    звільнити(М, предмет_даних);
  }

  внутрішня дія звільнити_предмет_діапазону_чисел(
    М: адреса<Машина>,
    предмет_діапазону_чисел: адреса<ПредметДіапазонуЧисел>
  ) {
    // надрукувати_кд(М, "звільнити_предмет_діапазону_чисел");
    якщо предмет_діапазону_чисел.користувацькі_дані != пусто {
      звільнити_користувацькі_дані(М, предмет_діапазону_чисел.користувацькі_дані);
    }
    звільнити(М, предмет_діапазону_чисел);
  }

  внутрішня дія звільнити_предмет_перебору_діапазону_чисел(
    М: адреса<Машина>,
    предмет_перебору_діапазону_чисел: адреса<ПредметПереборуДіапазонуЧисел>
  ) {
    // надрукувати_кд(М, "звільнити_предмет_перебору_діапазону_чисел");
    якщо предмет_перебору_діапазону_чисел.користувацькі_дані != пусто {
      звільнити_користувацькі_дані(М, предмет_перебору_діапазону_чисел.користувацькі_дані);
    }
    звільнити(М, предмет_перебору_діапазону_чисел);
  }

  внутрішня дія звільнити_предмет_перебору_даних(
    М: адреса<Машина>,
    предмет_перебору_даних: адреса<ПредметПереборуДаних>
  ) {
    // надрукувати_кд(М, "звільнити_предмет_перебору_даних");
    якщо предмет_перебору_даних.користувацькі_дані != пусто {
      звільнити_користувацькі_дані(М, предмет_перебору_даних.користувацькі_дані);
    }
    звільнити(М, предмет_перебору_даних);
  }

  внутрішня дія звільнити_предмет_перебору_послідовності(
    М: адреса<Машина>,
    предмет_перебору_послідовності: адреса<ПредметПереборуПослідовності>
  ) {
    // надрукувати_кд(М, "звільнити_предмет_перебору_послідовності");
    якщо предмет_перебору_послідовності.користувацькі_дані != пусто {
      звільнити_користувацькі_дані(М, предмет_перебору_послідовності.користувацькі_дані);
    }
    звільнити(М, предмет_перебору_послідовності);
  }

  внутрішня дія звільнити_предмет_перебору_словника(
    М: адреса<Машина>,
    предмет_перебору_словника: адреса<ПредметПереборуСловника>
  ) {
    // надрукувати_кд(М, "звільнити_предмет_перебору_словника");
    якщо предмет_перебору_словника.користувацькі_дані != пусто {
      звільнити_користувацькі_дані(М, предмет_перебору_словника.користувацькі_дані);
    }
    звільнити(М, предмет_перебору_словника);
  }

  внутрішня дія звільнити_предмет_перебору_списку(
    М: адреса<Машина>,
    предмет_перебору_списку: адреса<ПредметПереборуСписку>
  ) {
    // надрукувати_кд(М, "звільнити_предмет_перебору_списку");
    якщо предмет_перебору_списку.користувацькі_дані != пусто {
      звільнити_користувацькі_дані(М, предмет_перебору_списку.користувацькі_дані);
    }
    звільнити(М, предмет_перебору_списку);
  }

  внутрішня дія звільнити_предмет_перебору_тексту(
    М: адреса<Машина>,
    предмет_перебору_тексту: адреса<ПредметПереборуТексту>
  ) {
    // надрукувати_кд(М, "звільнити_предмет_перебору_тексту");
    якщо предмет_перебору_тексту.користувацькі_дані != пусто {
      звільнити_користувацькі_дані(М, предмет_перебору_тексту.користувацькі_дані);
    }
    звільнити(М, предмет_перебору_тексту);
  }

  внутрішня дія звільнити_складений_предмет(
    М: адреса<Машина>,
    складений_предмет: адреса<СкладенийПредмет>
  ) {
    // надрукувати_кд(М, "звільнити_складений_предмет");
    якщо складений_предмет.користувацькі_дані != пусто {
      звільнити_користувацькі_дані(М, складений_предмет.користувацькі_дані);
    }
    звільнити_призначення(М, складений_предмет.властивості);
    звільнити(М, складений_предмет);
  }

  внутрішня дія звільнити_користувацькі_дані(
    М: адреса<Машина>,
    користувацькі_дані: адреса<КористувацькіДані>
  ) {
    // надрукувати_кд(М, "звільнити_користувацькі_дані");
    якщо користувацькі_дані.дія_перед_знищенням != пусто {
      користувацькі_дані.дія_перед_знищенням(М, користувацькі_дані);
    }

    звільнити(М, користувацькі_дані);
  }

  внутрішня дія звільнити_методи(
    М: адреса<Машина>,
    методи: Методи
  ) {
    // надрукувати_кд(М, "звільнити_методи");
    звільнити_памʼять(М, методи.дані);
  }

  дія звільнити_призначення(
    М: адреса<Машина>,
    призначення: Призначення
  ) {
    // надрукувати_кд(М, "звільнити_призначення");
    змінна п: природне = 0;

    поки п < призначення.вмісткість {
      змінна призначене = призначення.дані[п];

      поки призначене != пусто {
        змінна наступний = призначене.наступний;

        звільнити(М, призначене);

        призначене = наступний;
      }

      п = п + 1;
    }

    звільнити_памʼять(М, призначення.дані);
  }

  внутрішня дія звільнити_притримувач(
    М: адреса<Машина>,
    притримувач: адреса<Притримувач>
  ) {
    // надрукувати_кд(М, "звільнити_притримувач");

    змінна притриманий = притримувач.перший;

    поки притриманий != пусто {
      змінна наступний_притриманий = притриманий.наступний;

      звільнити(М, притриманий);

      притриманий = наступний_притриманий;
    }

    звільнити(М, притримувач);
  }

  внутрішня дія позначити_дійсність(М: адреса<Машина>, дійсність: адреса<Дійсність>);
  внутрішня дія позначити_предмет(М: адреса<Машина>, значення: адреса<Предмет>);
  внутрішня дія позначити_предмет_послідовності(М: адреса<Машина>, послідовність: адреса<ПредметПослідовності>);
  внутрішня дія позначити_предмет_структури(М: адреса<Машина>, предмет_структури: адреса<ПредметСтруктури>);
  внутрішня дія позначити_предмет_модуля(М: адреса<Машина>, предмет_модуля: адреса<ПредметМодуля>);
  внутрішня дія позначити_предмет_параметра(М: адреса<Машина>, предмет_параметра: адреса<ПредметПараметра>);
  внутрішня дія позначити_предмет_тексту(М: адреса<Машина>, предмет_тексту: адреса<ПредметТексту>);
  внутрішня дія позначити_предмет_коду(М: адреса<Машина>, предмет_коду: адреса<ПредметКоду>);
  внутрішня дія позначити_предмет_дії(М: адреса<Машина>, предмет_дії: адреса<ПредметДії>);
  внутрішня дія позначити_предмет_списку(М: адреса<Машина>, предмет_списку: адреса<ПредметСписку>);
  внутрішня дія позначити_предмет_словника(М: адреса<Машина>, предмет_словника: адреса<ПредметСловника>);
  внутрішня дія позначити_предмет_даних(М: адреса<Машина>, предмет_даних: адреса<ПредметДаних>);
  внутрішня дія позначити_предмет_діапазону_чисел(М: адреса<Машина>, предмет_діапазону_чисел: адреса<ПредметДіапазонуЧисел>);
  внутрішня дія позначити_предмет_перебору_діапазону_чисел(М: адреса<Машина>, предмет_перебору_діапазону_чисел: адреса<ПредметПереборуДіапазонуЧисел>);
  внутрішня дія позначити_предмет_перебору_даних(М: адреса<Машина>, предмет_перебору_даних: адреса<ПредметПереборуДаних>);
  внутрішня дія позначити_предмет_перебору_послідовності(М: адреса<Машина>, предмет_перебору_послідовності: адреса<ПредметПереборуПослідовності>);
  внутрішня дія позначити_предмет_перебору_словника(М: адреса<Машина>, предмет_перебору_словника: адреса<ПредметПереборуСловника>);
  внутрішня дія позначити_предмет_перебору_списку(М: адреса<Машина>, предмет_перебору_списку: адреса<ПредметПереборуСписку>);
  внутрішня дія позначити_предмет_перебору_тексту(М: адреса<Машина>, предмет_перебору_тексту: адреса<ПредметПереборуТексту>);
  внутрішня дія позначити_складений_предмет(М: адреса<Машина>, складений_предмет: адреса<СкладенийПредмет>);
  внутрішня дія позначити_накопичувач_значень(М: адреса<Машина>, накопичувач_значень: НакопичувачЗначень);
  внутрішня дія позначити_спроби(М: адреса<Машина>, спроби: Спроби);
  внутрішня дія позначити_історію_здійснення(М: адреса<Машина>, історія_здійснення: ІсторіяЗдійснення);
  внутрішня дія позначити_місцезнаходження(М: адреса<Машина>, місцезнаходження: Місцезнаходження);
  внутрішня дія позначити_константи_назв(М: адреса<Машина>, константи_назв: КонстантиНазв);
  внутрішня дія позначити_взяті_значення(М: адреса<Машина>, взяті_значення: ВзятіЗначення);
  внутрішня дія позначити_методи(М: адреса<Машина>, методи: Методи);
  внутрішня дія позначити_властивості(М: адреса<Машина>, призначення: Призначення);
  внутрішня дія позначити_притримувач(М: адреса<Машина>, притримувач: адреса<Притримувач>);
  внутрішня дія позначити_чергу_здійснення(М: адреса<Машина>, черга_здійснення: ЧергаЗдійснення);
  внутрішня дія позначити_задіяні(М: адреса<Машина>, задіяні: Задіяні);
  внутрішня дія позначити_іменовано_задіяні(М: адреса<Машина>, іменовано_задіяні: адреса<ІменованіЗадіяні>);

  внутрішня дія позначити_дійсність(
    М: адреса<Машина>,
    дійсність: адреса<Дійсність>
  ) {
    якщо дійсність.позначено {
      вернути;
    }

    дійсність.позначено = так;

    якщо дійсність.зовні != пусто {
      позначити_дійсність(М, дійсність.зовні);
    }

    позначити_властивості(М, дійсність.призначення);
  }

  // позначка: прохід по типах предметів
  внутрішня дія позначити_предмет(
    М: адреса<Машина>,
    предмет: адреса<Предмет>
  ) {
    якщо предмет.позначено {
      вернути;
    }

    якщо предмет.тип == М.предмет_структури_Структура {
      позначити_предмет_структури(М, предмет як адреса<ПредметСтруктури>);
      вернути;
    }

    якщо предмет.тип == М.предмет_структури_Модуль {
      позначити_предмет_модуля(М, предмет як адреса<ПредметМодуля>);
      вернути;
    }

    якщо предмет.тип == М.предмет_структури_Параметр {
      позначити_предмет_параметра(М, предмет як адреса<ПредметПараметра>);
      вернути;
    }

    якщо предмет.тип == М.предмет_структури_Число {
      ЗАПАНІКУВАТИ(М, "[Помилка Машини][позначити_предмет]: предмет.тип == М.предмет_структури_Число");
      вернути;
    }

    якщо предмет.тип == М.предмет_структури_Текст {
      позначити_предмет_тексту(М, предмет як адреса<ПредметТексту>);
      вернути;
    }

    якщо предмет.тип == М.предмет_структури_Код {
      позначити_предмет_коду(М, предмет як адреса<ПредметКоду>);
      вернути;
    }

    якщо предмет.тип == М.предмет_структури_Дія {
      позначити_предмет_дії(М, предмет як адреса<ПредметДії>);
      вернути;
    }

    якщо предмет.тип == М.предмет_структури_Список {
      позначити_предмет_списку(М, предмет як адреса<ПредметСписку>);
      вернути;
    }

    якщо предмет.тип == М.предмет_структури_Словник {
      позначити_предмет_словника(М, предмет як адреса<ПредметСловника>);
      вернути;
    }

    якщо предмет.тип == М.предмет_структури_Дані {
      позначити_предмет_даних(М, предмет як адреса<ПредметДаних>);
      вернути;
    }

    якщо предмет.тип == М.предмет_структури_ДіапазонЧисел {
      позначити_предмет_діапазону_чисел(М, предмет як адреса<ПредметДіапазонуЧисел>);
      вернути;
    }

    якщо предмет.тип == М.предмет_структури_ПеребірДіапазонуЧисел {
      позначити_предмет_перебору_діапазону_чисел(М, предмет як адреса<ПредметПереборуДіапазонуЧисел>);
      вернути;
    }

    якщо предмет.тип == М.предмет_структури_ПеребірДаних {
      позначити_предмет_перебору_даних(М, предмет як адреса<ПредметПереборуДаних>);
      вернути;
    }

    якщо предмет.тип == М.предмет_структури_ПеребірПослідовності {
      позначити_предмет_перебору_послідовності(М, предмет як адреса<ПредметПереборуПослідовності>);
      вернути;
    }

    якщо предмет.тип == М.предмет_структури_ПеребірСловника {
      позначити_предмет_перебору_словника(М, предмет як адреса<ПредметПереборуСловника>);
      вернути;
    }

    якщо предмет.тип == М.предмет_структури_ПеребірСписку {
      позначити_предмет_перебору_списку(М, предмет як адреса<ПредметПереборуСписку>);
      вернути;
    }

    якщо предмет.тип == М.предмет_структури_ПеребірТексту {
      позначити_предмет_перебору_тексту(М, предмет як адреса<ПредметПереборуТексту>);
      вернути;
    }

    якщо предмет.тип == М.предмет_структури_Послідовність {
      позначити_предмет_послідовності(М, предмет як адреса<ПредметПослідовності>);
      вернути;
    }

    позначити_складений_предмет(М, предмет як адреса<СкладенийПредмет>);
  }

  внутрішня дія позначити_предмет_послідовності(
    М: адреса<Машина>,
    послідовність: адреса<ПредметПослідовності>
  ) {
    якщо послідовність.позначено {
      вернути;
    }

    послідовність.позначено = так;

    змінна п: природне = 0;

    поки п < послідовність.розмір {
      якщо послідовність.елементи[п].вид == ЗМашиннийПредмет або послідовність.елементи[п].вид == ЗСкладенийПредмет {
        позначити_предмет(М, послідовність.елементи[п].дані як адреса<Предмет>);
      }

      п += 1;
    }
  }

  внутрішня дія позначити_предмет_структури(
    М: адреса<Машина>,
    предмет_структури: адреса<ПредметСтруктури>
  ) {
    якщо предмет_структури.позначено {
      вернути;
    }

    предмет_структури.позначено = так;

    якщо предмет_структури.назва != пусто {
      позначити_предмет_тексту(М, предмет_структури.назва);
    }

    якщо предмет_структури.параметри != пусто {
      позначити_предмет_послідовності(М, предмет_структури.параметри як адреса<ПредметПослідовності>);
    }

    позначити_методи(М, предмет_структури.методи);
    позначити_властивості(М, предмет_структури.властивості);
  }

  внутрішня дія позначити_предмет_модуля(
    М: адреса<Машина>,
    предмет_модуля: адреса<ПредметМодуля>
  ) {
    якщо предмет_модуля.позначено {
      вернути;
    }

    предмет_модуля.позначено = так;

    якщо предмет_модуля.назва != пусто {
      позначити_предмет_тексту(М, предмет_модуля.назва);
    }

    позначити_властивості(М, предмет_модуля.властивості);
  }

  внутрішня дія позначити_предмет_параметра(
    М: адреса<Машина>,
    предмет_параметра: адреса<ПредметПараметра>
  ) {
    якщо предмет_параметра.позначено {
      вернути;
    }

    // вивести_кд(М, "позначити_предмет_параметра: ");
    // надрукувати_кд(М, предмет_параметра.назва.значення);

    предмет_параметра.позначено = так;

    якщо предмет_параметра.назва != пусто {
      позначити_предмет_тексту(М, предмет_параметра.назва);
    }

    якщо предмет_параметра.тип_ != пусто {
      // ...
    }

    якщо предмет_параметра.дія_значення != пусто {
      позначити_предмет_дії(М, предмет_параметра.дія_значення);
    }
  }

  внутрішня дія позначити_предмет_тексту(
    М: адреса<Машина>,
    предмет_тексту: адреса<ПредметТексту>
  ) {
    якщо предмет_тексту.позначено {
      вернути;
    }

    предмет_тексту.позначено = так;
  }

  внутрішня дія позначити_предмет_коду(
    М: адреса<Машина>,
    предмет_коду: адреса<ПредметКоду>
  ) {
    якщо предмет_коду.позначено {
      вернути;
    }

    предмет_коду.позначено = так;

    якщо предмет_коду.константи != пусто {
      позначити_предмет_послідовності(М, предмет_коду.константи);
    }

    якщо предмет_коду.вказівки != пусто {
      позначити_предмет_даних(М, предмет_коду.вказівки);
    }

    якщо предмет_коду.шлях != пусто {
      позначити_предмет_даних(М, предмет_коду.шлях);
    }
  }

  внутрішня дія позначити_предмет_дії(
    М: адреса<Машина>,
    предмет_дії: адреса<ПредметДії>
  ) {
    якщо предмет_дії.позначено {
      вернути;
    }

    // вивести_кд(М, "позначити_предмет_дії: ");
    // надрукувати_кд(М, предмет_дії.назва.значення);

    предмет_дії.позначено = так;

    якщо предмет_дії.дійсність_створення != пусто {
      позначити_дійсність(М, предмет_дії.дійсність_створення);
    }

    позначити_предмет_послідовності(М, предмет_дії.параметри як адреса<ПредметПослідовності>);

    якщо предмет_дії.назва != пусто {
      позначити_предмет_тексту(М, предмет_дії.назва);
    }

    // якщо предмет_дії.тип_результату != пусто {
    //   позначити_предмет(М, предмет_дії.тип_результату);
    // }

    якщо не предмет_дії.рідна {
      позначити_предмет_коду(М, предмет_дії.код як адреса<ПредметКоду>);
    }

    якщо предмет_дії.метод_структури != пусто {
      позначити_предмет_структури(М, предмет_дії.метод_структури);
    }

    якщо предмет_дії.шлях_до_теки_модулів != пусто {
      позначити_предмет_даних(М, предмет_дії.шлях_до_теки_модулів);
    }
  }

  внутрішня дія позначити_предмет_списку(
    М: адреса<Машина>,
    предмет_списку: адреса<ПредметСписку>
  ) {
    якщо предмет_списку.позначено {
      вернути;
    }

    предмет_списку.позначено = так;

    змінна п: природне = 0;

    поки п < предмет_списку.розмір {
      якщо предмет_списку.елементи[п].вид == ЗМашиннийПредмет або предмет_списку.елементи[п].вид == ЗСкладенийПредмет {
        позначити_предмет(М, предмет_списку.елементи[п].дані як адреса<Предмет>);
      }

      п += 1;
    }
  }

  внутрішня дія позначити_предмет_словника(
    М: адреса<Машина>,
    предмет_словника: адреса<ПредметСловника>
  ) {
    якщо предмет_словника.позначено {
      вернути;
    }

    предмет_словника.позначено = так;

    змінна п: природне = 0;

    поки п < предмет_словника.розмір {
      якщо предмет_словника.елементи[п].ключ.вид == ЗМашиннийПредмет або предмет_словника.елементи[п].ключ.вид == ЗСкладенийПредмет {
        позначити_предмет(М, предмет_словника.елементи[п].ключ.дані як адреса<Предмет>);
      }

      якщо предмет_словника.елементи[п].значення.вид == ЗМашиннийПредмет або предмет_словника.елементи[п].значення.вид == ЗСкладенийПредмет {
        позначити_предмет(М, предмет_словника.елементи[п].значення.дані як адреса<Предмет>);
      }

      п += 1;
    }
  }

  внутрішня дія позначити_предмет_даних(
    М: адреса<Машина>,
    предмет_даних: адреса<ПредметДаних>
  ) {
    якщо предмет_даних.позначено {
      вернути;
    }

    предмет_даних.позначено = так;
  }

  внутрішня дія позначити_предмет_діапазону_чисел(
    М: адреса<Машина>,
    предмет_діапазону_чисел: адреса<ПредметДіапазонуЧисел>
  ) {
    якщо предмет_діапазону_чисел.позначено {
      вернути;
    }

    предмет_діапазону_чисел.позначено = так;
  }

  внутрішня дія позначити_предмет_перебору_діапазону_чисел(
    М: адреса<Машина>,
    предмет_перебору_діапазону_чисел: адреса<ПредметПереборуДіапазонуЧисел>
  ) {
    якщо предмет_перебору_діапазону_чисел.позначено {
      вернути;
    }

    предмет_перебору_діапазону_чисел.позначено = так;

    якщо предмет_перебору_діапазону_чисел.предмет_діапазону != пусто {
      позначити_предмет_діапазону_чисел(М, предмет_перебору_діапазону_чисел.предмет_діапазону);
    }
  }

  внутрішня дія позначити_предмет_перебору_даних(
    М: адреса<Машина>,
    предмет_перебору_даних: адреса<ПредметПереборуДаних>
  ) {
    якщо предмет_перебору_даних.позначено {
      вернути;
    }

    предмет_перебору_даних.позначено = так;

    якщо предмет_перебору_даних.предмет_даних != пусто {
      позначити_предмет_даних(М, предмет_перебору_даних.предмет_даних);
    }
  }

  внутрішня дія позначити_предмет_перебору_послідовності(
    М: адреса<Машина>,
    предмет_перебору_послідовності: адреса<ПредметПереборуПослідовності>
  ) {
    якщо предмет_перебору_послідовності.позначено {
      вернути;
    }

    предмет_перебору_послідовності.позначено = так;

    якщо предмет_перебору_послідовності.предмет_послідовності != пусто {
      позначити_предмет_послідовності(М, предмет_перебору_послідовності.предмет_послідовності);
    }

    якщо предмет_перебору_послідовності.поточне_значення.вид == ЗМашиннийПредмет або предмет_перебору_послідовності.поточне_значення.вид == ЗСкладенийПредмет {
      позначити_предмет(М, предмет_перебору_послідовності.поточне_значення.дані як адреса<Предмет>);
    }
  }

  внутрішня дія позначити_предмет_перебору_словника(
    М: адреса<Машина>,
    предмет_перебору_словника: адреса<ПредметПереборуСловника>
  ) {
    якщо предмет_перебору_словника.позначено {
      вернути;
    }

    предмет_перебору_словника.позначено = так;

    якщо предмет_перебору_словника.предмет_словника != пусто {
      позначити_предмет_словника(М, предмет_перебору_словника.предмет_словника);
    }

    якщо предмет_перебору_словника.поточне_значення.вид == ЗМашиннийПредмет або предмет_перебору_словника.поточне_значення.вид == ЗСкладенийПредмет {
      позначити_предмет(М, предмет_перебору_словника.поточне_значення.дані як адреса<Предмет>);
    }
  }

  внутрішня дія позначити_предмет_перебору_списку(
    М: адреса<Машина>,
    предмет_перебору_списку: адреса<ПредметПереборуСписку>
  ) {
    якщо предмет_перебору_списку.позначено {
      вернути;
    }

    предмет_перебору_списку.позначено = так;

    якщо предмет_перебору_списку.предмет_списку != пусто {
      позначити_предмет_списку(М, предмет_перебору_списку.предмет_списку);
    }

    якщо предмет_перебору_списку.поточне_значення.вид == ЗМашиннийПредмет або предмет_перебору_списку.поточне_значення.вид == ЗСкладенийПредмет {
      позначити_предмет(М, предмет_перебору_списку.поточне_значення.дані як адреса<Предмет>);
    }
  }

  внутрішня дія позначити_предмет_перебору_тексту(
    М: адреса<Машина>,
    предмет_перебору_тексту: адреса<ПредметПереборуТексту>
  ) {
    якщо предмет_перебору_тексту.позначено {
      вернути;
    }

    предмет_перебору_тексту.позначено = так;

    якщо предмет_перебору_тексту.предмет_тексту != пусто {
      позначити_предмет_тексту(М, предмет_перебору_тексту.предмет_тексту);
    }
  }

  внутрішня дія позначити_складений_предмет(
    М: адреса<Машина>,
    складений_предмет: адреса<СкладенийПредмет>
  ) {
    якщо складений_предмет.позначено {
      вернути;
    }

    складений_предмет.позначено = так;

    позначити_властивості(М, складений_предмет.властивості);
  }

  внутрішня дія позначити_накопичувач_значень(
    М: адреса<Машина>,
    накопичувач_значень: НакопичувачЗначень
  ) {
    змінна п: природне = 0;

    // вивести_кд(М, "позначення накопичувача значень... розмір: ");
    // надрукувати_п64(М, накопичувач_значень.розмір);

    поки п < накопичувач_значень.розмір {
      якщо накопичувач_значень.дані[п].вид == ЗМашиннийПредмет або накопичувач_значень.дані[п].вид == ЗСкладенийПредмет {
        позначити_предмет(М, накопичувач_значень.дані[п].дані як адреса<Предмет>);
      }

      п += 1;
    }
  }

  внутрішня дія позначити_спроби(
    М: адреса<Машина>,
    спроби: Спроби
  ) {
    змінна п: природне = 0;

    поки п < спроби.розмір {
      змінна спроба = спроби.дані[п];

      якщо спроба.назва_зловити != пусто {
        позначити_предмет_тексту(М, спроба.назва_зловити);
      }

      п += 1;
    }
  }

  внутрішня дія позначити_історію_здійснення(
    М: адреса<Машина>,
    історія_здійснення: ІсторіяЗдійснення
  ) {
    змінна п: природне = 0;

    // вивести_кд(М, "позначення історії здійснення... розмір: ");
    // надрукувати_п64(М, історія_здійснення.розмір);

    поки п < історія_здійснення.розмір {
      змінна елемент = історія_здійснення.дані[п];

      позначити_спроби(М, елемент.спроби);

      якщо елемент.дійсність != пусто {
        позначити_дійсність(М, елемент.дійсність);
      }

      якщо елемент.здійснювач.вид == ЗМашиннийПредмет або елемент.здійснювач.вид == ЗСкладенийПредмет {
        позначити_предмет(М, елемент.здійснювач.дані як адреса<Предмет>);
      }

      якщо елемент.предмет_дії != пусто {
        позначити_предмет_дії(М, елемент.предмет_дії);
      }

      позначити_задіяні(М, елемент.задіяні);

      позначити_місцезнаходження(М, елемент.місцезнаходження);

      п += 1;
    }
  }

  внутрішня дія позначити_місцезнаходження(
    М: адреса<Машина>,
    місцезнаходження: Місцезнаходження
  ) {
    змінна шлях = місцезнаходження.шлях_або_код як адреса<ПредметДаних> як адреса<Предмет>;

    якщо шлях != пусто {
      позначити_предмет(М, шлях);
    }
  }

  внутрішня дія позначити_константи_назв(
    М: адреса<Машина>,
    константи_назв: КонстантиНазв
  ) {
    позначити_предмет_тексту(М, М.константи_назв._значення);
    позначити_предмет_тексту(М, М.константи_назв._дійсне);
    позначити_предмет_тексту(М, М.константи_назв._Послідовність);
    позначити_предмет_тексту(М, М.константи_назв._дійсність);
    позначити_предмет_тексту(М, М.константи_назв._Предмет);
    позначити_предмет_тексту(М, М.константи_назв._Структура);
    позначити_предмет_тексту(М, М.константи_назв._Модуль);
    позначити_предмет_тексту(М, М.константи_назв._Параметр);
    позначити_предмет_тексту(М, М.константи_назв._Число);
    позначити_предмет_тексту(М, М.константи_назв._Текст);
    позначити_предмет_тексту(М, М.константи_назв._Код);
    позначити_предмет_тексту(М, М.константи_назв._Дія);
    позначити_предмет_тексту(М, М.константи_назв._Список);
    позначити_предмет_тексту(М, М.константи_назв._Словник);
    позначити_предмет_тексту(М, М.константи_назв._Дані);
    позначити_предмет_тексту(М, М.константи_назв._ДіапазонЧисел);
    позначити_предмет_тексту(М, М.константи_назв._ПеребірДіапазонуЧисел);
    позначити_предмет_тексту(М, М.константи_назв._ПеребірСписку);
    позначити_предмет_тексту(М, М.константи_назв._далі);
    позначити_предмет_тексту(М, М.константи_назв._з);
    позначити_предмет_тексту(М, М.константи_назв._довжина);
    позначити_предмет_тексту(М, М.константи_назв._0);
    позначити_предмет_тексту(М, М.константи_назв._1);
    позначити_предмет_тексту(М, М.константи_назв._модуль);
    позначити_предмет_тексту(М, М.константи_назв._пак);
    позначити_предмет_тексту(М, М.константи_назв._біб);
    позначити_предмет_тексту(М, М.константи_назв._математика);
    позначити_предмет_тексту(М, М.константи_назв._читати);
    позначити_предмет_тексту(М, М.константи_назв._перед);
    позначити_предмет_тексту(М, М.константи_назв._розмір);
    позначити_предмет_тексту(М, М.константи_назв._чародія);
    позначити_предмет_тексту(М, М.константи_назв._чародія_число);
    позначити_предмет_тексту(М, М.константи_назв._чародія_текст);
    позначити_предмет_тексту(М, М.константи_назв._чародія_діапазон);
    позначити_предмет_тексту(М, М.константи_назв._чародія_перебір);
    позначити_предмет_тексту(М, М.константи_назв._дія_перевірки);
    позначити_предмет_тексту(М, М.константи_назв._дія_перетворення);
    позначити_предмет_тексту(М, М.константи_назв._додати);
    позначити_предмет_тексту(М, М.константи_назв._забрати);
    позначити_предмет_тексту(М, М.константи_назв._знайти);
    позначити_предмет_тексту(М, М.константи_назв._знайти_позицію);
    позначити_предмет_тексту(М, М.константи_назв._фільтрований);
    позначити_предмет_тексту(М, М.константи_назв._перетворений);
    позначити_предмет_тексту(М, М.константи_назв._обернений);
    позначити_предмет_тексту(М, М.константи_назв._містить);
    позначити_предмет_тексту(М, М.константи_назв._ключ);
    позначити_предмет_тексту(М, М.константи_назв._ключі);
    позначити_предмет_тексту(М, М.константи_назв._список);
    позначити_предмет_тексту(М, М.константи_назв._словник);
    позначити_предмет_тексту(М, М.константи_назв._послідовність);
    позначити_предмет_тексту(М, М.константи_назв._дані);
    позначити_предмет_тексту(М, М.константи_назв._діапазон);
    позначити_предмет_тексту(М, М.константи_назв._ПеребірПослідовності);
    позначити_предмет_тексту(М, М.константи_назв._ПеребірДаних);
    позначити_предмет_тексту(М, М.константи_назв._назва);
    позначити_предмет_тексту(М, М.константи_назв._параметри);
    позначити_предмет_тексту(М, М.константи_назв._тип_результату);
    позначити_предмет_тексту(М, М.константи_назв._код);
    позначити_предмет_тексту(М, М.константи_назв._константи);
    позначити_предмет_тексту(М, М.константи_назв._вказівки);
    позначити_предмет_тексту(М, М.константи_назв._шлях);
    позначити_предмет_тексту(М, М.константи_назв._ПеребірСловника);
    позначити_предмет_тексту(М, М.константи_назв._Е);
    позначити_предмет_тексту(М, М.константи_назв._ПІ);
    позначити_предмет_тексту(М, М.константи_назв._ЛОГ2Е);
    позначити_предмет_тексту(М, М.константи_назв._ЛОГ10Е);
    позначити_предмет_тексту(М, М.константи_назв._ЛОГ2);
    позначити_предмет_тексту(М, М.константи_назв._ЛОГ10);
    позначити_предмет_тексту(М, М.константи_назв._КОРІНЬ2);
    позначити_предмет_тексту(М, М.константи_назв._КОРІНЬ1_2);
    позначити_предмет_тексту(М, М.константи_назв._синус);
    позначити_предмет_тексту(М, М.константи_назв._косинус);
    позначити_предмет_тексту(М, М.константи_назв._тангенс);
    позначити_предмет_тексту(М, М.константи_назв._арксинус);
    позначити_предмет_тексту(М, М.константи_назв._арккосинус);
    позначити_предмет_тексту(М, М.константи_назв._арктангенс);
    позначити_предмет_тексту(М, М.константи_назв._арктангенс2);
    позначити_предмет_тексту(М, М.константи_назв._абсолютне);
    позначити_предмет_тексту(М, М.константи_назв._експонента);
    позначити_предмет_тексту(М, М.константи_назв._корінь);
    позначити_предмет_тексту(М, М.константи_назв._стеля);
    позначити_предмет_тексту(М, М.константи_назв._підлога);
    позначити_предмет_тексту(М, М.константи_назв._округлити);
    позначити_предмет_тексту(М, М.константи_назв._ПеребірТексту);
    позначити_предмет_тексту(М, М.константи_назв._текст);
    позначити_предмет_тексту(М, М.константи_назв._система);
    позначити_предмет_тексту(М, М.константи_назв._прочитати);
    позначити_предмет_тексту(М, М.константи_назв._тип);
    позначити_предмет_тексту(М, М.константи_назв._записати);
    позначити_предмет_тексту(М, М.константи_назв._куди);
  }

  внутрішня дія позначити_взяті_значення(
    М: адреса<Машина>,
    взяті_значення: ВзятіЗначення
  ) {
    змінна п: природне = 0;

    поки п < взяті_значення.розмір {
      змінна взяте_значення = взяті_значення.дані[п]::адреса;

      якщо взяте_значення.шлях != пусто {
        позначити_предмет_даних(М, взяте_значення.шлях);
      }

      якщо взяте_значення.значення.вид == ЗМашиннийПредмет або взяте_значення.значення.вид == ЗСкладенийПредмет {
        позначити_предмет(М, взяте_значення.значення.дані як адреса<Предмет>);
      }

      п += 1;
    }
  }

  внутрішня дія позначити_методи(
    М: адреса<Машина>,
    методи: Методи
  ) {
    змінна п: природне = 0;

    поки п < методи.розмір {
      змінна метод = методи.дані[п];

      позначити_предмет_тексту(М, метод.назва);

      якщо метод.значення != пусто {
        позначити_предмет_дії(М, метод.значення);
      }

      п += 1;
    }
  }

  внутрішня дія позначити_властивості(
    М: адреса<Машина>,
    призначення: Призначення
  ) {
    змінна п: природне = 0;

    поки п < призначення.вмісткість {
      змінна призначене = призначення.дані[п];

      поки призначене != пусто {
        позначити_предмет_тексту(М, призначене.назва);

        якщо призначене.значення.вид == ЗМашиннийПредмет або призначене.значення.вид == ЗСкладенийПредмет {
          позначити_предмет(М, призначене.значення.дані як адреса<Предмет>);
        }

        призначене = призначене.наступний;
      }

      п += 1;
    }
  }

  внутрішня дія позначити_притримувач(
    М: адреса<Машина>,
    притримувач: адреса<Притримувач>
  ) {
    змінна притриманий = притримувач.перший;

    поки притриманий != пусто {
      якщо притриманий.предмет != пусто {
        позначити_предмет(М, притриманий.предмет);
      }

      притриманий = притриманий.наступний;
    }
  }

  внутрішня дія позначити_чергу_здійснення(
    М: адреса<Машина>,
    черга_здійснення: ЧергаЗдійснення
  ) {
    змінна елемент = черга_здійснення.перший;

    поки елемент != пусто {
      якщо елемент.значення.вид == ЗМашиннийПредмет або елемент.значення.вид == ЗСкладенийПредмет {
        позначити_предмет(М, елемент.значення.дані як адреса<Предмет>);
      }
      позначити_задіяні(М, елемент.задіяні);
      елемент = елемент.наступний;
    }
  }

  внутрішня дія позначити_задіяні(
    М: адреса<Машина>,
    задіяні: Задіяні
  ) {
    змінна п: природне = 0;

    поки п < задіяні.розмір {
      якщо задіяні.дані[п].вид == ЗМашиннийПредмет або задіяні.дані[п].вид == ЗСкладенийПредмет {
        позначити_предмет(М, задіяні.дані[п].дані як адреса<Предмет>);
      }

      п += 1;
    }

    п = 0;

    поки п < задіяні.розмір_імен {
      позначити_предмет_тексту(М, задіяні.дані_імен[п]);

      п += 1;
    }
  }

  внутрішня дія позначити_іменовано_задіяні(
    М: адреса<Машина>,
    іменовано_задіяні: адреса<ІменованіЗадіяні>
  ) {
    змінна п: природне = 0;

    поки п < іменовано_задіяні.розмір {
      змінна елемент = іменовано_задіяні.елементи[п];

      позначити_предмет_тексту(М, елемент.назва);

      якщо елемент.значення.вид == ЗМашиннийПредмет або елемент.значення.вид == ЗСкладенийПредмет {
        позначити_предмет(М, елемент.значення.дані як адреса<Предмет>);
      }

      п += 1;
    }
  }

  // позначка: прохід по типах предметів
  внутрішня дія позначити(
    М: адреса<Машина>
  ) {
    позначити_предмет_структури(М, М.предмет_структури_Структура);
    позначити_предмет_структури(М, М.предмет_структури_Дані);
    позначити_предмет_структури(М, М.предмет_структури_ДіапазонЧисел);
    позначити_предмет_структури(М, М.предмет_структури_Дія);
    позначити_предмет_структури(М, М.предмет_структури_Код);
    позначити_предмет_структури(М, М.предмет_структури_Модуль);
    позначити_предмет_структури(М, М.предмет_структури_Параметр);
    позначити_предмет_структури(М, М.предмет_структури_ПеребірДаних);
    позначити_предмет_структури(М, М.предмет_структури_ПеребірДіапазонуЧисел);
    позначити_предмет_структури(М, М.предмет_структури_ПеребірПослідовності);
    позначити_предмет_структури(М, М.предмет_структури_ПеребірСловника);
    позначити_предмет_структури(М, М.предмет_структури_ПеребірСписку);
    позначити_предмет_структури(М, М.предмет_структури_ПеребірТексту);
    позначити_предмет_структури(М, М.предмет_структури_Послідовність);
    позначити_предмет_структури(М, М.предмет_структури_Словник);
    позначити_предмет_структури(М, М.предмет_структури_Список);
    позначити_предмет_структури(М, М.предмет_структури_Текст);
    позначити_предмет_структури(М, М.предмет_структури_Число);

    позначити_предмет_послідовності(М, М.предмет_пустої_послідовності);

    позначити_дійсність(М, М.глобальна_дійсність);
    позначити_накопичувач_значень(М, М.накопичувач_значень);
    позначити_історію_здійснення(М, М.історія_здійснення);
    якщо М.значення_падіння.вид == ЗМашиннийПредмет або М.значення_падіння.вид == ЗСкладенийПредмет {
      позначити_предмет(М, М.значення_падіння.дані як адреса<Предмет>);
    }
    позначити_місцезнаходження(М, М.місцезнаходження_падіння);
    позначити_константи_назв(М, М.константи_назв);
    позначити_взяті_значення(М, М.взяті_значення);
    позначити_чергу_здійснення(М, М.черга_здійснення);

    змінна притримувач = М.глобальний_притримувач;

    поки притримувач != пусто {
      позначити_притримувач(М, притримувач);

      притримувач = притримувач.наступний;
    }
  }

  дія запустити_очищувач(
    М: адреса<Машина>
  ) {
    //  надрукувати_кд(М, "очищува запущено");

    позначити(М);

    змінна попередній_предмет: адреса<Предмет> = пусто;
    змінна предмет = М.перший_предмет;

    поки предмет != пусто {
      якщо предмет.позначено {
        предмет.позначено = ні;

        попередній_предмет = предмет;

        предмет = предмет.наступний;
      } інакше {
        змінна предмет_до_знищення = предмет;

        предмет = предмет.наступний;

        попередній_предмет.наступний = предмет;

        звільнити_предмет(М, предмет_до_знищення);

        М.кількість_дійсних -= 1;
      }
    }

    М.останній_предмет = попередній_предмет;

    М.кількість_дійсних_для_очищення = (М.кількість_дійсних * 5) + 1;

    М.потребує_очищення = ні;

    змінна дійсність = М.перша_дійсність;

    поки дійсність != пусто {
      дійсність.позначено = ні;

      дійсність = дійсність.наступна;
    }
  }
}