Вход в систему

Консульство Овалон-2

Навигация

Новый подход к Искуственному Интеллекту "Экскалибур-2013"

Ekskalibur2012a.jpg
Идеолог проекта: Александр Зохрэ
Администратор проекта: Валентин Кулик (Минск) +375-29-139-78-79

Обсудить на форуме


«Экскалибур 2013» (Программа распространяется свободно. Актуальная Версия 21_1. ДОСТУПНА В КОНЦЕ СТАТЬИ)
Что и для чего это?
В настоящее время, из-за стремительного наростания сложности техногенной среды вокруг нас, в обществе наблюдаются очевидные признаки прекращения развития сознания людей и повсеместное зарождение наукообразной псевдорелигиозности. Т.е. большинство людей даже получивших специальное образование на практике не способно глубоко осмысливать технологические и научные знания, а только пользуются зазубренными схемами подобно ремесленникам или шаманам от техники.

Как известно среда обитания формирует сознание людей, а затем сознание изменяет среду сообразно собственным целям. Этот процесс циклического изменения среда-сознание-среда не может продолжаться бесконечно, поскольку ресурсы адаптации биологического мозга не безграничны, а сложная техногенная среда уже давно оперирует абстракциями и понятиями далеко оторванными от того, с чем мозг людей сталкивался во время естественной эволюции.
В такой ситуации дальнейшее усложнение научного мышления доступно все меньшему числу людей и мы фактически превращаемся в общество дикарей владеющих страшными и малопонятными для нас технологиями и вещами - сравнимыми с МАГИЕЙ.
Такая ситуация катастрофически негативно отражается на формировании творческого мышления, и особенно в среде образования, поскольку делает пользователей технологий исключительно потребителями ЧУЖОЙ МЫСЛИ, единственная цель которых – рыскать по сетям и форумам в поисках чего-нибудь «готовенького».
Согласно философской парадигме белорусского писателя-фантаста Александра Зохрэ описаной в его трилогии "Жизнь на Овалоне-2" основной принцип развития техногенного общества "использование инструментов" - уже исчерпал себя. Характерными признаками такого исчерпания являются огромные научные коллективы и институты, которые пытаются умножением числа работников и материальных затрат, компенсировать неспособность Мозга мыслить сложными техногенными понятиями.
Однако, согласно концепции Исполнителей (Перформеров) предложенной Александром Зохрэ, теперь, если мы хотим выжить и развиваться в реально Разумном и Гуманном обществе, то должны сменить принцип, и отказаться от использования инструментов, а напротив ОБЪЕДИНИТЬСЯ С ИНСТРУМЕНТАМИ ЧТОБЫ МЫСЛИТЬ ВМЕСТЕ С НИМИ ПОНЯТИЯМИ НОВОЙ ТЕХНОГЕННОЙ СРЕДЫ.
Проект «Экскалибур-2013» ставит цель изменения описанной ситуации таким образом, чтобы машина перестала рассматриваться как инструмент для мозга, а стала его вынесенным за пределы тела продолжением. Т.е. Перформер (Исполнитель) это сущность преобразующая информацию внешнего мира в понятные человеку образы, систематизирующая эти образы и расширяющие объем контролируемого сознанием внимания за счет своих механических интеллектуальных СТЕКОВ....
Представленная вам для скачивания ВЕРСИЯ (№16) еще не решает описанных выше задач, но уже реализует специальный Лиспо-подобный язык и семантический преобразователь для работы с Языковыми и Пространственными отношениями...
Проект решает поставленные задачи комплексом следующих средств:
1. Изменение парадигмы – Экскалибур это АКТИВНЫЙ СОАВТОР - теперь программа решает задачу не по инструкции человека, а ВМЕСТЕ С ЧЕЛОВЕКОМ.
2. Общение пользователя с программой по мере накопления опыта сводится к ОПИСАНИЮ ЦЕЛЕЙ и свойств ПРЕДМЕТНОЙ ОБЛАСТИ – т.е. описанию знаний. (Мы вводим новое понятие - СПОР С СИСТЕМОЙ, как вариант игрового взаимодействия символьными и \ или графическими средствами диалога).
3. Для улучшения классификации знаний, «Экскалибур-2013» не забывает свой опыт (в том числе и опыт общения с пользователем), постоянно накапливает и систематизирует его, подобно реальной личности. При этом, с целью освобождения памяти от мусора, невостребованный или устаревший опыт, как и у живых существ, автоматически переводится в «дальнее Хранилище», а затем, со временем, «забывается».
4. Для осуществления произвольной классификации Знаний, Ядро «Экскалибур-2013» поставляется уже с поверхностной системой знаний «обо всем», - т.е. содержит сведения об основных структурных элементах (и их взаимосвязях) Вселенной, материи, науки, и человеческого предметного и социального мира (до 500 структурированных понятий). Это в тысячи раз упрощает алгоритмы автоматической классификации знаний, - поскольку есть привязки к базису.
5. «Экскалибур-2013» - система которая записывается и передается с компьютера на компьютер только целиком, как именуемая уникальная сущность, называемая Клон.
6. В перерывах между сеансами общения с пользователем, «Экскалибур-2013» не «засыпает» а решает отложенные задачи, проверяет собственные гипотезы, занимается самообслуживанием, - т.е. контролем целостности и непротиворечивости базы Знаний.
7. Применена новая технология (безспискового) виртуального связывания информации (семантические деревья строятся виртуально), т.е. Экскалибур хранит и обрабатывает ТОЛЬКО СИМВОЛЫ, в форме текстов, и поэтому полностью свободен от всех издержек спиковых структур.
8. Одной из инновационных особенность Экскалибур, является наличие в его составе "эмоциональной" оценочной системы, назначение которой - дополнительный контур ускоренного регулирования фокуса внимания, на основе вычисления расхождений имеющегося результата действий и желаемого результата, а так же на основе специального "эмоционального опыта".

9. Для описания знаний «Экскалибур-2013» имеет в своем составе ПРОСТОЙ ДОСТРАИВАЕМЫЙ язык
(язык задач, сообщений и функций), комбинируемый с элементами естественного языка. Внутренний язык похож на Лисп, Пролог и ПЛЭНЕР, (но намного проще и понятнее их), включает набор средств для работы с предикатами высокого порядка, а так же логику НЕЧЕТКОГО вероятностного типа, которая реализуется автоматически, без явных вмешательств пользователя.

Язык Экскалибур реализован по принципу "Сообщества Задач" работающих параллельно, возникающих, существующих и исчезающих по мере проявления целей.
Экскалибур неограниченно мультизадачная система, причем задачи могут существовать в нем неограниченно долго в форме отложенного или редактируемого системой проекта...

Часть 1. Основы “Экскалибур”

Кратное описание проекта.
Основные понятия.

«Экскалибур» (Э) - это компьютерное приложение, работающее на платформе NET Framework 4.5.
Э позволяет пользователю формировать собственную базу структурированных данных и правила работы с данными.
Э дает возможность пользователю проводить эксперименты по моделированию систем с Искусственным Интеллектом (СИИ) и-или моделирование собственных целевых задач научного, технического или игрового характера.
Инструменты приложения обеспечивают клавиатурный ввод данных в форме текстовых сообщений из части стандартных символов ASCII (используется часть таблицы). В (ближайшем) будущем, планируется добавить модули графического и акустического интерфейса взаимодействия с пользователем.
Э поставляется с начальной Базой Знаний “Немного обо всем ...” , являющейся его неотъемлемой частью. Она может изменяться, дополняться и развиваться пользователем по его усмотрению.
E2013PLN1.png
После старта пользователь попадает в главное окно «Редактор» Э, состоящее из трех окон: «Схема Знаний», «Диалог» , «Задачи» , - и панели «МЕНЮ», и имеющее вид:
Сеть связей в окне «Схема Знаний» отображает структуру введенных в Э данных (знаний) и допускает ее редактирование в графическом режиме.
Окно «Диалог»овое позволяет вводить и редактировать сообщения (программный код) на языке Э в форме Сообщений; «общаться» пользователю с Э в текстовом режиме.
Окно « Задачи» позволяет наблюдать рождение, режимы жизни и прекращение жизни задач, которые выполняются в Э при работе.
К: нужно описать панель меню 1…6 в окне1(вверху)
Э - многозадачная параллельная система. Причем многозадачность Э собственная и не связана с информационными потоками в операционной системе компьютера.
Детальнее об этом в разделе “О задачах и многозадачности в Э” см. ниже.

Как работать с программой?
Посмотрим на окно «Схема Знаний».
База Знаний (БЗ) состоит из Поинтов (point -точек), которые можно выделять левой кнопкой мыши (точка становится красной) и двигать мышкой.
Когда Поинт выделен, появляется список его свойств и их можно редактировать.
Когда Поинт выделен, правая кнопка вызывает контекстное меню.
Если запущен многозадачный режим (меню Run\Stop), появляется список задач и их состояний.
Примечание :В отладочном режиме можно тестировать отдельные сообщения и даже выполнять сложные вычисления в диалоговом окне.

В меню "Инструменты" выбрать подменю "Выполнить Тест", которое запускает простые примерчики, набранные в диалоговом окне. В этом режиме функции обмена сообщениями с задачами и управление задачами не работают, а все остальное выполняется.
Для того, чтобы запустить Многозадачный режим ( Run) нужно:
1 поставить (навести) курсор на Поинт БЗ "mySystem" и в меню "Инструменты" выбрать "Добавить задачу".
2. создать в этом Поинте две адачи:
Dialog
Main
3. Когда эти имена появятся в СПИСКЕ СВОЙСТВ Поинта mySystem, кликнуть по ним мышкой и в диалоговом окне (в редакторе) набрать им НУЖНЫЙ КОД
4. Записывать КОД не нужно, он записывается автоматически, ТОЛЬКО НУЖНО ПРИ СНЯТИИ ВЫДЕЛЕНИЯ ПОИНТА (цвет поинта становится ?) ( иначе при любых изменениях в окне редактора КОД изменится).
5. Нажать Run и радоваться :)))

