Нужен автокод - иностранцам вежливо настраивать язык кириллический

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



МЯСЦО

Сообщений 1 страница 4 из 4

1

## Язык МЯСЦО — полная спецификация

### 1. Общие положения
МЯСЦО оперирует только **цепочками символов**. Цепочку можно **рассматривать как** запись числа в позиционной системе счисления с некоторым основанием. Применение действия рассмотрения обозначается с помощью унарных операторов `<2>`, `<10>`, `<16>`. Рассмотрение возможно, если цепочка состоит исключительно из символов соответствующего алфавита:
- для `<2>`: символы `⊤` и `⊥`;
- для `<10>`: цифры `0`–`9`;
- для `<16>`: символы специального 16‑ричного алфавита, разработанного по образцу кактовикских цифр (визуально простые, наглядно отражающие значения от 0 до 15).

Цепочка, которую никак не рассматривают, остаётся просто **цепочкой символов** (не рассматривается как число в позиционной системе счисления). 
Цепочка, которую рассматривают в некоторой системе счисления, называется **рассматриваемой в данной системе счисления** (например, «рассматриваемая в позиционной системе счисления с основанием 16»).

Обратный оператор `<>` убирает рассмотрение, оставляя только символы (цепочка перестаёт быть рассматриваемой как число).

Логические значения `⊤` (истина) и `⊥` (ложь) — цепочки, которые могут использоваться как есть или быть подвергнуты рассмотрению.

**Литералы** (константные цепочки) записываются в двойных кавычках, например: `"0101"`, `"123"`, `"⊤"`, `"Привет"`. Литерал сам по себе является простой цепочкой. Для того чтобы рассматривать литерал как число в некоторой системе счисления, перед ним ставится соответствующий унарный оператор: `<2>"1010"`, `<10>"123"`, `<16>"1A3F"`.

Программа состоит из строк с отступами, задающими блоки. Синтаксис комментариев не предусмотрен.

### 2. Операции

#### 2.1. Операции, работающие с символами цепочек (рассмотрение не учитывается)
Эти операции смотрят на цепочки только как на последовательности символов, независимо от того, рассматриваются ли они в какой-либо системе счисления.

##### 2.1.1. Длина
`|выражение|` 
Считает количество символов в цепочке.

2.1.1.1. Если текущая система счисления не задана, результат получается **рассматриваемым в десятичной системе счисления** (т.е. цепочка десятичных цифр интерпретируется как число по основанию 10).

2.1.1.2. Если задана текущая система счисления (см. 2.2.3), результат получается **рассматриваемым** в этой системе счисления.

##### 2.1.2. Срез — четыре формы:
`[L:R]` (включая обе границы), 
`[L:R)` (включая левую, исключая правую), 
`(L:R]` (исключая левую, включая правую), 
`(L:R)` (исключая обе). 
Берёт часть цепочки.

**2.1.2.1.** L и R — выражения, задающие левую и правую границы среза. Они вычисляются в текущем контексте (с учётом правил для выражений) и должны давать цепочки, которые могут быть **рассмотрены как целые неотрицательные числа**. Для этого к результату выражения неявно применяется оператор рассмотрения в системе счисления, определяемой контекстом (если контекст задан) или в десятичной системе (если контекст не задан). Полученные числа интерпретируются как индексы символов в исходной цепочке.

**2.1.2.2.** Если после вычисления и рассмотрения результат не является целым неотрицательным числом (например, содержит недопустимые символы или даёт отрицательное значение), возникает ошибка.

**2.1.2.3.** Индексация символов начинается с 0. Результирующая цепочка включает символы в соответствии с заданными границами и типом скобок. При этом **рассмотрение исходной цепочки сохраняется**: если исходная цепочка была рассматриваемой в некоторой системе счисления, результат среза также рассматривается в той же системе; если исходная была простой, результат остаётся простым.

##### 2.1.3. Конкатенация
`<>&`

**2.1.3.1.** Операнды склеиваются. Результат — цепочка, **не рассматриваемая как число в позиционной системе счисления**.

