http://matt-merkulov.livejournal.com/28791.html
Итак, я закончил основу ЛЯСа. Компилятор с парочкой примеров качать здесь:
http://blitzetcetera.org/share/LYaS_0.1.zip. Текст в файле писать прописными русскими буквами в кодировке Win (Блокнотом можно).
Система интерпретатора:
Сначала хотел сделать образец попроще, но, поразмыслив и оглядев перспективы, понял, что зря потрачу время - потом придется все делать с нуля. Сразу сделал максимально гибкую структуру данных, а именно объекты с направленными связями разных типов между ними (так называемый направленный граф).
Сама программа состоит из набора служебных процедур и модулей. В начале программы из этих модулей формируется список и интерпретатор языка принимает команды - строки из файла. Сначала строка разбивается на слова. Для каждого слова создается объект в базе данных (если еще не создан) с соответствующим именем.
Затем по очереди перебираются модули. Каждый модуль имеет набор шаблонов, которые проверяются на совпадение со строкой (шаблоны могут содержать квантификаторы типа "любое слово", "любая последовательность слов"). Например, модуль "ТочкоРазделитель" содержит 2 шаблона - "&.&" и "&.". Это значит, шаблон сработает, если в середине или конце строки есть точка (т. к. & - любая последовательность слов). Шаблон "кто # ?" сработает только в том случае, если фраза будет состоять из 3-х слов, причем первое - "кто", а третье - "?"
Первый совпавший модуль запускается и ему передается массив списков слов на каждый из элементов массива (например строка "ты - компьютер. кто ты?" со сработавшим "ТочкоРазделителем", передаст ему массив ["ты", "-", "компьютер"],["."],["кто","ты","?"]), а также совпавший шаблон. Сам модуль может делать с эими данными все, что угодно (ТочкоРазделитель отправляет на обработку первый массив (как фразу) и третий (если есть), таким образом строка разделяется на последовательные фразы точкой).
Связи
Пока в интерпретаторе "зашиты" 4 типа связей:
1. "то же самое" - слово является идентичным по смыслу связанному с ним слову
2. "это" - вхождение слова, например яблоки - это фрукты, понятие "яблоки" входит в понятие "фрукты"
3. "содержит", обратная связь - понятие "фрукты" "содержит в себе" понятие "яблоки"
4. "поменять при ответе" - чтобы компьютер, например" отвечал "я" вместо "ты" и наоборот
С помощью связей типа 2 и 3 можно составить, например, схему биологических видов (организмы (растения (деревья, трава), животные (травоядные (корова, лошадь), хищники (лев)))
Модули
В данный момент доступны 7 видов модулей:
1. Разделитель строки точками на предложения
2. Вычленитель вопросительных предложений
3. Установщик ссылок "это" на объекты (например, "ель, лиственница - это хвойные деревья" - устанавливает 4 ссылки (ель - хвойная, ель - дерево, лиственница - хвойное, лиственница - дерево)
4. Вывод свойств объекта - объектов, на которые он ссылается, причем включая объекты, на которые ссылаются эти объекты и т. п. (например, "что такое ель?" - "ель - это хвойное, это дерево, это растение" (т. к. дерево - растение))
5. Проверка, ссылается ли один объект на другие, возможно через цепочку объектов ("ель - хищное растение?" - "нет, ель - растение, но не хищное.")
6. Перечисление объектов, включенных в данный (то же самое, что и вывод свойств, только наоборот - "растения - деревья, ель, лиственница, трава"
7. Вывод всех объектов со связями (дамп системы)
Примеры системы и запросов
Кто ты?
>Я не знаю, кто я.
Ты - компьютер. кто ты?
>Я - компьютер.
Ты - человек?
>Нет, я - не человек.
Яблоки, груши - это фрукты.
Березы, дубы, сосны - это деревья.
Ели, лиственницы - это хвойные деревья.
Деревья, фрукты - это растения.
Коровы, лошади - это травоядные животные.
Львы - это хищные животные.
Растения, животные - это организмы.
Что такое лиственницы?
>Лиственницы - хвойные, деревья, растения, организмы.
Львы - это фрукты?
>Нет, львы - не фрукты.
Коровы - это хвойные животные?
>Коровы - это животные, но не хвойные.
Груши - это организмы?
>Да, груши - организмы.
Перечисли травоядные организмы.
>Травоядные организмы - это коровы, лошади.
Перечисли хвойные растения.
>Хвойные растения - это ели, лиственницы.
Перечисли хищные деревья.
>Я не знаю таких.
Перечисли организмы.
>Организмы - это растения, деревья, березы, дубы, сосны, ели, лиственницы, фрукты, яблоки, груши, животные, коровы, лошади, львы.
Дамп.
>#
>&
>?
>,
>И = ,
>Такое = ,
>.
>! = .
>Кто
>Что = кто
>Я меняется на ты
>Ты меняется на я
>Перечисли
>-
>Это
>Дамп
>Яблоки это фрукты
>Груши это фрукты
>Фрукты содержат яблоки, содержат груши, это растения
>Березы это деревья
>Дубы это деревья
>Сосны это деревья
>Деревья содержат березы, содержат дубы, содержат сосны, содержат ели, содержат лиственницы, это растения
>Ели это хвойные, это деревья
>Лиственницы это хвойные, это деревья
>Хвойные содержат ели, содержат лиственницы
>Растения содержат деревья, содержат фрукты, это организмы
>Коровы это травоядные, это животные
>Лошади это травоядные, это животные
>Травоядные содержат коровы, содержат лошади
>Животные содержат коровы, содержат лошади, содержат львы, это организмы
>Львы это хищные, это животные
>Хищные содержат львы
>Организмы содержат растения, содержат животные
Возможности которые будут реализованы в дальнейшем:
* Заметки, ремарки - в квадратных скобках [вот так] - игнорируются.
* Возможность делать и распознавать объекты, идентифицируемые по нескольким словам (например "зеленое яблоко"). Возможно придется отделить слова от объектов.
* Морфология слов (придется, т. к. иначе ответы будут косноязычными). Планирую сделать перечисление тех же склонений в литературной форме и формирующихся автоматически (с возможной коррекцией). Возможно даже словарь подключить нужно будет.
* Вывод фраз (пример - классическая прога)
Скажи "Hello World!".
>Hello World!
* Система вычислений:
Бывает яблоко, 2 яблока, 5 яблок, яблоки.
Сколько будет 2 яблока и 4 яблока?
>Будет 6 яблок.
У меня 3 раза по 4 яблока и еще 2 яблока.
Сколько яблок у меня?
>У тебя 14 яблок.
* Занесение и вычисление формул:
Вероятность взлома замка - это всегда (5 раз интеллект и 4 раза ловкость и 7 раз удача) поделить на сложность замка.
Сложность замка - 5.0. У меня интеллект - 7, ловкость - 2, удача - 6. Какова у меня вероятность взлома замка?
>Вероятность взлома замка у тебя - 17.
* Модификаторы вероятности выполнения. Если эти слова встречаются в тексте команды, она будет с определенной вероятностью выполняться после после каждого ввода фразы.
o Всегда - 100%
o Иногда - 25%
o Редко - 5%
(возможно, добавлю еще категорий, например "очень редко")
Иногда говори "Это полная чушь.", а иногда говори "С этим я полностью согласен.".[интерпретатор будет иногда "высказывать свое мнение" о командах]
* Условия:
Всегда если скажут "синхрофазотрон", то скажу "Извини, но это я выговорить не в состоянии".[реакция на слово]
У меня 100 рублей.
Иногда если у меня больше 20 рублей, то скажу "Куплю-ка я сникерс.", у меня еще сникерс и у меня минус 20 рублей.
рублей.[интерпретатор будет иногда "приобретать сникерсы", пока не кончатся деньги]
Иногда если у меня сникерс, то скажу "Съем-ка я сникерс." и у меня минус один сникерс.[и "лопать" их иногда тоже]
* Случайные числа
У меня от 1 до 5 яблок. Сколько у меня яблок?
>У тебя 2 яблока.
* Случайные выбор события
Всегда скажу "Ух!" или скажу "Эх!" или скажу "Ох!" или скажу "Ах!".
[интерпретатор будет добавлять одно из этих слов в конец ответа с одинаковой вероятностью]
* Процедуры
Вот мне лень работать:[начало процедуры]
Скажу "Побродить что ли по Интернету." или скажу "Послушать что ли музыку." или скажу "Поспать что ли." или скажу "Посмотреть что ли зомбоящик.".
Скажу "Ну вот, еще час прошел." и время плюс час или скажу "Ну вот, еще полчаса прошло." и время плюс 0.5 часа.
Все.[конец процедуры]
Иногда мне лень работать.[процедура запускается просто по имени (задание имени идет после "Вот")]
* Перестановка и замена слов, символов, групп букв и вообще манипуляции и работа со строками.
* Возможность создавать свои модули
[создание ТочкоРазделителя]
Что-то, чего-то - это любые слова.
Всегда сначала если скажут "что-то .", то обработать что-то и остановиться.
Всегда сначала если скажут "что-то . чего-то", то обработать что-то, обработать чего-то и остановиться.
[сначала - ключевое слово для помещения этой строки на верх списка исполняемых процедур, т. е. строка будет исполняться первой, остановиться - прекратить дальнейшее исполнение строк на этом этапе]
* Очистка
Забыть яблоко, грушу [уничтожаются объекты вместе со связями]
Забыть правила [исполняемые после каждой фразы команды]
Забыть все
ЛЯС будет удобен и понятен для людей, не занимавшихся программированием, забавен и своеобразен (тексты программ читать, например, можно и на сон грядущий
). Структура языка хорошо подходит для разработки систем вообще, но вот некоторые более конкретные примеры применения ЛЯСа (при расширении функциональности, разумеется).
* Создание чат-ботов и фильтров (мата например)
* Создание текстовых квестов (может даже MUDов)
* Создание обработчиков текстов (в т. ч. литературных произведений)
* Создание и тестинг ролевых и сценарных систем
* Создание языков программирования
* Создание обучающих программ
P.S. Бета тестинг версии 0.1 и листинги прог в комментах приветствуются!
Правда, еще особо не развернешься, но тем не менее...