Таким же образом можно создать функции и теоремы. Только не стоит их бездумно записывать в АБЫ КАКИЕ Поинты БЗ.

Так же можно ПРОГРАММНО создавать Pадачи , Поинты, Свойства Поинтов, Теоремы, Функции, выполнив соответствующий код в РЕЖИМЕ ТЕСТИРОВАНИЯ из МЕНЮ диалогового окна...
Все, что Вы ввели в БЗ можно сохранить целиком как Клон?? Клон из меню Файл в виде файла....

Предисловие:
«Экскалибур» построен на принципах, близких к языку Лисп, и частично заимствует ряд его приемов и функций. Но имеются существенные отличия реализации. Многие из них будут описаны ниже. В предисловии отметим следующее:
1. «Экскалибур» - текстовый скриптовый макро-интерпретатор. Он не создает списковые структуры в памяти. Даже когда мы пишем (1 2 ( 3 4 ( 5 6 7))) и хотим вычислить второй элемент третьего уровня, «Экскалибур» работает только с текстом.
Другими словами, Э- это интерпретатор вводимых текстовых сообщений.

Почему Э использует текстовый (символьный) процессор? Потому что все вводимые цепочки символов, составляющих сообщение, могут быть обработаны, а результат обработки можно снова подать как вводимое сообщение (как новые структурированные данные...).
2. В Лиспе есть понятие Макро, но в «Экскалибуре» оно доведено до логического завершения. Любой результат в Э может быть вновь направлен на сканирование вычислителю (процессору). Причем для этого достаточно взять текстовое сообщение-результат в фигурные скобки: {+ A B C}
3. В Лиспе функции принимают заданное именем функции количество аргументов, иначе возникает ошибка. «Экскалибур» работает с любым количеством слов, несуществующие динамически конструируются из Контекста, лишние игнорируются. Все, которые можно вычислить, вычисляются. Так, например, можно записать: (+ 1 2 3 4 5 6 7 8 9) , - и получить подразумеваемую сумму-результат 45.

Примечание. Подробнее понятие “Контекст” поясняется ниже
4. Лисп работает с атомами и списками, которые в зависимости от ситуации могут быть или программой или данными. «Экскалибур» сам состоит из и обрабатывает только один тип информации «Сообщение». В нем типы сообщений легко преобразуются в любом сочетании.
5. Лисп вводит понятие контекстно зависимых переменных и возможность переключения контекстов. «Экскалибур» не имеет понятия «переменная». А сам (условно) состоит из бесконечного числа ВЕРОЯТНОСТНЫХ контекстов для значения символов и сообщений.
Примечание. Подробнее понятие “Вероятность Контекста” поясняется ниже
Тип грамматики – контекстно зависимая грамматика, оперирующая словами и сообщениями, составленными из слов.
Программа и данные.
В последние 60 лет на волне коммерциализации технологий, образования и программирования, произошел отход к императивному программированию и мышлению в целом. Такой же подход в мышлении навязывается современным специалистам и ученым. Это является тупиком развития, поскольку реальные биологические системы отталкиваются от обратного, т.е. запоминают только шаблоны и отношения шаблонов, значения которых , видимо, вычисляются динамически...
Э- это символьный процессор, для него нет различия между программой и данными, а имеются сообщения и значения сообщений. В большой степени Э является системой, построенной на вызове функций, на наследование свойств и обобщении подобного. Это значит, что в отличии, например, от C++, Java и подобных императивных систем ООП , в Э, неявно выраженные программы и классы данных в любой момент могут быть переработаны друг в друга и даже, возможно, могут изменить себя, непосредственно в процессе их работы.
Таким образом, Э обрабатывает только сообщения, находя их значения.
Для получения значения сообщения (даже в виде одного слова из одного символа) в Э нужно выполнить стандартную встроенную функцию «Eval » (Вызов значения), которая вызывается в некоторых описанных ниже случаях явно (по инструкции), или неявно (по шаблону или виду сообщения).
В примерах ниже и далее в тексте после символа «-->» приводится возвращаемое значение.
Отличия вычислений значений от Лиспа.
«Экскалибур» работает с сообщениями не совсем, так как Лисп со списками:
1. Если Лисп пытается вычислить значение, не имеющее первым Атомом имя известной функции, возникает ошибка: (( X Y) (+ X Y)) --> Error ((+ 1 2 3)) --> Error
«Экскалибур» предает такое сообщение как результат:
( ( X Y) (+ X Y) ) --> ( X Y) (+ X Y) ( (+ 1 2 3) ) --> (+ 1 2 3)
Если Лисп читает список, который содержит невыполнимый член, возникает ошибка:
(Set X “Привет”) (+ 2 X) --> Error
«Экскалибур» просто формирует новое сообщение и передает его как результат:
(+ 2 X) --> (+ 2 Привет)
2. Присвоение в Лиспе устанавливает ассоциативную связку значения с контекстуальной переменной: (Set X 10) (Set Y Слон)
В «Экскалибуре» НЕТ ПОНЯТИЯ «переменная», поэтому аналогичное действие только ПОВЫШАЕТ ВОЗБУЖДЕНИЕ вероятностного КОНТЕКСТА. С точки зрения «Экскалибур» Set это не присвоение, а ОТНОШЕНИЕ, такое же как, например: «имеет», «любит», «включает», «принадлежит». Поэтому для «Экскалибур» сообщение (Set X 10) дословно значит: «Высокая степень вероятности что Множество Х включает ЭЛЕМЕНТ 10».
3. Исходя из п.2 Э позволяет строить так называемые “фантазии” или “рассуждения” в особой области называемой Контекст, которая ассоциативно, автоматически управляет поиском значений для слов. Подробности будут описаны в разделе “Контекст - работа с данными”.

Определения понятий.

Текст-это последовательность «слов текста», отделенных разделителями слов.
Слово текста - цепочка из одиночных символов. Количество символов в слове >= 1.
Слово - последовательность символов: прописных и строчных букв алфавита латинского и национального языка и (или) цифр, а также знак «.» и знак «-».
Разделители слов : пробел, перевод строки и возврат каретки, конец строки, знаки скобок: (, ), [, ], {, }.
Разделители и непечатаемые знаки при вводе слов игнорируются.
Примеры слов: Слон Кот 3.1456 -5 а В х Х
Текст, не содержащий скобок в одной строке - это одно сообщение.
Сообщение - любая (в том числе пустое сообщение вида ( ),{ },[ ]) последовательность слов и (или) вложенных сообщений, то есть сообщений в скобках .
Сообщение может состоять из одного слова, в этом случае понятия “слово” и “однословное сообщение” тождественны.
Пример1: Слон, Пример2: (Слон). Оба примера для Э тождественны по смыслу.
Сообщение может состоять из более чем двух элементов (в качестве каждого элемента выступает слово или другое сообщение).

Многословные (многоэлементные) Сообщения в одной строке должны отделяться друг от друга скобками.
Примеры сообщений:
слон имеет хобот - Это сообщение в одной строке из трех слов
(слон имеет хобот) - Это сообщение в скобках, в данном случае в круглых. Если это сообщение единственное в строке, скобки можно опустить, если не единственное - скобки обязательны.
((слон имеет хобот) (пес имеет хвост) (человек имеет нос) корабль) - Это сообщение в круглых скобках, состоящее из трех сообщений в скобках и слова.
Или по-другому... Это сообщение в круглых скобках, состоящее из четырех сообщений: трех сообщений в скобках и однословного сообщения или просто слова.

(Функция1 Х (Функция2 YZ ) (1 2 3)) - Это сообщение-функция с именем “функция1”, применяемая к трем словам, второе из которых функция с именем “функция2”.
Примечание: сообщение-функция с именем “функция1” будет интерпретироваться как функция, если объект с именем “функция1” был ранее определен пользователем как объект-функция или это имя есть в перечне встроенных функций. Перечень встроенных функций приведен ниже
Значение – слово или сообщение, придаваемое данному слову или сообщению (его содержание, возвращаемый результат)..

Контекст – Сообщение, определяющее правило для нахождения значения символов или сообщений.
Примеры:
(Контекст Биология) Слон --> животное
(Контекст Характеристика) Слон --> (огромный неуклюжий)
(Контекст Цвет) Слон --> серый
Понятие “Контекст” подробнее поясняется ниже.

Написание (ввод) сообщений
Написание (ввод) сообщения многострочное.
Сообщения могут следовать в тексте одно за другим.
Каждое Сообщение записывается в одной строке, если оно не взято в скобки.
В одной строке допускается несколько сообщений, если каждое взято в скобки.

Вводимый Текст – это последовательность строк-сообщений.
Комментарий после сообщения начинается апострофом и игнорируется до конца строки, в которой есть апостроф.
Пример:
(сообщение 1) ‘ комментарий
(сообщение 2) ‘ комментарий
(сообщение 3 ‘ комментарий
продолжение ‘ комментарий
продолжение ) ‘ комментарий