**2.1.3.2.** Операция работает с простыми цепочками, поэтому её операнды должны быть (или приводиться к) простыми цепочками. Любые операнды перед выполнением приводятся к простым цепочкам (к ним применяется оператор `<>`).

##### 2.1.4. Сравнение
`<>?` (равно) и `<>¿` (не равно) 
Перед сравнением оба операнда перестают рассматриваться как числа (к ним применяется `<>`). Затем выполняется посимвольное сравнение получившихся простых цепочек. Результат — цепочка со значением `⊤` или `⊥`, **не рассматриваемая как число в позиционной системе счисления**.

**Примечание:** Сравнение учитывает все символы, включая возможные ведущие нули. Пользователь сам отвечает за соответствие длины и формы записи; нормализация (например, удаление ведущих нулей) не производится.

#### 2.2. Операции, меняющие рассмотрение цепочки
*Данное — это цепочка. Режим рассмотрения — проблема рассматривающего. (Не ООП парадигма, а ФАП — философско-аспектное программирование).*

Эти унарные операторы изменяют то, рассматривается ли цепочка в какой-либо системе счисления и в какой именно.

##### 2.2.1. Начать рассматривать как
`<2>`, `<10>`, `<16>` 
* Если цепочка уже рассматривалась в другой системе счисления, создаётся новая цепочка, записывающая то же число в системе счисления с указанным основанием. 
* Если цепочка не рассматривалась как число, она проверяется на допустимость символов для новой системы счисления и начинает в ней рассматриваться. 
* Этот оператор также задаёт **текущую систему счисления** для всего выражения, в котором находится (см. 2.2.3).

##### 2.2.2. Перестать рассматривать
`<>` 
Убирает рассмотрение как числа, оставляя только символы цепочки. Результат — цепочка, **не рассматриваемая как число в позиционной системе счисления**.

**2.2.2.1.** Оператор `<>` должен возвращать цепочку, которая не рассматривается как число; способ достижения этого (копирование, разделение, снятие «линзы» с того же объекта) остаётся на усмотрение реализации и не влияет на корректность программы.

##### 2.2.3. Текущая система счисления (контекст)
При вычислении выражения может быть определена **текущая система счисления** (значение 2, 10 или 16), а может и не быть. Она задаётся следующими конструкциями:
- унарным оператором `<N>` (п. 2.2.1);
- бинарным оператором с явным указанием основания (`<N>op`) (п. 2.4.1, 2.4.2);
- присваиванием `<N>=` (см. раздел 2.3).

Внутри области действия такого оператора (т.е. при вычислении его операндов) текущая система счисления устанавливается равной N. Это влияет на:
- операцию длины `| |` (п. 2.1.1), которая при наличии текущей системы счисления выдаёт результат, рассматриваемый в этой системе; при отсутствии контекста результат рассматривается в десятичной системе;
- арифметические и побитовые операторы **без явного указания основания** (п. 2.4), которые внутри контекста ведут себя так, как если бы перед ними стояло `<N>` (т.е. операнды приводятся к текущей системе счисления перед выполнением операции);
- **вычисление индексов в срезе** (п. 2.1.2): выражения L и R вычисляются в текущем контексте, что может влиять на результат (например, если они содержат арифметические операции). При этом сам результат среза сохраняет рассмотрение исходной цепочки и не зависит от контекста.

Операции конкатенации `<>&` и сравнения `<>?`/`<>¿` от контекста не зависят — они всегда приводят операнды к простым цепочкам и работают с ними.

#### 2.3. Присваивание
- **Обычное** `имя = выражение` 
  Вычисляет выражение в текущем контексте (который может быть как задан, так и нет), запоминает результат и связывает с именем.
- **С преобразованием** `имя <N>= выражение` 
  Перед вычислением выражения текущая система счисления устанавливается в N. Выражение вычисляется в этом контексте, и результат получается рассматриваемым в системе счисления N.

#### 2.4. Операции, использующие рассмотрение цепочек как чисел

##### 2.4.1. Арифметические
`+`, `-`, `*`

