Об отсутствии теорииОпределения конечной последовательности мне внезапно найти в нормальных источниках не удалось (mathworld дает определение "упорядоченное множество математических объектов", что явно не является определением вообще - что такое "математический объект"? ну и считать множество вещественных чисел последовательностью ИМХО странно)
Получается, у нас и готовой теории для языков нет? Тогда Вы правильно пытались что-то изобрести с нумерацией, а я правильно возражал, что нумерация не должна быть фиксированной, потому что важен только порядок. И так совместными усилиями пришли к идее, которую, вроде, можно взять за основу формализма (не в исходном виде, возможно, но в принципиальном –подробности будут ниже).
Конечно, формализм мы можем сделать и сами (если Вы не против) – хотя бы какие-то нужные уже сейчас основы теории языков. Какой уже раз тут такие «сюрпризы» с формализмом. Это продуктивно, конечно, но иногда думаешь: «Я слишком стар для этого …» (с) Дэнни Гловер :)))
Про «разница есть».Как это никакой - это два разных множества.
Можно, конечно, ввести (понятно какое) отношение эквивалентности на них, но опять же нужно это явно сделать.
На самом деле разницы нет для слов. Про это и говорит необходимость задания эквивалентности – но только пока происходит использование чужого аппарата теории множеств в этой области математики с недостаточным (пока ещё) собственным аппаратом. И разница, которой нет для слов – есть в обозначении – так как обозначения для множеств в отношении специфических объектов создают видимость тех свойств, которыми множества обычно обладают, но не обладают разбираемые объекты. И легко принять эту видимость за реальные свойства. Наверно поэтому в теориях первого порядка – когда их формализация состоялась – обозначения из другой теории (из теории множеств в том числе) не используют.
Например, для операции умножения не пишут «отношение между множеством упорядоченных двоек и множеством чисел», а задают аксиомы при помощи знаков умножения, сложения, добавления единицы и равенства. Я не говорю про теорию множеств – в ней обозначения для теории множеств уместны :) Впрочем аксиомы теорию множеств я и рассматривал-то поверхностно пару раз.
Но в процессе разработки формализации удобно, и довольно часто, наверно, пользоваться аппаратом теории множеств. Но только как «строительными лесами», пока не готова теория для данной области. А при завершении формализации это неустойчивое средство (аппарат множеств) необходимо устранить из готовой теории, имхо.
Определение не может быть ошибочным?Определения не бывают ошибочными.
Может, на самом деле – потому что между правильной теорией и реальностью есть связь. И эта связь проявляется на этапах расширения теории, а теория (первого порядка и достаточно выразительная) всегда не полна. И связь эта опирается на «стандартную модель интерпретации». Для теории Пеано, например, эта модель – операции с реальными «счётными палочками», например.
Полным образом эта модель интерпретации описывается теорией 2-го порядка и эта теория – полна. (Для стандартной модели интерпретации арифметики всего 2 аксиомы 2-го порядка, насколько помню – сверх аксиом теории Пеано). Другое дело, что прикладного значения она не имеет. Аксиомы 2-го порядка в духе «все формулы, для которых верен принцип индукции» ничего не дают. Мы же не знаем в общем случае, какие формулы соответствуют этому – не можем пробежать бесконечность. Т.е. такая теория даже не является эффективно аксиоматизируемой. Но теория 1-го порядка на базе теории Пеано при своём расширении на неполное утверждение всегда имеет единственный вариант правильного расширения – либо само утверждение, либо его отрицание. Так как в стандартной модели интерпретации истинным является только одно из этих утверждений.
И если мы неправильно определим термин «слово», то оно будет обладать иными свойствами, чем требует стандартная модель интерпретации для правильной теории языков и правильно работать с ошибочной теорией станет невозможно, и способа для её корректного расширения не будет.
Например, если бы слова были определены как:
1. Конечные множества пар (номер, символ) и
2. Нумерацию можно использовать произвольную,
3. Но при этом строки не равны, даже при одинаковых символах, одинаковом их количестве и порядке в словах, но, если конкретные номера на одинаковых местах при данном порядке не равны в сравниваемых словах.
Тогда два идентичных слова – идентичных в «стандартной модели интерпретации» - были бы не равны в такой теории. И эта теория была бы не о том и вообще не годилась бы для развития. Поэтому формализация основ требует осторожности и скрупулёзности.
Использовать ли нумераторНо вообще - не так важно, о каких определениях конкретно договариваться, важно договориться о каких-то и дальше это не менять.
Можно называть типа-словом функцию из какого-то конечного подмножества натуральных чисел в алфавит. Такое определение вас устроит?
При этом нужно договориться, какие типа-слова считать равными. Скажем,
и
- это одно типа-слово или разные?
Если говорить о порядке на основе нумератора без повторов в духе
… Наличие такого нумератора, который обладает внешним (по отношению к самой строке) порядком, кажется добавлением излишних свойств к тому, чем должна обладать строка в «базовом» случае. Вообще сомнительно, что несколько подстрок могут «склеиваться» в одно слово, если выделить их внутри слова в некое подмножество. Не факт, что в исходном слове должен быть порядок между фрагментами, если эти фрагменты разделены «дырами».
Хотя в жизни такое «склеивание» имеет прикладное значение – но не знаю, подходит ли оно под термин «слово». Например: очередь не обычная, где каждый знает кто перед ним (в терминах программирования это стек, а не очередь – как ни странно – но и «элементы» в живой очереди не пассивны, а реагируют на «прерывание» - потерю предшественника), а электронная очередь. В электронной очереди номера могут быть с пропусками (какие-то «элементы» не пришли или отменили запись), а всё равно получается единый порядок из пришедших «элементов». Такие структуры правильнее, наверно, считать «списками», а то, что получается из фрагментов данного списка при «склеивании» в исходном порядке – «выпиской». И выписка – тоже список.
Но для соединения символов в слово есть способ примитивнее, чем упорядочивание символов элементами нумератора, который изначально обладает собственным порядком, независимым от строки (слова). Порядок внутри строки можно организовать «идентификаторами», которые даже не обладают собственной упорядоченностью. Такой способ упорядочивания идентификаторами примитивнее, чем использование нумератора и этот способ можно использовать как базовый для представления слова.
То, что я написал дальше – это попытка описать стандартную модель интерпретации для языков (для слов, в частности) и набросок «техзадания» для теории языков, соответствующей этой стандартной модели интерпретации. Разумеется, это не парадигма, а предмет для обсуждения.
То есть, я считаю важным не начинать формализацию сразу, а сначала определиться с тем, что именно необходимо формализовать: разобраться с тем, что является в данном случае стандартной моделью интерпретации. И ответ на этот вопрос не может быть совсем формальным (не в рамках логики 1-го порядка, по крайней мере).
Набросок для теории языковДля построения слова берём стек, каждый элемент которого имеет такой вид:
, где
– некоторый символ, а
и
берутся из какого-то ограниченного набора
со следующими свойствами:
1. Каждый
используется не больше 1 раза как
элемента (
- все элементы однозначны)
2. Каждый
используется не больше 1 раза как
следующего (
- отношения следования элементов однозначны)
3. Только один
не используется как
элемента (
)
4. Только один
не используется как
следующего (
)
5. Это разные
(в двух предыдущих пунктах)
6. Все способы выбора набора
и расстановки
в элементах дают одно и то же слово из данных символов – если исполнены предыдущие пункты и сохраняется прежний порядок, с началом из п.7 и выполнены условия п.8
7. Началом порядка считаем элемент с
из п.3, а концом – элемент с
из п.4
Начало и конец порядка симметричны при данных правилах с точностью до обмена названиями «полей» (термин из информатики для составных частей элемента) в элементах между
и
. Действительно, тогда
из п.3 становится
из п.4 и наоборот, а п.6 остаётся в силе (обмены – в названиях полей, но не в правилах).
В данном стеке (а описанные в пп. 1-7 элементы является элементами стека – если использовать термин из программирования) поле
названо не совсем обычно. В программе оно называлось бы в духе
(
предыдущего), скорее всего:
Потому что у стека есть одна «вершина» куда помещается новый элемент, и он сам становится новой вершиной с
равным
предыдущего элемента (если предыдущий элемент был), затем так же добавляется следующий элемент и т.д. Затем «вершину» можно забрать (убрать) и актуальной вершиной станет предыдущий для него элемент (номер
которого получена из поля
убранной вершины) и т.д. Работает такая структура в программах по принципу «последним вошёл – первым вышел».
Но в слове «вершина» стека у нас становится началом слова, так как, зная этот 1-й элемент, можно последовательно пробежать все последующие элементы
«прыгая» к
следующего элемента, равного
текущего.
8. Сразу надо оговорить те два набора значений для
, которые можно использовать на краях слова – для
первого элемента и
последнего элемента в слове. Эти наборы и будут ограничивать возможности переписать
в элементах при сохранении порядка.
Например, для п.3 (задающего начало слова) годится только
в качестве его
и больше он нигде (кроме начала) не используется, А для п.4 (для конца слова) годится только
в качестве его
с аналогичными условиями. Тогда у слова «запечатаны» оба конца, и оно «неделимо» – его сплошные фрагменты (меньшие, чем целое слово) не являются словами.
То есть, данный пункт 8 определяет, можно ли считать сплошной фрагмент внутри слова (взяв его как подмножество) словом. И это тоже будет характеристикой языка – а не жёсткая часть «базового» формализма.
Но можно задать и другое правило «запечатывания» для п.8: для некоторых «исключительных» слов разрешено иметь концы не запечатанными (оба или один из концов слова никак не ограничены в применяемых
– если это не нарушает порядок), а для прочих слов требование запечатанности должно исполняться. Тогда «исключительные» слова будут оставаться словами и внутри других слов.
Если говорить о словах на примере строк в компьютерных программах, то для начала и конца слова разрешены любые
– концы у слов не «запечатаны». Поэтому можно брать любую подстроку (прямо внутри исходного слова) и это тоже будет слово – операция логического равенства между такой подстрокой и некоторым словом (строкой) даст «истина». Это «некоторое слово» имеет тот же порядок и символы, что и подстрока, конечно.
«Компьютерный» способ выделения слов можно считать принципиальным для теории алгоритмов – ведь работа компьютеров нацелена на исполнение алгоритмов. То есть, тут для теории алгоритмов прикладная область и проверка на практике.
«Запечатывание» концов слова не имеет отношения к тому, есть у порядка начало и конец, или нет. Если есть порядок в конечном наборе элементов, положение которых в этом порядке не имеет повторов, то обязательно есть первый и последний элемент. Поэтому вопрос о «запечатанности» начала и конца слова – отдельный от наличия этих самых начала и конца. Но от «запечатанности» зависит то, будет ли сплошной фрагмент слова (расположенные подряд во внутреннем порядке слова символы) сам являться словом.
Сплошной фрагмент слова (сплошной относительно порядка в слове) будем называть подстрокой. Является ли подстрока словом – зависит от п.8 для данного языка. В обычных «компьютерных» правилах для языка строки и подстроки всегда являются словами, например.
Мне для доказательства (если оно верное) достаточно, чтобы можно было выделять «внутренние слова» определённого вида, при этом достаточно, чтобы данное «внутренние слова» можно было выделить только в самом начале рассматриваемого «слова-контейнера».
Видимо, неравенство
можно доказать и для «неделимых» слов, но это уже отдельный вопрос и такое доказательство более трудное, по всей видимости.
Сведения из программированияЗаметим, что и на практике (в программах, в учебниках и статьях по программированию и алгоритмам) точно также не встречаются выражения вида "слово внутри слова" и "внутреннее содержание слова". Если хотите, можно считать слово "интерфейсом" с двумя функциями - получения длины и получения
-го символа.
В программировании вообще термин «слово» не особо используется. К тому же «строка» в C (C#. C++) имеет на конце символ ‘0’. К тому же тип String вообще неизменный, а тип StringBilder возвращает подстроки типа String – то есть, не свой внутренний фрагмент. Но это же просто особенность реализации – как и конкретная нумерация символов, например. Если же говорить про последовательность символов, которая допускает получать внутренние фрагменты, то удобней рассмотреть объект Range языка VBA для Word – в тексте задаётся начальная и конечная позиция.
А последовательность символов (семейство символов – «Characters collection» – в реализации VBA), которая этому объекту соответствует, можно получить через свойство Range.Characters. И вот можно брать внутри одного объекта Range (пусть
) другой (вложенный) объект Range (пусть
). И соответствующие им «слова» будут последовательностями символов, при этом у
«слово» будет соответствовать фрагменту из исходного «слова»
. То есть, когда мы «очищаем» данные от реализации (специфического представления в данном языке), то фрагменты одних слов тоже оказываются словами – то есть объектами того же типа.
Но, кстати, действительно, для аксиом теории языков можно почти что скопировать некоторые свойства строк и подстрок из программирования как свойства слов. «Очистив» их от посторонних особенностей реализации, конечно.
И тогда то, что я написал выше про стандартную модель интерпретации просто принимается к сведению на случай выяснения каких-то тонких вопросов и при необходимости дополнения формализма. Хотя, наверно и там есть какие-то не учтённые мной нюансы )