Виды сообщений.
Сформулируем сказанное выше короче.
Сообщения могут быть одно-, двух-, трех и n-ЭЛЕМЕНТНЫЕ по количеству n ЭЛЕМЕНТОВ в нем.
ЭЛЕМЕНТОМ сообщения может быть сообщение или слово
Пустое сообщение имеет вид: ( ), [ ], { }.

Триадное (трехэлементное) сообщение
состоит из трех элементов сообщения в скобках. Первый элемент всегда только СЛОВО, определяющее Отношение двух последующих элементов сообщения.
Триадное сообщение выражает утверждение.

Примеры:
(имеет слон хобот) (любит Ваня Катя) (любит Катя ((конфета пирожное мороженое ягода)) )
Введенные трехсловные сообщения находятся в сети поинтов.

Двухэлементное сообщение
состоит из двух элементов сообщения в скобках или двух элементов в одной строке .
Первый элемент всегда Слово-Отношение второго элемента сообщения.
Двухэлементное сообщение выражает вопрос (запрос).

Функциональное сообщение
- это сообщение, первым словом которого является Слово-Функция, применяемая ко всем следующим далее элементам сообщения. Элементы являются аргументами этой функции
Примеры:
(Sin X) (+ 1 2 3 4 5 6) (Not Слон) (И хороший добрый веселый)
Введенные Функциональные сообщения находятся в памяти Э в виде сети (окно “Схема Знаний”).
Примечание.
Слово-Функция в функциональном сообщении может быть двух типов :
встроенная и определенная пользователем.
Встроенная Слово-Функция : Sin, +, Not, И, Eval и т.д. .
( перечень Слов-Функций для функциональных сообщений приведен в ПРИЛОЖЕНИИ)

Списковое сообщение (или Список)
Список - это произвольное сообщение, первое Слово которого не является Словом-функцией. В списке все элементы списка (слова) объединены отношением And (логическое «И»). По сути список – это множество (понимаемое как в математике) Слов.
Примеры: (хороший добрый веселый) (1 2 3 (a s d) 4 5 (g f))

Сообщение – Контекст состоит из двух Слов, первое из которых указывает контекст, второе Объект.
Пример:
(КонтекстБиология Слон) --> животное

(КонтекстЦвет Слон) --> серый

Сообщение-факт
задается в квадратных скобках.

Сообщение в двойных скобках
Независимо от сути считается просто списком:
((+ 1 2 3 4)) → (+ 1 2 3 4)
Двойные скобки применяются тогда, когда необходимо защитить сообщение или его элемент от вычисления значения (т.е. когда сообщение или его элемент уже является значением):
(! (( 2 + 3 = )) (+ 2 3) ) → “2 + 3 = 5”
Примечание: практически тот же эффект в этом примере можно было бы достичь использованием кавычек. “ 2 + 3 = “ Но это будет стилистически неправильно - сообщение будет плохо читаться и возникнут затруднения для автоматической обработки таких сообщений.

Работа Экскалибур с Сообщением.

Укрупненный алгоритм интерпретации скобочных сообщения в Э.
1. Э проверяет сообщение Слово или открывающая Скобка Скобочного выражения: ( Слово1 Слово2 Слово3 … Слово N) .
Примечание: Как видите, Скобочное выражение - (последовательность Слов и Разделителей)
Если это Слово, то Экскалибур пытается вычислить его значение. Если это удается в текущем контексте, слово заменяется на его значение. Если нет - передается в неизменном виде (переход на 2.5).

2. Если это открывающая Скобка, то проверяет первое Слово после скобки по правилу:
2.1. Если Слово встроенная функция Экскалибур, то выполнить сообщение, то есть выражение в скобках, и получить результат выполнения (значение) этого функционального сообщения.
2.2. Если Слово - имя определенной пользователем (или самой системой) функции, то выполнить сообщение.
2.3. Если Слово это Объект-отношение, и сообщение из тройки слов, то это предикатный вызов (см. ниже). Э Проверит утверждение предикатного вызова в базе “знаний” и вернет результат True или False.
2.4. Если Слово это Объект-неотношение, то это Объект. Э попытается получить значение указанного Свойства Объекта (или всего Объекта) - т.е. выполнить функциональный вызов значения Свойства (Объекта).
2.5. Иначе это сообщение не раскрывается на данном уровне.
2.6. Э возвращает значение сообщения в виде самого сообщения (передает его как значение в неизменном виде).
Получение значения сообщения
Для получения значения сообщения можно выполнить :
Явный вызов значения
с помощью встроенной функции «Eval», которая возвращает значение переданного ей Сообщения (алгебраическое или логическое значение ). Примеры:
(Eval (+ 1 2 3 4)) --> 10
(Eval (Цвет Слон серый)) --> True
(Eval (включает объект ((вирус растение )) )) --> True
Функциональный вызов значения происходит автоматически каждый раз, когда «Экскалибур» читает функциональное сообщение. Примеры:
(Sin X) (+ 1 2 3 4) ( * 2 (+ A B))
Предикатный вызов значения
- происходит автоматически всегда, когда «Экскалибур» читает логическое сообщение, которое нужно доказать (или проверить в базе БЗ). Результат: True или False. Примеры:
(Имеет слон хобот) --> True
(Включает Человек негр) --> True
(Это Негр Слон)--> False
(> 2 3) --> False

Макро-вызов значения
- происходит автоматически всегда, когда «Экскалибур» читает сообщение в фигурных скобках, т.е. сообщение, которое описывает способ получения сообщения. В этом случае фигурные скобки отбрасываются и Сообщение читается:
Пусть А = « (+ 1 2 3)», запишем это для «Экскалибур»
(SetQ A (+ 1 2 3) )
{ * 3 A} --> 18

Отличие предикатного вызова от функционального
- предикатный вызов проверяет наличие сообщения в БЗ, и в случае отрицательного ответа (отсутствия), формирует Познавательный Контекст (дополняет список внутренних вопросов системы). Функциональный вызов извлекает из Контекста ? вероятностное значение
(Цвет слон серый) --> True

неполный предикатный вызов значения

(Цвет слон) --> серый
(= 2 2) --> True
неполный функциональный вызов значения

(= 2) --> 2
(> 2) --> 1 Прим.: возвращается «ближайший» однотипный объект, удовлетворяющий отношению.

(Имеет слон) --> (хобот (большой (вес размер)))

Сообщение-факт, задается выражением в квадратных скобках:
[имеет дом окно]
Можно задавать несколько фактов, при условии, что каждый начинается на новой строке:
[имеет дом окно
Имеет дом дверь
Цвет дом красный]
Значением сообщения, задающего факт, является само это сообщение, взятое в круглые скобки. Поэтому Сообщение-факт можно использовать внутри других сообщений:
(Set X [+ A B] )
Управление глубиной связей, задает количество уровней наследования свойств в БЗ (не меняет структуры в БЗ и может назначаться оперативно). Пример:
(Chain 16):

Специальные префиксы Слова-символа, управляют режимом получения значения Слова-символа:
Префикс “_”
_Слово-Символ - запрещает вычисление значения Слова-символа.
Все прописные буквы Слова-символа так же запрещают его вычисление. Например:
Если (Set A 10), то (?_A) --> “A” a --> “a” (? A) --> 10
“а” - это слово из одного символа, а “А”- это его возвращаемое значение ? так.
Еще пару примеров для усвоения или удалить a --> “a из приведенного примера, так как сбивает.
Префикс “ * “ сообщает о необходимости придать, присвоить полученное значение этому слову. Пример: (+ A *B) - результат вычисления суммы присвоить В: В=А+В
Пример: (+ A *B *C) - присвоить результат вычисления суммы слову В и слову C.
Это равносильно алгебраической записи: B = A + B + C и C = A + B + C

Разница двойных и одинарных скобок:
Двойные скобки запрещают вычисление Сообщения. Кавычки запрещают вычисление Сообщения (но кавычки используют только для функциональных сообщений). Смысл двойных скобок - передать содержимое сообщения как есть, без вычисления результата.
((+ 12 12 )) --> “(+ 12 12) “
(+ 12 12 ) --> 24
Контекст - работа с данными
Поскольку Э многозадачная система, то все данные для конкретной задачи скрыты внутри нее и недоступны извне. Однако в Э имеются две структуры данных, которые доступны из любой задачи, и являются глобальными:
1. База Знаний (БЗ) (Семантическая сеть, состоящая из именованных точек (Поинтов).)
2. Контекст - особая структура для сверхоперативной ассоциативной обработки информации. (Контекст позволяет строить произвольные “Фантазии” относительно свойств Слов. Добавленное в Контекст Слово может быть наделено любыми свойствами. После удаления Слова из Контекста, все временные связи с другими Словами исчезнут.)
Алгоритм получения значений для слов в Э устроен так, что любое Слово-символ “Х” (пускай это будет слово “Дверь”) прежде всего ищется в Контексте, потом в списке локальных определений Задачи, и только затем в БЗ.
Поэтому Контекст может существенно повлиять на процесс получения значения Слова-символа.
Контекст является автоматической структурой, действующей по следующим правилам:
1. Положить символ на Контекст можно только явно, специальными командами, описанными ниже.
2. Находящийся на Контексте символ может иметь сколько угодно , отличных от значения одноименного (с таким же написанием) символа в БЗ и в локальных областях данных Задач. Контекстуальное значение Символа в Э является актуальным для данного символа до тех пор, пока оно так определено в области Контекста.
Примечание: Из этого следует, что например, определив что “Зверь” это “табурет”, мы получим у него четыре деревянных ножки, независимо от того, что содержится про “Зверь” в БЗ.
3. Количество разноименных объектов Контеста ограничено специальной константой (обычно 32 и зависит от версии и специализации Клона Э) . Объекты Контекста не равнозначны, а конкурируют за внимание. На вершине Контекста находятся те из них, к которым обращение было недавно.Все объекты Контекста, опустившиеся ниже установленной глубины, забываются автоматически (исчезают).
4. После того, как Слово определено на Контексте, с ним можно работать как с обычным Поинтом БЗ, с той лишь разницей, что Контекст не отображается на схеме БЗ и не сохраняется в файле БЗ Клона.
Способы определения Слова в Контексте:
Определение контекста Слова
Определение Контекста слова явным указанием родительского класса для слова:
[Значение Слово] - создает свойство, приписываемое Слову-Объекту согласно Слову-Контексту,