**2.4.1.1. С явным указанием основания** 
Форма: `<N>+`, `<N>-`, `<N>*`, где N ∈ {2,10,16}. 
Поведение:
- Сначала операнды начинают рассматриваться как числа в позиционной системе счисления с основанием N (если они уже рассматривались в другом основании, создаётся новая цепочка, записывающая то же число в системе счисления с основанием N).
- Затем выполняется действие.
- Результат получается **рассматриваемым** в системе счисления с основанием N.
- Этот оператор также задаёт **текущую систему счисления** N для своих операндов.

**2.4.1.2. Без явного указания основания** 
Поведение зависит от наличия текущего контекста:

- **Если текущий контекст задан (равен M):** 
  Оба операнда приводятся к системе счисления M перед выполнением операции, и результат получается рассматриваемым в системе счисления M.

- **Если текущий контекст не задан:** 
  Возможны следующие случаи:
  * Оба операнда рассматриваются в одной и той же системе счисления N — результат получается рассматриваемым в системе счисления N.
  * Один операнд рассматривается в системе счисления N, а второй является простой цепочкой — простая цепочка приводится к системе счисления N (если её символы допустимы), результат получается рассматриваемым в системе счисления N.
  * Иные комбинации (оба простые, разные системы счисления) — ошибка.

##### 2.4.2. Побитовые
`∨` (ИЛИ), `∧` (И), `¬` (НЕ) 
* Допустимы только для оснований 2 и 16. 

**2.4.2.1. С явным указанием основания** 
Форма: `<2>∨`, `<16>∧`, `<2>¬` и т.п. 
Поведение аналогично 2.4.1.1, но с ограничением на допустимые основания.

**2.4.2.2. Без явного указания основания** 
Поведение зависит от наличия текущего контекста:

- **Если текущий контекст задан (равен M, где M ∈ {2,16}):** 
  Оба операнда приводятся к системе счисления M перед выполнением операции, и результат получается рассматриваемым в системе счисления M. Если M не равно 2 или 16 — ошибка.

- **Если текущий контекст не задан:** 
  * Оба операнда рассматриваются в одной и той же системе счисления N (N ∈ {2,16}) — для бинарных операций цепочки должны быть **одинаковой длины**, иначе ошибка. Результат получается рассматриваемым в системе счисления N.
  * Один операнд рассматривается в системе счисления N (N ∈ {2,16}), а второй является простой цепочкой — простая цепочка приводится к системе счисления N (если её символы допустимы и она имеет **ту же длину**, что и первый операнд), результат получается рассматриваемым в системе счисления N.
  * Иные комбинации — ошибка.

* Для `¬` операнд должен рассматриваться в 2 или 16 (простая цепочка не допускается).

##### 2.4.3. Отсутствие деления
Операция деления в языке отсутствует, так как не требуется для целевой области применения (кодирование инструкций процессоров) и её отсутствие упрощает семантику.

### 3. Приоритет и ассоциативность операций
Приоритет операций (от высшего к низшему):
1. Первичные: имена, литералы.
2. Постфиксные срезы.
3. Унарные префиксные: `<2>`, `<10>`, `<16>`, `<>`, `¬`.
4. `∧` (побитовое И) и `<N>∧`.
5. `∨` (побитовое ИЛИ) и `<N>∨`.
6. `*` (умножение) и `<N>*`.
7. `+`, `-` (сложение, вычитание) и `<N>+`, `<N>-`.
8. `<>&` (конкатенация).
9. `<>?`, `<>¿` (сравнение).

Для бинарных операторов, которые могут применяться последовательно (все, кроме сравнения), используется левая ассоциативность: `a op b op c` вычисляется как `(a op b) op c`. Операторы сравнения не предназначены для последовательного применения; запись вида `a <>? b <>? c` запрещена.

Скобки не используются — порядок вычислений управляется приоритетом и промежуточными переменными.

### 4. Управляющие конструкции
- `если условие то ... иначе ...` 
  Условие должно давать цепочку со значением `⊤` или `⊥` (как рассматриваемую, так и не рассматриваемую как число).
- `пока условие ...` 
  Аналогично.

### 5. Вывод
Выражение, записанное на отдельной строке без присваивания, вычисляется и выводится. 
- Если результат получается **рассматриваемым** в системе счисления с основанием N, он выводится как `<N>цепочка`.
- Если результат **не рассматривается** как число в позиционной системе счисления, выводится просто цепочка (без кавычек).

Примечание: результат операции длины при отсутствии контекста рассматривается в десятичной системе, поэтому выводится как `<10>цепочка`, например `<10>4`.

### 6. Обработка ошибок
- Использование имени, не определённого ранее.
- Недопустимые символы при попытке рассмотреть цепочку в системе счисления `<N>` (в том числе при приведении операндов контекстом или при вычислении индексов).
- В операциях, требующих числового рассмотрения операндов:
  * оба операнда простые при отсутствии контекста;
  * операнды имеют разные основания при отсутствии контекста;
  * контекст не может привести операнды к единому основанию (из-за недопустимых символов в простой цепочке).
- Побитовые операции с основанием 10.
- **Побитовые операции с цепочками разной длины** (как с явным указанием основания, так и без него).
- Вычитание с отрицательным результатом.
- Некорректные границы среза: левая граница больше правой, выход за пределы цепочки, индекс не является целым неотрицательным числом.
- Невозможность выполнить явное указание основания (например, конкатенация с `<N>&` даёт цепочку, которую нельзя рассматривать в N).
- Запись нескольких операторов сравнения подряд.

### 7. Заключение
Язык МЯСЦО предназначен для описания преобразований цепочек символов с возможностью их рассмотрения как чисел в системах счисления 2, 10 и 16. Контекст (текущая система счисления) позволяет единообразно обрабатывать выражения без многократного явного указания основания. Операция деления отсутствует как ненужная для целевой области. Пользователь самостоятельно отвечает за длину цепочек и наличие ведущих нулей; автоматическая нормализация не производится. Философская основа языка — разделение объекта (цепочка) и способа его рассмотрения (ФАП-парадигма). Язык не содержит латиницы, использует специальные 16‑ричные символы и логические `⊤`/`⊥`.

Реализация оставляется читателю в качестве упражнения

Отредактировано Лис (2026-03-12 07:29:55)

0

2

```
дано = <10>"165"
надо <2>= дано
пока |надо| <>? <10>"32" то
    надо <2>= "⊥" <>& надо
```

Берём десятичное число 165
преобразуем в двоичное: "⊤⊥⊤⊥⊥⊤⊥⊤" (8 бит)
пока длина не равна 32
    дописываем слева ⊥ и снова помечаем рассматриваемым как двоичное число

«пока |надо| <>? <10>"32" то»
можно записать как
«пока |надо| <>? "32" то»
или как
«пока |надо| <10>? "32" то»
или
«пока |надо| ? "32" то»
работать будет по-разному, но с одинаковым эффектом

Отредактировано Лис (2026-03-12 14:01:31)

0

3

Искины обнаружили в языке МЯСЦО фатальные недостатки:
- символы (или это были знаки?) в цепочке слишком абстрактные, их невозможно средствами языка привязать к листу бумаги;
- язык не определяет возможности считать цифры в цепочке начиная с разных сторон при вычислении значения числа;
- язык не позволяет группировать символы, например если цепочка битовая, но нет синтаксиса, определяющего байты, или их порядок.

--------------------------------------------------------------------

Цепочка (как топологический объект) — это:
    Множество элементов (символов).
    Отношение смежности на этом множестве, обладающее свойствами:
        Иррефлексивность: элемент не смежен сам с собой.
        Симметричность: если A смежен с B, то B смежен с A.
        Градуальность: у элемента может быть 0, 1 или 2 смежных.
        Связность: от любого элемента можно добраться до любого другого, переходя по смежным.
Это всё. Никаких «первый», «последний», «левый», «правый», «следующий».
"лево" и "право" — это внешние, культурно-обусловленные понятия,
которые не имеют отношения к математической сущности цепочки.
С тем же успехом, это могли бы быть "верхний" и "нижний" края (если бы цепочка не лежала, а висела).