Пример:
[Собака Ваня] [Бандит Ваня]
Чтобы получить список всех контекстов Слова, нужно выполнить запрос:
(! [Ваня] ) → Бандит Собака
Примечание: как видите, контекст задает сообщение-факт.
Определение Контекста через совокупность свойств:
позволяет определить родительский класс, если такой имеется, ассоциативно, иначе свойства просто будут считаться новыми свойствами описываемого Контекста.
[# объект отношение (список свойств)]
Пример:
[# зверь говорит гав]

Закрытие Контекста
Удаление всех Словарных Контекстов
удаляет все значения контекстов
[ ]
Удаление Слова из Контекста
удаляет Слово из Контекста и заставляет Э забыть все ассоциации с ним
[## слово]
Утверждение Контекста
удаляет Слово из Контекста, предварительно сделав его постоянным фактом БЗ.
Если одноименное слово уже имеется, то его свойства будут заменены свойствами Слова из Контекста.
[+ слово]

Запрос Контекста
[ Слово-Объект ] - выдает список из Слов-Контекстов, сортированный по убыванию уровня нахождения Слова-объекта на контексте.
База функциональных знаний.
Как у же говорилось, функциональные сообщения могут создаваться с помощью встроенных функций и с помощью функций, определенных пользователем.

Подробное описание Слов-Функций.

Встроенные функции «Экскалибур-2013».
Примечание: Согласно терминологии Лисп, функции бывают типа SUBR (все аргументы функции вычисляются перед ее вызовом), и FSUBR (аргументы не вычисляются, а передаются в тело функции).
Эта терминология применяется и в Э. Таким образом в Э функция c именем f типа FSUBR вида (f A (+ 1 2 3)) аналогична функции f1 типа SUBR вида (f1 _A ( (+ 1 2 3) ) )
Примечание: Пример, поясняющий отличие SUBR и FSUBR
Допустим, пользователь уже определил (условно) функции SUBR Печатать_1 и FSUBR Печатать_2 , как функции, выполняющие вывод Собщения в диалоговое окно. То есть, выполняющие то же, что и Сообщение вида (! …)
Тогда
(Печатать_1 (+ 1 2 3) ) → 5
(Печатать_2 (+ 1 2 3) ) → (+ 1 2 3)

Функции, определяющие значения Слов-символов.
Set
- устанавливает отношение присвоения «=» между Словом-объектом (или его свойством) и Значением объекта или свойства. Тип SUBR:
(Set X 10) (Set Слон.Вес 3000)
Примечание: Любое число пар аргументов:
(Set A 10
B 20
….)
SetQ
- устанавливает отношение присвоения«=» между Словом (или его свойством) и Значением. Тип FSUBR:
(SetQ X 10) (SetQ Слон.Вес 3000)
Примечание: Любое число пар аргументов.
Пример 2-х пар: (SetQ X 10 А 15)

Синтаксис Data Add Eras

Data-
вводит блок данных на уровне определение условия задачи:
(Data X 12 Y 14 A 18 …)

Add
в отличии от Set, SetQ и Data добавляет для X значение, сохраняя при этом прежние значения.
(Add X 12 14 48 …)

Eras
удаляет конкретно указанное значение у X
(Eras X 12 4 48 …)

Функции диалога и передачи-приема сообщений
!
– Тип SUBR открывает диалоговое окно «вывод-ответ» и выводит в него список результатов сообщений , разделяя их пробелом:
(! “3 * 4 =” (* 3 4) ) --> 3 * 4 = 12
?
– открывает диалоговое окно «ввод-вопрос» и выводит в него список результатов сообщений , разделяя их пробелом. Формирует запрос к пользователю: ввести сообщение в строку ввода в этом же окне. Пример:
(Set X (? «Введите Х»))
Msg
- эта функция работает с мульти-задачным диспетчером диалогов, служит для отправки сообщений из текущей задачи. Выводит сообщение, как и при вызове (!...), но направляет его в очередь диалогов. Сообщение будет выдано в окне диалога, согласно очередности задач, требующих вывода сообщения. (Особенность: выводит только одно Слово)
Подробности:
В Э задачи могут обмениваться сообщениями только в асинхронном режиме.
Задача, посылающая сообщение называется (имеет имя) Sender (отправитель), а ее адресат имеет имя Recipient (получатель). Сообщение может иметь произвольную структуру и называется Message (посылка).
Синтаксис: (Msg (сообщение-посылка) (Sender) (Recipient)).
Для отправки сообщения другой задаче, нужно указать ее имя в перечне активных задач.
(Msg 12 “Площадь_Круга”) - в данном примере задаче “Площадь_Круга” послано число 12.

Адресное сообщение гарантированно достигнет адресата, когда он готов его принять.
Если указать имя “All” , будут посланы сообщения всем задачам, которые готовы его принять. Однако Общее сообщение может быть пропущено теми задачами, которые в данный момент ожидают сообщение от конкретного источника.
Существует зарезервированное слово “Terminal”, адресующее сообщение окну “Диалог”, которое можно не указывать.

Сообщение для Терминала будет выдано в окне “Диалог”, в порядке определяемом очередью задач, выводящих сообщение:
(Msg «Привет! Я Экскалибур»)
Внимание:
Существуют сообщения, которые имеют служебное назначение:
die - уничтожение задачи получателя
синтаксис: die (Recipient)
reboot - перезагрузка задачи (функции сохраняются)
синтаксис: reboot(Имя задачи)

sleep - заснуть
Пример: (Msg Sleep Имя задачи)
WaitMsg –функция переводит текущую задачу в состояние Sleep” (спать) и ожидает любого сообщения. Сообщение для задачи может поступить от диалога (по инициативе пользователя) или от другой задачи. Следует учитывать, что если имеется несколько задач, ожидающих сообщение, то все сообщения (которые не имеют адресата) диалога будут направляться им в очередь. Получив сообщение, функция пробуждает активирует задачу и возвращает результат:
(! «Мне сообщили: » (WaitMsg) )

Inp
- функция работает как (?...), но оперирует с глобальной очередью диалогов, обращаясь для этого к диспетчеру диалогов. Сообщение ставится в очередь, а сама задача-адресат получает статус Wait (ожидание), затем, когда терминал освобождается от других диалогов, Экскалибур задаст вопрос этой функции и направит полученный ответ соответствующей задаче-адресату. После чего задача получит статус «Work».
(Set X (Inp «Как вас зовут?»))
Подробности: Эта функция может иметь второй параметр, предназначенный для отправления сообщений другим задачам и ожидания ответа от них.
Характер взаимодействия описан выше в функции (Msg)

Функции-обработчики сообщений.
Примечание: Функция-обработчик (ФО) - функция, автоматически вызываемая задачей (если она есть в теле задачи) в момент получения задачей сообщения.
ФО описывается как новая функция (через Def,) с той лишь разницей, что список аргументов задавать не надо. Единственным входным аргументом этой функции по умолчанию является аргумент с именем Message (который не задается при описании функции, но подразумевается ядром Э) , которому и будет присвоено сообщение в момент возникновения события (приема сообщения).
ФО будет автоматически активирована при поступлении сообщения, и
получит сообщение через аргумент Message, и затем, закончив работу, вернет задачу в Sleep.
Port
- функция назначения режима работы с сообщениями. Задает режим задачи и (при необходимости) определяет ФО для приходящих сообщений.
(Port Имя_Функция-обработчик (тело функция-обработчик)) - переводит задачу в Sleep , задает имя Функции-обработчика сообщений и описывает тело функции-обработчика .

(Port “” ) - отменяет назначения, введенные ранее функцией Port
(Port Read) - переводит задачу в Sleep и задает режим обработки сообщений ”Read” (чтение сообщения), при котором каждое сообщение будет использоваться задачей с учетом ранее определенных функций и данных в теле задачи. .
Пример:
(Set X 12 Y 4 ) требуется комментарий
(Def Summa (A B) (....)) требуется комментарий
(Port Read)

Примечание: (Port Read) должна быть последней инструкцией в теле задачи. Это значит, что к моменту инструкции (Port Read) все определения и данные задачей должны быть уже прочитаны, и после (Port Read) задача будет функционировать только реагируя на события (сообщения).
Пример тела задачи: требуется пример задачи с телом задачи
(Set X 12 Y 4 )
(Def Summa (A B) (....))
(Port Read)

(Port Wait) – функция переводит текущую задачу в состояние “Sleep”. Функция ожидает сообщение извне, которое содержит параметры для выполнения задачи.
Получив сообщение, функция “пробуждает” задачу. Задача выполняется и возвращает результат.
Пример:
(! «Мне сообщили : » (Port Wait ) )

Работа с текстами и интернетом
Э может читать и сохранять сообщения на внешних носителях (диски, сеть Интернет) как текстовый файл. При этом, если путь к файлу задается как “https:///.......”, то функции будут работать с сетью Интернет (или локальной сетью), а иначе с дисковыми накопителями компьютера.
Read
- чтение текстового файла. В качестве параметра передается полный путь к файлу или знак “?”, открывающий окно “Диалог” .
(Read File)
(Read ??) - вернет только имя выбранного в диалоге файла (и путь), не читая его.
Пример:
(! (Read "http://owalon.com/node/350"))

Write
- запись текстового файла. В качестве параметра передается полный путь к файлу или знак “?” , открывающий окно “Диалог”, и сохраняемый текст.
(Write имя_файлаFile Текст)
Пример
**Возвращает имя файла

Seg
- сегментация текста (генетическая обработка текста) (заменяет в тексте элементы текста в точности подобные аргументам на специфические уникальные сегментные метки)
(Seg Текст А1 А2 А3 ….)
Пример

Dsg
- десегментация текста (генетическая обработка текста) (заменяет в тексте сегментные метки на соответствующие им элементы текста в точности подобные аргументам )
(Dsg Текст А1 А2 А3 ….)
Пример

#
- Правило (обработка текста регулярными шаблонами). Если шаблон выражения применим к тексту, то производит назначенную обработку. В противном случаи ничего не делает).
(# Текст Шаблон Действие)
Пример
Примечание: также как и IF может работать в составе Cond:
(Cond
(#....................)
(#....................)
(#....................)
Иначе )

$
($ ASCII-код) - возвращает символ, соответствующий коду в таблице кодов
($ 1310) - возвращает группу кодов “перевод строки, возврат каретки”

w.R
- замена если правая часть слова совпала
работает с таблицей окончания слова состоящей из двух полей:
“Окончание” “Замена”
Пример:
(w.R “копает”
(( 'нули' 'ать'
'нул' 'ать'
'ает' 'ать'
'еть' 'ать'
'еч' 'ать'
'ал' 'ать'
'ел' 'ать'
))
)
L.w
- замена если левая часть слова совпала
см. выше.
Пример:
. Программа восстанавливающая первоначальную форму слова в тексте на естественном языке
‘ Прыгнули → Прыгать
‘ Люди → человек
(Set meWord люди)
(!
(Cond
‘ таблица слова, которые имеют неправильное окончание
(W.R meWord (( сел сесть
рек река
Люди человек
кровать кровать
скоро скоро ))
)

‘ для глаголов
(w.R meWord (( нули ать
нул ать
ает ать
еть ать
еч ать
ал ать
ел ать ))
)
‘ для прилагательных
(w.R meWord (( вые вый
вая вый
ая ой
ие ой
ую ой ))
)
(P meWord )
)
)

Функции нахождения алгебраических и логических значений.
Вычисление алгебраического выражения задается в привычной нотации с использованием стандартных функций.
синтаксис (“двоеточие” алгебраическое выражение):
: (двоеточие)
(: 12 + Sin(X) * (A –C) / 9 )
Так например, алгебраическое выражение X = Sin(Y) * 2 + ( Log(L) - 4) может быть описано следующим образом:
(Set X
(:
Sin(Y) * 2 + ( Log(L) - 4)
)
)

Таким же образом можно вычислить и логические и символьные выражения:
(: “Слон ” & “ живет ” & Континент )

Функции, которые используются в алгебраических и логических выражениях:

+ - * / ^ - арифметические двухместные операторы вида X f Y
"sin", "cos", "tan", "sqr", "exp", "log", "asin", "acos", "atan", "log10", - алгебраические и тригонометрические функции вида f(X)
abs(X)" - абсолютная величина числа
int(X)" - целая часть числа
not(X) - логическое отрицание
Or , XOr, And - логические двухместные операторы вида X f Y
= >< > < <= >= - логические двухместные операторы вида X f Y
Len(Text) – вычисление длины текста
left(Text,длина) - выделение левой части текста
right(Текст. длина) - выделение правой части текста
mid(Текст, начало_фрагмента, длина) - выделение произвольной части текста
& - текстовый двухместный оператор соединения двух текстов в один вида X f Y
item(Индекс) - получение элемента массива или последовательности * в некоторых версиях отсутствует.
word(Текст. указатель) - выделение следующего слова из текста, со смещением указателя (может отсутствовать в версии Э)
replace(Текст, образец, замена) - замена в тексте всех элементов по образцу.
elem(Список, индекс) - получение элемента списка
acquir(Объект, Отношение, Свойство) - поиск значения свойства у объекта и его потомков.
news(Объект) - список всех ново-приобретенных свойств у объекта и его потомков.
?(“текст вопроса”) - функция запроса значения через окно “Диалог”

Функции функциональных сообщений.
В Э определены следующие встроенные функции функциональных сообщений:
+ - * \
- арифметические действия со Словами -целыми числами или числами с плавающей запятой (Экскалибур определяет режим контекстуально) с любым числом количеством Слов-аргументов ( 10 знаков мантисса и четыре знака порядок).

Or XOr And Not - логические функции любого числа Слов-аргументов

++ --
- инкремент и декремент любого числа Слов-аргументов, причем, если Слово-аргумент ранее не заявлен, то функция вводит его с начальным значением = 0 . Функция относится к типу FSUBR.

n!
- вычисляет факториал каждого из своих аргументов, а затем перемножает факториалы.
(! (n! 6) ) → 720
(! (n! 6 3) ) → 4320
(! (n! 6 -1) ) → 720

Конкатенация строк или сообщений (не их результатов)
соединяет строки или сообщения следующим образом:
(! (+ "X2 " "+" " X1 " " = ") (+ 2 1)) → “X2 + X1 = 3”

Логические функции имеют сокращенные формы записи:
; - Or & - And \\ - Not
Пример:
(\\ A B (& C D) (; A D) )
ПРИМЕЧАНИЕ: Слова-аргументы логической функции Not (если их больше чем один аргумент) автоматически объединяются по отношением And

Встроенные предикаты ( классификаторы-распознаватели Сообщений)
- проверяют языковые свойства вводимых сообщений :
Форма записи: (Предикат Аргумент_1 ….)
isL
– проверяет все аргументы (один или несколько), и возвращает True , если все они являются списками.
isT
- сопоставление нескольких произвольных текстов с одним регулярным образцом (см. Часть 2)
isF
– проверяет все аргументы (один или несколько), и возвращает True, если все они являются списками, которые можно вычислить как функцию.
isW
– проверяет все аргументы (один или несколько), и возвращает True, если все они являются зарезервированным ( ключевым) , словом Э (например, именем функции).
Примечание: перечень всех ключевых слов в Э-Справочнике ниже.
isAtom
– проверяет все аргументы (один или несколько), и возвращает True, если все они являются объектами Базы Знаний.
isNum
- проверяет все аргументы (один или несколько), и возвращает True, если все они являются числами
isFunc
- проверяет все аргументы (один или несколько), и возвращает True, если все они являются функциями
isVar
- проверяет все аргументы (один или несколько), и возвращает True, если все они являются объектами Контекста (например, переменными цикла и т.п.)

Is
- сопоставление со структурированным образцом (см. Часть 2)

Обработка списковых выражений (сообщений-списков)
производится следующими функциями:
Conv
- конвертирует любое сообщение в указанный вид. Для этого функции нужно “показать” левую скобку того вида в который нужно перевести сообщение:
(Conv Сообщение “[“ )
Если функции показать маленькую или заглавную букву, то она переведет сообщение в указанный регистр.
(Conv Дом “c” ) → дом

Elem
– извлекает из списка некоторый элемент, указанный последовательностью индексов, которая может быть произвольной (индексы – целые числа, начиная с 0):
(Elem
(1 2 (a (Цель d) k) 3 4 5) ‘ это список
2 1 0) ‘ это маршрут к цели - три индекса ???
List
- вычисляет слова-аргументы и создает список из их значений :
(List A B C …)

функции, работающие со списками
Insert
- вставляет на указанное место списка xList (набором индексов) заданный элемент (Value):
(Insert xList Value Index1 …)
Del
– удаляет заданный набором индексов элемент списка xList :
(Del xList Index1 …)
LIndex
– возвращает список, содержащий набор индексов, определяющих положение искомого элемента Value в списке xList:
(LIndex xList Value)
Len
- вычисляет длину списка (число элементов любого типа)
Head
(Head List) - возвращает голову списка, оставляя укороченный на голову хвост. Список должен быть представлен Словом .

Функции-Условие
(частично SUBR - для первых 2-х слов-аргументов, и условно SUBR для одного из двух последних слов-аргументов ) выполняют логическое ветвление.
Проверяют следующие условия:
= >< < <= > >=
Синтаксис :
(= X Y True False)
Функция вычисляет слова-аргументы X и Y , которые могут быть любым сообщением. Затем проверяется условие. Если условие истинно, то функция возвращает слово-аргумент, находящийся на позиции True, иначе будет возвращено слово-аргумент на позиции False.
Примечание: Если выполнять действие не нужно (например в составе функций If; Cond) то допустима простая форма функций проверки условия выдающая результат сравнения True \ False (= X Y)

IF
Синтаксис: (IF Тест Цель)
- вычисляет второе слово-аргумент (сообщение-Тест), если его значение True, то находит значение сообщения-Цель, иначе, пропускает его.
True - значением, считается любое значение, отличное от “( )”, 0 , “” , False.
Cond
- вычисляет одно за другим несколько IF-сообщений, пока какое-то (очередное) не возвратит True, после чего функция заканчивает свою работу, возвращает результат сообщения-Цель. Если же ни один блок IF не найдет значение отличное от False, то будет возвращено значение “Иначе”.
(Cond (If ….) (If ….) ….Иначе)
Пример: (Cond
(if False (! “Совпала строка 1” ) )
(if (+ 0 0) (! “Совпала строка 2” ) )
(if False (! “Совпала строка 3” ) )
(! “Ничего не совпало”)
)
Prog
- выполнение нескольких инструкций. Возвращает результат последней инструкции.
Примечание: Начиная с версии E2013v17 введены следующие дополнения:
- список локальных переменных (не обязательно)
- функция Goto Метка
- функция Return Значение
Пример:
(Prog (X Y Z)
…....
Метка1
…....
(GoTo Metka1)
(Return 14)
)

GoTo
* только для версии старше 17
безусловный переход в пределах Прог-выражения и Функциях пользователя
Return
* только для версии старше 17
досрочный выход с параметром из Прог-выражения и Функциях пользователя

Циклы,
- функции, которые повторяют Сообщение-аргумент заданное число раз.
For
- числовой цикл, выполняющийся от начального значения управляющей переменной var, равного Start, до ее конечного значения Finish с шагом 1.
(For var Start Finish ( Сообщение))
Возвращаемым Результатом цикла значением будет число Finish
Пример:
Rob
- цикл (грабитель) по очереди забирает у списка L его элемент1, элемент2… и передает его (элемент) переменной var.
(Rob var L (выполнить код…) Возвратить)
Пример: (Rob A (qq (ww ee) 1 (2 3) 4) ? где переменная var? это А?
(! A)
Возвратить ) Пример?
Этот цикл будет продолжаться, пока еще есть, что отобрать у списка. Затем вычисляется возвращаемое значение сообщения “Возвратить”

Расширение базы известных функций.
Создание (определение) новых функций.

Экскалибур - динамическая система. Во время работы в любой момент Программа или Пользователь могут создать новые функции, которые сразу включаются.
Экскалибур строго различает функции, относящиеся к Базе Знаний Задачи (БЗЗ), и функции, относящиеся к Базе Глобальных Знаний (БГЗ) .

Новые функции, определенные в теле данной задачи («Экскалибур» многозадачная система) функциями Def и DefF работают только в этой задаче.
Определение новых функций происходит функциями Def и DefF.
Отличие этих функций, в терминологии языка Э как и в Лисп состоит в том, что первая определяет функцию типа EXPR (все аргументы вычисляются до вызова функции), а вторая - функцию тапа FEXPR (аргументы не вычисляются, а передаются, так как они есть).

Определение новых глобальных функций, позволяет сохранить функцию на все время существования данного экземпляра Экскалибур, или до их преднамеренного удаления из Базы Знаний (БЗ=БЗЗ + БГЗ).
Рекомендация: Следует проявлять осторожность при создании глобальных функций в БЗ Экскалибур, так как разрастание их числа замедляет поиск нужного экземпляра функции по имени работу Э.
Занести глобальную функцию в Базу Знаний можно с помощью соответствующего меню прямо из окна редактора кода системы Экскалибур, не представляет труда.

Def и DefF

Функции Def и DefF принимают три параметра, Имя, (слова-аргументы), (тело функции).
Синтаксис:

(Def Имя (слова-аргументы) (тело функции))

(Def Имя (список аргументов) (тело функции))
Пример:
(Def Сумма (A B) (+ A B))
(! (Сумма 1 2))
Элементы определения могут быть переменными: ? Какие
(SetQ X ( + A B ) )
(Def Сумма (A B) X)
(! (Сумма 1 2))
ПРИМЕЧАНИЕ: Функции, определенные в задаче, по завершению задачи исчезают Если задача не завершена (отложенная или редактируемая задача), сообщение, описывающее тело задачи, сохраняется в БЗЗ: функции этой задачи сохраняются вместе с описанием задачи.

Glob и GlobF

Определение глобальных функций
Glob _Функция
GlobF _Функция.
ПРИМЕЧАНИЕ: Поскольку все глобальные функции являются просто свойствами Объекта “Функция” Базы Знаний, и ассоциированы с ним отношением “(Func Функция . Имя_функции ) ”, то получить описание функции не для вызова, а как нейтральное сообщение, можно как обычное контекстуальное значение свойства объекта “Функция”:
(.Имя_функции Функция)
или как значение свойства имени объекта:
(! Функция.Имя_функции)

Определение иерархии функций.
позволяет систематизировать их Для объекта “Функция” нужно сначала создать наследников, например так:
[ Включает Функция (физическая_функция графическая_функция)}
Затем при описании сообщения, следует указать имя подкаталога в иерархии (явно или через переменную ???):
Glob _Подкаталог
GlobF _Графическая_функция.

Часть 2. Образцы и теоремы
Образцы
Образцы позволяют анализировать структуру сообщения . Конечно, это можно сделать и последовательностью вызовов функций Э и функций определенных пользователем, но это будет медленнее и сложнее, чем с помощью Образцов. Для описания правил анализа (формирования образцов) имеется встроенный подъязык описания образцов текстового и логического типа.
isT
- сопоставление нескольких текстов с одним регулярным образцом (язык регулярных образцов - стандартный и опубликован в широкой литературе Пример). Если все тестируемые тексты удовлетворяют образцу, выдает True
(isT Образец Текст1 …...)

is
- сопоставление любого (или нескольких) аргументов со структурированным образцом
? Пример. Язык структурирования следующий:
* - любое продолжение сообщения
# - любое число
\# - не число
-12 - конкретное число -12
слово - любое слово маленькими буквами
ПЕРЕМЕННАЯ - вводит переменную ? понятие переменная в Э, первоначально задает ей любое первое же значение, но затем оно должно быть тем же
() - пустой список
(_) [_] {_} - любой список указанного типа
#( 2) #[8] #{1} - список указанного типа с заданным числом элементов
( 1 2 3) [abs] {ff gg hh} - список указаннного содержания
$ - любое значение отличное от ()
$t - текстовое значение
$F - функция определенная пользователем
\$F - не функция определенная пользователем
$a - только известный атом Базы Знаний
\$a - не должен быть атомом Базы Знаний

$=T - True
$=F False
$<12 число меньше указанного
$>23 число больше указанного
$Животное это потомок атома “Животное”
\$Животное не потомок атома “Животное”
$$Кот имеет потомка “Кот”
\$$Кот не имеет потомка “Кот”
$#Хвост имеет свойство хвост
\$#Хвост не имеет свойство хвост

$#Вес.10 имеет свойство “Вес” = 10
& - логическое объединение условий
$[ a b c d] - любое из перечисленных значений
$(отношение свойство) - удовлетворяет указанному отношению

Примечание: Элементы описателя образца должны быть разделены пробелом
Примеры:
(is “( Имеет $Животное $#Хвост )” X )

(Set A 12)
(! (is ((23 24 A)) ((23 24 12)) ) )

Теоремы.
** Обычная функция вызывается тогда, когда Экскалибур читает сообщение с ее именем и ей передаются параметры вызова (аргументы функции), например (Функция X Y) .
Система символьной обработки знаний, должна уметь принимать решение самостоятельно. Одним из механизмов такого умения являются теоремы.
Теорема - это функция, вызываемая не по имени, а по признакам применимости, называемыми Целью.

DefT определение теоремы.
Выполняется функцией DefT типа FSUBR
(DefT Каталог Имя Цель Тело)
Каталог - объект БЗ для сохранения теоремы (поиск теорем использует структуру наследования вверх)
Имя - любое имя, отражающее суть теоремы
Цель - образец для вызова теоремы
Тело - скобочное сообщение, вычисление которого произведет требуемые изменения в БЗ или Контексте
Примечание: Поскольку теорема может быть вызвана из любой задачи не рекомендуется в ней использовать локальные символы, имеющие смысл переменных.

@ - вызов теоремы
Вызов теоремы происходит с помощью функции @ типа FSUBR, в качестве аргументов которой передаются параметры:
Каталог (определяет точку в семантической сети где искать теоремы)
Цель (образец который должен совпасть с образцом теоремы),
тестовое сообщение Тест
и параметр Иначе (который может быть любым сообщением).
(@ Каталог Цель Тест Иначе)

Принцип вызова теоремы
Вызов теоремы происходит следующим образом.
а) Из Базы Знаний выбирается список подходящих к Цели теорем.
б) Теоремы одна за другой вызываются как обычные функции до тех пор, пока Тест не выдаст значение True
На этом работа блока теорем заканчивается, и возвращается имя успешной теоремы
В) Если теорем обещающих достигнуть заданную Цель больше нет, то выполняется сообщение Иначе.
Примечание 1: Сообщение Цель не обязательно должна точно выбирать некоторую теорему, а может охватывать целую область шаблонов.

Примечание: Поиск подходящих теорем начинается из точки Каталог в БЗ, вверх к родителям этой точки на высоту установленной длины цепочки наследования. Если Каталог отсутствует, то теоремы ищутся в точке БЗ “Теорема”

Часть 3 Работа со знаниями
Внимание: При вводе знаний в БЗ все буквы сообщения-факт должны быть строчными. Слова, начинающиеся с прописной буквы имеют смысл «Слово-объект».
Непосредственное задание знания:
[ имеет гриб шляпка]
Ввод знаний в БЗ через встроенную функцию Set (через Слово-объект):
(Set Гриб мухомор)
[имеет Гриб пятно]

Семантический класс “Непонятное_слово”
В Базе Знаний имеется специальный класс “Непонятное_слово”, куда автоматически заносятся все непонятные для Э слова.
Непонятным словом считается слово, для которого запрос (Это СЛОВО) выдаст пустой список “( )”

В дальнейшем, когда слово станет понятным, оно автоматически будет из этого класса удалено.
Получить список “Непонятное_слово” можно через отношение “Включает”:
(Включает Непонятное_слово) → Список слов
Примечание:
**(Слова- Свойства могут не быть включенными в список непонятных слов).

Занесение в Базу Знаний сообщения-факта:
[ Отношение объект свойство] - все элементы : слово-Отношение, слово-Объект, слово-Свойство, - сообщения-факта могут быть любыми сообщениями языка. Возвращает слово-объект.

Занесение в Базу Знаний величины слова-свойства:
[ отношение объект свойство величина] - все элементы могут быть сообщениями . Возвращает слово-объект
Пример:
[имеет дом высота 10]

Примеры
[любит конь сено] ‘ Это сообщение-факт в БЗ
(! (любит конь сено)) → True ‘Это сообщение-предикат в БЗ
(! (любит человек сено)) → False ‘Это результат обработки введенного сообщения
Введем:
(Set X конь)
(Set Y сено)
(! (любит X Y)) → True

Встроенные Слова-Функции:

Delete - Удаление свойства объекта:
(Delete Отношение Объект Свойство)

Clean - удаление значения свойства:
(Clean Отношение Объект Свойство)

forget - удаление из Базы Знаний объекта
(forget Объект)

NewS - строит список всех новых свойств у объекта и его потомков для указанного отношения.
(NewS Объект Отношение)

Class - строит список символов ассоциированных с указанным свойством через некоторое отношение
Синтаксис:
Пример:
[имеет ((стол человек рояль)) нога]
(! (Class Имеет нога )) → (стол человек рояль)
Примечание:
Можно задавать построение класса с учетом наследования, указав для этого глубину наследования >=1
Синтаксис:
(Class Имеет нога 2) → (стол человек рояль негр азиат европеец индус китаец)

Примечание:
Функция Class может строить комбинированные значения, заданные списком свойств в комбинации с наследованием.
Пример:
(Class Любит ((Пирожное Мороженое Играть)) 3 )

Описание смыслов реального Мира.
Описание реального Мира производится на языке близком к естественному, что позволяет описать относительно простой интерпретатор текстов естественного языка, и генератор результирующих смыслов на естественном языке.
Единицами описание смыслов реального Мира являются Реальные Отношения (РО) и сущности (объекты).
Отношения разбиваются на основные и наследованные категории.
Вот исчерпывающая таблица основных категорий отношений для сущностей реального Мира (примеры в скобках не являются сообщениями Э):
Агент - главная действующая сущность. (мы красили дверь)
Автор - генератор смысла, значения (он сочинил стих)
Адресат - сущность, на которую направлено действие или изменение
(он получил письмо)
Ориентир - указатель на сущность (направление на Москву)
Время - координата во времени (вчера был вторник))
Значение - величина или суть свойства, имени, символа (20 метров высота)
Идентификатор - номер или позиция сущности члена множества (номер 10 дом)
Имя - не упорядоченный идентификатор сущности в множестве (Иван имя рабочего)
Инструмент - сущность посредствам которой производится действие (ключ открыл замок)
Источник - описатель происхождения сущности (Молдавия яблоко)
Количество - множитель сущностей ( 2 яблоко)
Контейнер - область пространства или множество (в Москву поехали)
Локализация - размещение внутри контейнера (в глуши жить)
Масштаб - граница распространения сущности (Российский Банк)
Материал - сущность, из которой состоит сущность (Кожаная сумка)
Назначение - адрес, координата, адресата (детская книга)
Объект - изменяемая или описываемая сущность (мост взорвать)
Выбор - ограничение части множества по качеству (старшие дети)
Оценка - субъективный выбор (хорошо плавать)
Параметр - имя значения (высота дома)
Пациент - субъект являющийся объектом действия (Иван арестован)
Признак - сущность определяющая свойство сущности (красное яблоко)
Принадлежность - зависимость сущности от другой сущности (Ивановых дом)
Причина - процесс или сущность источник изменения (ураганом поваленное дерево)
Результат - сущность порожденная действием (пирог испечь)
Способ - вариант осуществления действия (босиком идти)
Средство - сущность, используемая для достижения цели (краской красить)
Степень - оценка оценки (весьма преуспеть)
Субъект - сущность на которое направлено действие (любовник Маши)
Цель - признаки результата производимого действия (испуг агрессора)
Часть - сущность являющаяся элементом структуры другой сущности (ножка стула)

Теоремы описания РО.
С РО связаны прямые и обратные теоремы Реального Описания (ТРО) заложенные в Э (будут описаны в приложении). ТРО позволяют Э автоматически наделять элементы текста суммой необходимых свойств.
Так например, если “Кисть - Инструмент для нанесения Краски на поверхность” то:
а) Кисть может принимать краску от другой сущности
б) Кисть может удерживать краску
в) Кисть может отдавать краску третей сущности
г) Форма Кисти совместима с формой поверхности третей сущности.

Для каждого РО имеется обратное РО.
Так например, если справедлива (Причина А В) то српаведливо (Следствие В А)
Если справедливо (Имеет Слон Хобот) то справедливо (Часть Хобот Слон)

Часть 4. Многозадачность

Кто выдает управление (создает, назначает статус и запускает) задачи?
Управление задачами, это процесс так же являющийся задачей. На практике для этого создается условно-специальная “главная” задача.
К: позже будет описана “главная” задача: Супервизор.

Что такое задача?
Задача содержит:
Name - Имя_задачи краткое описание цели, ради которой она создана.
data - сообщение ( данные) значение которого будет вычислено до начала работы задачи (может отсутствовать - если данные содержатся в самом описании методов достижения цели), в следующем формате:
(Data cимвол1 Значение1
cимвол2 Значение2
….
)
Примечание: символы должны быть заданы прописными буквами, а значения могут быть любыми сообщениями.
way - сообщение или список сообщений, описывающие способ достижения поставленной цели задачи.
Goal - критерий (сообщение) вычисление значения которого дает True только по достижению желаемого результата (может отсутствовать - т.е. приемлем любой результат)
Примечание Если критерий выполняется, то задача передаст сообщение X для chief . Иначе передаст сообщение “flub”
chief - имя задачи, которая автоматически получит результат работы текущей задачи (может отсутствовать - если задача обменивается сообщениями в процессе работы).
Задача определяется одной из двух встроенных функций типа FSUBR:
Project
(Project Каталог Name (Goal ...) ( chief Адресат X) (Data ...) (Way - просто код) )
Каталог - описать
или
Task
(Task Каталог Name (Goal ...) ( chief Адресат X) (Data ...) (Way.- просто код) )
Примечание если Goal,Chief,Data отсутствуют, их заменяют пустым списком “()”

Место задачи в Базе Знаний.
Задача может находиться в любом подкаталоге, образованном от слова “задача”.
Это позволяет создавать классификацию задач.

Задача это не процедура и не функция.
С понятием задачи классические программисты редко сталкиваются в полной мере. Задача работает автономно.
Задача обладает следующими свойствами:
- Работает параллельно с другими задачами, не замечая их до момента обмена с ними сообщениями.
- Имеет свой набор данных, функций и определений,
- Имеет (ранг важности): сколько процентов “внимания” Экскалибур за один шаг работы уделяет этой задаче (диапазон от 1 до 100, обычно =5)
- Может принимать сообщения: от других задач, от диалогового окна, от супервизора Э.
- Может посылать сообщения: другим задачам, диалоговому окну , супервизору Э.
- создает собственную копию используемой функции на момент запуска задачи (копия не зависит от любых изменений функции-прототипа до завершения задачи).

Жизненный цикл задачи:
В отличие от и функции, задача имеет жизненный цикл следующего вида:
а) создается и редактируется как текстовое сообщение, Задача на стадии создания-редактирования имеет статус “project” , т.е. в Базе Знаний неготовая задача находится в списке project
б) готовая задача находится в списке задач, получив статус Task
в) project и Task задачи попадают в стек супервизора, и “работают” под своим статусом.
г1) Может быть прервана (отложена) и вернуться в список задач под своим статусом.
Примечание: Задача в сохраняется в том виде, в котором она прервалась. (
г2) Может быть возобновлена, то есть «продолжить» «работать».
д) Завершает работу удачно или ошибкой.
е) Может быть отправлена Супервизором на повторный цикл