Не хватает двух независимых выборов:
1) Выбор точки отсчета для индексации (какой конец цепочки считать началом для нумерации).
2) При преобразовании в число - выбор соответствия между индексами и весами разрядов.

Будем преобразовывать в число не одной а двумя линзами:

<→> - линза устанавливает порядок чтения цепочки такой же, как в тексте программы
<←> - линза устанавливает обратный порядок чтения цепочки

<2.> - малозначительный бит числа сопоставляется с началом цепочки
<.2> - самый весомый бит числа сопоставляется с началом цепочки

первая линза ещё могла бы использоваться перед оператором вырезания части цепочки.

--------------------------------------------------------------------

Мы не можем получить "цепочку байтов", потому что байт - это группа битов. А у нас в языке нет операции группировки цепочек в цепочку

Мы не можем склеить неориентированные цепочки, потому что не знаем, какие их концы склеивать
Были бы они ориентированные, мы бы склеивали «конец» первой с «началом» второй.
Конкатенация это операция, требующая знания, какие концы соединять.

Длина — это операция, которая не требует знания ориентации, потому что она работает с количеством, а не с порядком.
У неориентированных цепочек можно считать длину.

При конкатенировании мы можем сохранить порядок на цепочке-результате только в том случае, если все цепочки-операнды были ориентированы в одном направлении?

Может быть конкатенирование разделить на две операции - "группирование", и "уплощение группы"? Группирование бы давало цепочку цепочек.

Группирование не требует знания ориентации — оно просто создает структуру более высокого уровня,
где исходные цепочки становятся элементами (звеньями).

--------------------------------------------------------------------

неясно, как выводить неориентированную цепочку на печать.
Компьютер не может выбрать за человека, как именно его рисовать, если человек не указал способ.

Или в трансляторе сделать так, что при чтении текста программы любая цепочка
автоматически получала линзы по умолчанию, соответствующие культуре написания кода?

Если умолчаний нет — литерал остается неориентированным (и тогда программист должен явно применять линзы).

цепочка <→>= "⊤⊥⊤⊥"

--------------------------------------------------------------------

Мы когда добавляем индексирование в цепочку, мы не просто линзу накладываем, а
создаём новый объект, дополняя его фактом (или даже не фактом, а гипотезой), которого не было в исходных данных.

В тексте программы цепочки можно размечать явно, либо соглашением, либо синтаксически - *"цепочка" или "цепочка"*.

Отредактировано Лис (2026-03-17 12:48:43)

0

4

Какие языки программирования позволяют программировать гипотезы и абдукцию в явном виде?

«В отличие от стандартных императивных или объектно-ориентированных языков, поддержка абдукции и работы с гипотезами обычно требует особой теоретической основы.»

«теория ранжирования Шпона (Spohn's ranking theory)» - RankPL, это язык моделирования, который можно рассматривать как качественный вариант вероятностного языка программирования, это позволяет ему напрямую поддерживать абдукцию и вывод о причинах (causal inference).
В RankPL есть специальная инструкция observe, которая выполняет conditioning, аналогично вероятностным языкам, но в рамках теории ранжирования, что позволяет пересматривать ранги гипотез на основе наблюдений

«HYPROLOG это расширение логического языка Prolog, интегрирующее в него механизмы абдукции и работу с предположениями (assumptions). Он особенно полезен для обработки естественного языка, где часто требуется выдвигать гипотезы о скрытых лингвистических структурах. Использует Constraint Handling Rules (CHR) для эффективной обработки ограничений целостности, что делает абдуктивный вывод очень эффективным»

«Saul: Это объектно-функциональный язык, написанный на Scala, предназначенный для разработки систем, обучающихся на данных. Позволяет выполнять глобальный вывод, который уважает заданные ограничения (constraints), что является формой абдукции — поиск наиболее вероятного объяснения (набора значений переменных), удовлетворяющего всем ограничениям и данным.»

Отредактировано Лис (2026-03-17 14:55:43)

0