Встроенные Функции Управления задачами:
Ready -
функция изменяющая статус задачи с Project на Task
(Ready Каталог Задача)
Edit
- функция изменяющая статус с Task на Project
(Edit Каталог Задача)
** Если задача уже работает, она будет остановлена.
Start
- функция активирующая задачу
(Start Каталог Задача Ранг)
** ранг можно не задавать, тогда он будет 5
Stop
- функция сохраняющая задачу как отложенную
(Stop Задача)
Break
- функция уничтожающая активную или пассивную задачу
(Break Каталог Задача)
MaxTask -
функция задает максимальное число активных задач (обычно 9), все лишние задачи с наименьшим рангом перейдут в состояние Stop
(MaxTask Число)
Пример:
( Start Работа_с_ текстом Сочинить_сказку 5)

Подробности управления задачами:

Обязательно ли выполнять инструкцию Start для готовой задачи?
Нет. Задача, помещенная в список готовых, будет выполнятся.
активировать задачу нужно только если ее результат ждет другая задача, которая уже активна

Черепашья графика
Turt
- Функция непосредственного рисования на плоскости экрана без запоминания фигур и сохранения отображаемого объекта.
Специальными графическими командами можно рисовать на экране, извлекая уже готовые рисунки из переменных и свойств Поинтов БЗ.
Вид функции:
(Turt X Y Графическая_микро-программа)
Необязательные параметры:
(Turt X Y Графическая микро-программа Масштаб Ориентация)
Графические микро-команды:
clr - сотрет весь экран установленным цветом фона
a Х поворот черепахи в градусах
off поднять перо черепахи
on опустить перо черепахи
c Х установить цвет пера (1-8: черный белый красный, оранж. жолт. зел. голуб. фиол.)
cf Х установить цвет фона
w Х установить ширину линии
go перемещение черепахи вперед по курсу куда смотрит
dm Х тип линии ( 0-5 сплошная, точки и т.п.)
fm Х тип заполнения ( 0-5 сплошная, точки и т.п.)

t ТЕКСТ нарисовать заданный текст
tx x задать размер шрифта для текста (обычно 12)
rep Х (.....) повтоить все что в скобках Х раз
cr R нарисовать круг заданного радиуса
e X Y нарисовать эллипс заданными размерами сторон
B X Y нарисовать прямоугольник с заданными размерами сторон
XY X Y перейти на указанную позицию (будет рисовать если перо опущено)
3D (x1 y1 z1 x2 y2 z2 ….) объемное черчение в изометрической проекции

P (x1 y1 x2 y2 x3 y3 x4 y4 …) - нарисовать по точкам углов закрашенный многоугольник

:имя масштаб поворот - графическая подпрограмма (переменная или часть объекта например “рука”)

Примечание: Параметры X и R отвечают за длину перемещения или радиус (для круга), и могут задаваться либо числом, либо переменной, но не выражением языка.
Графическая_микропрограмма может задаваться любым сообщением.

Примеры:
Круг и линия
(Turt 300 300 "clr cr 100 go 100" 2 145 )

Эллипс:
(Turt 300 300 "clr a 45 e 30 40 " )

Многоугольник:
(Turt 300 300 "clr a 45 p ( 10 10 20 10 20 20 " )
16-зубчатая шестеренка
(Turt 100 200 "cf 4 clr rep 16 ( a 25 go 6 a -25 go -16 a 25 )")
3D кубическая фигура
(Turt -400 100 "clr 3d (0 0 0 40 0 0 40 0 40 0 0 40 0 0 0 0 40 0 40 40 0 40 40 40 0 40 40 0 40 0 40 0 0 )" )
Примечание: “Экскалибур” может сохранять графическую информацию об объектах в Поинтах БЗ как обычные факты заданные предикатом #:
[# Имя_объекта Графическая_микропрограмма]
Непосредственно нарисовать объект можно обычным образом (имя должно быть маленькими буквами, иначе это будет переменная):
(Turt 300 300 имя_объекта )
Пример:
[# окно " cf 7 fm 6 b 20 20"]
[# дом "clr b 40 40 off xy 10 -10 :окно 1 0 "]
(Turt 300 300 дом)
Управляемый код: Хотя это не очевидно но код рисунка может управляться чрез внешние переменные (Некоторая проблема в том,что имена переменных заложенных в графику должны быть заранее в резерве не будущее управление:
(Set Поворот 45)
[# окно " cf 7 fm 6 b 20 20"]
[# дом "clr b 40 40 off xy 10 -10 :окно 1 Поворот "]
(Turt 300 300 дом)
Объект так же может быть добавлен на Сцену не как рисунок а как объект (см. далее)
Запуск графической задачи 2D: Можно соединить 2D микропрограмму с задачей и запустить результирующий управляемый объект поместив его на сцену:
(Start2D Каталог Задача Ранг X Y Графическая_микропрограмма )
(Start2D Каталог Задача Ранг X Y Графическая_микропрограмма Масштаб Ориентация )
Примечание: Графический объект с точки зрения менеджера задач является обычной задачей и все описанное выше для задач применимо к такому объекту.

Добавление образа.
Любой Поинт из БЗ может быть добавлен на Сцену после выполнения операции:
(Image Имя_на_сцене имя_Образа X Y Z )
Примечание: При изготовлении Образа из Поинта Э автоматически изготовит картинку Схему Образа по семантическому описанию в БЗ.

Взаимодействие с образом
Каждый образ является самостоятельной задачей (Сущностью Сцены). Задача соответствует его описанию в БЗ.
Об описании характера образа будет написано дальше.
Когда образы расставлены на сцене и им переданы сообщения, по команде (Scene On) сцена начнет автоматически моделировать поведение образов.
При этом другая часть программы может следить за ними и делать некоторые выводы.
Таким способом в Э реализуется эквивалент мышления и построение прогнозов.

Приложение
Краткий список ключевых слов.

ВНУТРЕННЯЯ БАЗА ЗАДАЧИ:

"set", "setq", "data" – присвоение значений символам

“Def”, “DefF” - определение локальной функции в пределах задачи
“DefT” - определение теоремы

ВЕТВЛЕНИЕ АЛГОРИТМА:

"=" "><" "<" "<=" – сравнение величин с ветвлением алгоритма
">=" ">"

"if" - ветвление алгоритма по логическому значению
"cond" – многократное ветвление (селектор)

"!" - простейший вывод результатов в отдельное окно
"?" - простейший диалог в отдельном окне

АРИФМЕТИКА И ЛОГИКА:
"++" – инкремент значения символа
"--" – декремент значения символа
"+" - арифметические операции
"*"
"-"
"/"

"n!" - вычисление нескольких факториалов
"or", ";" – логические операции
"xor"
"and", "&"
"not", "\\"

СОПОСТОВИТЕЛИ:

“isT” - сопоставление с регулярным выражением
“is” - сопоставление с структурированным образцом
"isAtom" - проверка что это атом
"isL" - проверка что это список
"isVar" - проверка что это символ
"isFunc" - проверка что это функция
"isNum" - проверка что это число

СПИСКИ:

"elem" - получение заданного маршрутом индексов элемента из
списков любой степени вложенности
"insert" - вставление элемента на заданную позицию в список любой
степени вложенности
"del" - удаление заданного элемента из списка любой вложенности
"list" - построение списка из нескольких значений
"len" - длина списка или массива
"head" - отделяет голову списка от хвоста

УПРАВЛЕНИЕ:

"for" - числовой цикл
"rob" - цикл перечисляющий элементы списка
"chain" - управление глубиной анализа свойств
"msg" - сообщение задачам или вывод на терминал
"inp” - запрос у задач или диалоговая функция
Cond - селектор
Prog - обобщение нескольких инструкций
“@” - вызов теорем

ЗНАНИЯ:

"news" - получение списока новых (по отношению к предкам)
свойств у объекта и его потомков

"forget" - забыть Атом полностью уничтожив все его следы в БЗ
"delete" - удаляет одно свойство ПОЛНОСТЬЮ
"clean" - очищает одно свойство только от значения оставляя само
свойство
"glob", "globf" - добавление в Базу Знаний глобальных функций
"eval" - вычисление выражения
"port" - задает имя функции или режим обработки сообщений
"read" - чтение файла или диалоговый выбор файла
"write" - запись файла
"$" - символ или последовательность символов ASII

"class" - построение списка ассоциаций отношения свойства с
объектами (строит виртуальные классы по назначенным
признакам)

ЗАДАЧИ:

"goal" - загрузка описания теста для результата задачи
"chief " - загрузка имени получателя результата и имени
результата задачи
"##" - служебная функция для тестирования результата задачи (не
документирована)
"task", "project" - создание задачи
"break" - уничтожает задачу
"ready" - превращает проект в задачу
"start" - активирует задачу
"stop" - отправляет задачу в список ожидающих задач
"maxtask" - регулирует максимальное число активных задач

Примеры:
Вложенные циклы
(For A 1 -3
(For B 1 2
(! A _ B )
)
)

Сортировка списка на буквы и цифры
(SetQ Список ( 1 A 4 G 8 6 D ) )
(Rob X Список
(iF
(isNum X)
(Add Цифра X)
(Add Буква X)
)
)

Селектор на 3 направления
вариант 1:
(Cond
(iF False (! 111 ) )
(iF True (! 222 ) )
(! 3333)
)
вариант 2:
(! (Cond
(IF False 111 )
(IF False 222 )
(P 3333 )
)
)

Определение функции:
Сумма двух чисел
Определение: (Def
Сумма (A B)
(+ A B)
)
Тестирование (! (Сумма 1 2))

Рекурсия - вычисление факториала
Определение:
(Def Nf (N)
(> N 1
(*
(Nf (- N 1))
N
)
1
)
)

Тестирование:
(! (Nf 6) )

Prog- выражение
(!
(Prog
(Data A 12 B 14)
(+ A *B)
(* *A B)
)
)

. Программа восстанавливающая первоначальную форму слова в тексте на естественном языке
‘ Прыгнули → Прыгать
‘ Люди → человек
(Set meWord люди)
(!
(Cond
‘ таблица слова, которые имеют неправильное окончание
(W.R meWord (( сел сесть
рек река
Люди человек
кровать кровать
скоро скоро ))
)

‘ для глаголов
(w.R meWord (( нули ать
нул ать
ает ать
еть ать
еч ать
ал ать
ел ать ))
)
‘ для прилагательных
(w.R meWord (( вые вый
вая вый
ая ой
ие ой
ую ой ))
)
(P meWord )
)
)

========================
Установка программы "Экскалибур v-21_1" (перед установкой удалите струю версию и установите MS FrameWork 4.5


Обсудить на форуме

Rambler

Сейчас на сайте

Сейчас на сайте 0 пользователей и 2 гостя.