GotAI.NET

Форум: Проблемы искусственного интеллекта

 

Регистрация | Вход

 Все темы | Новая тема Стр.1 (3)След. > >>   Поиск:  
 Автор Тема: MiLK
Плюмаж
Сообщений: 110
MiLK
Добавлено: 17 мар 08 4:55
(все началось здесь http://gotai.net/forum/Default.aspx?postid=5440 но, честно говоря, сомневаюсь, что тема будет долго активной)

Язык обработки текстов (тестовая версия, но работает - с примерами и описанием). Поддержка сопоставления с образцом, рекурсии, back-tracking и арифметических операций. При использовании навевает напоминания о SNOBOL, LISP, PROLOG и FORTH.

Исполняемый файл, с примерами и описанием: http://rundschau.narod.ru/MiLK.rar (260 кБ)

Документация отдельным архивом: http://rundschau.narod.ru/MiLK_man.rar (20 кБ)

Т.к. это пробная версия, то работает достаточно медленно - ожидание от секунды и выше. Все примеры рабочие.


Цитата:
Автор: daner
Но не смотря на это, меня не впечатлил представленный язык. Он не очень то выразителен. И те же самые примеры, на python выглядели бы не менее (ИМХО, даже более) красиво.
Как минимум, не хватает регулярных выражений и еже с ними. Так же я не до конца понял принцип обработке? Каждое правило применяется к каждой строке? сколько проходов по тексту? когда генерируется новый текст (строка), куда он генерируется?

Какие цели языка?


Может быть, Daner, согласен и красивее – не могу судить, т.к. никогда не сталкивался с Python.

Правило будет применяться только в том случае, если удастся сопоставить текст и образец, заданный в правиле. Проход один, но некоторые проходы вложенные – в зависимости от того, сколько строк содержит образец. Некоторые образцы могут вообще включать весь входной файл – в этом случае, пока правило будет начитывать строки для сопоставления (один проход), все более ранние правила проверят каждую начитываемую строку (дочерняя операция, вложенная). Кроме того, тела инициации дополнительных переменных и тела самих правил интерпретируются как отдельные тексты. Имеем, таким образом, один входной текст, и множество порождаемых им .. хм... «промежуточных» текстов. Каждый такой «промежуточный» отработав возвращает в родительский текст команду «вместо меня поставь вот это». Это, примерно, как стек вызовов. То, что в конце-концов возвращается на выходе – это текст, у которого нет «родителей».
(боюсь, нужны картинки для объяснения).
Ужасно путано, но, на самом деле, там снова и снова повторяется (часто вложено) одно и то-же действие – подмена одного текста другим.

>когда генерируется новый текст (строка), куда он генерируется?

Новый текст генерируется всегда – любым правилом, которое успешно сопоставило образец и успешно исполнило свое тело; любой конструкцией (циклы, ветвления), условия для которых выполнены. Фактически, успешность любого исполнения следует понимать как команду «вставь полученный текст ВМЕСТО того текста, который представляла собой эта конструкция».

Например, если условие в CHECK-блоке выполнено, то весь текст между CHECK и CHECK-END удаляется, а вместо него вставляется тело THEN-блока.

>Какие цели языка?
Очень сложно ответить на этот вопрос. Примерно, как на вопрос о смысле жизни. Откровенно говоря, никаких практических результатов не жду. Просто забавно. Интересно. Например, чуть в сторону, до сих пор помню впечатления от первого знакомства со SNOBOL – поразительно, и ТАК тоже можно.
Вообщем, языков программирования и так очень много, и этот – еще один, который не получит никакого распространения, не будет нигде и никем использоваться, кроме автора (да и то - сомнительно), но который достаточно забавен сам по себе – чем и делюсь. Эдакая воскресная головоломка – страничка с кроссвордами.
[Ответ][Цитата]
daner
Сообщений: 4593
На: MiLK
Добавлено: 17 мар 08 16:05
>>>>>Плюмаж
Цитата:
Может быть, Daner, согласен и красивее – не могу судить, т.к. никогда не сталкивался с Python

а зря, советую. я много работаю с текстовыми файлами, так как и логи от экспериментов надо обрабатывать, и (как и вы) люблю писать небольшие языки-скрипты очень высокого уровня, а на Python''е сделать парсер, или компилятор (скажем, через c/c++) или даже интерпретатор ооочень просто. Можно даже не задумываться о структуре нового языка (я имею ввиду, что он не обязан быть LR(1), что достаточно необходимое требование у парсеров с "посимвольным" проходом).
Я думаю вам понравиться.

В любом случае, спасибо за "воскресный кроссворд" Было бы прикольно, если бы вы описали, чего В ПРИНЦИПЕ такой подход сделать не позволяет. Это было бы даже полезно, так как возможно помогло бы в дальнейшем грамотнее подбирать язык под цели.
[Ответ][Цитата]
Плюмаж
Сообщений: 110
На: MiLK
Добавлено: 18 мар 08 1:18
Цитата:
Автор: daner
... LR(1) ...


Увы, со времен моих славных детсадовских дней мир стал значительно сложнее и непонятнее. (впрочем, конечно, есть Яндекс)

Цитата:

Было бы прикольно, если бы вы описали, чего В ПРИНЦИПЕ такой подход сделать не позволяет. Это было бы даже полезно, так как возможно помогло бы в дальнейшем грамотнее подбирать язык под цели.


Ну-у-у-у... если говорить о разборе (и только в случае MiLK), то, конечно, не подойдут те конструкции, в которых есть ориентация на позицию в строке. Например, кажется, ранние версии Фортрана (как, впрочем, и Снобол) считают метками слова, расположенные в певой позиции строки, но, т.к. MiLK "не видит" начальных и конечных пробелов, то здесь могут проблемы. В перспективе, даже с конструированием правил "на лету" нет проблемы - достаточно переключить разделитель ($) на другой символ, собрать новое правило (допустим, кто-то захочет иметь макросы типа DEFINE в Cи), а затем его, правило, принять.

Кажется, с учетом выше сказанного, проблема только в объемах памяти и в терпении (долго ждать придется результатов разбора на сложных случаях).
[Ответ][Цитата]
Плюмаж
Сообщений: 110
На: MiLK
Добавлено: 18 мар 08 2:41
Картинка (довольно большая) пояснения простого случая вычислений. (т.к. обработка собственных ключевых слов - это, в сущности, правила наивысшего приоритета, то пример показан для обработки слова NUMBER, как правила - с образцом и телом).

http://rundschau.narod.ru/milk_seq.JPG (230 кБ)
[Ответ][Цитата]
daner
Сообщений: 4593
На: MiLK
Добавлено: 18 мар 08 3:36
Цитата:
Автор: Плюмаж

Картинка (довольно большая) пояснения простого случая вычислений. (т.к. обработка собственных ключевых слов - это, в сущности, правила наивысшего приоритета, то пример показан для обработки слова NUMBER, как правила - с образцом и телом).

http://rundschau.narod.ru/milk_seq.JPG (230 кБ)


что-то я не понял шаги #9,10. По какому правилу там получается 8 и 11?

А что на счет пересекающихся правил? Ну когда к одной строке подходит сразу два правила?

P.S.
Касательно RL(1), я просто думал вы знакомы с теорией компиляции (ну если вас это интересует, а она не такая уж сложная). Это значит что каждый токен (т.е. значимое слово/оператор и т.д.), в языке можно распознать заглянув в перед только на один символ.
ну скажем есть два оператора
qwert, qwedfgh
разница у них начинается после "е", но что бы их различить, надо заглянуть только на один символ в перед. Но если у вас например в языке есть два оператора
qwert****=>, qwert****<=
Где "*" какие либо символы, то что бы их распознать, нужно заглянуть на 5 символов в перед. Если не ошибаюсь, ваш язык попадает в класс RL(1).
[Ответ][Цитата]
Плюмаж
Сообщений: 110
На: MiLK
Добавлено: 18 мар 08 4:40
Цитата:
Автор: daner

что-то я не понял шаги #9,10. По какому правилу там получается 8 и 11?
А что на счет пересекающихся правил? Ну когда к одной строке подходит сразу два правила?


Шаг 8. - продолжается начитка строк текста, для сопоставления с образцом правила NUMBER
(ключевые слова - это "строенные" правила наивысшего приоритета. Если-бы не было NUMBER, мы могли-бы его определить, как правило:

$RULE my-own-number-reaction
#NUMBER $%operation$%
$%arg1$%
$%arg2%
$RULE-BODY
... здесь какие-то действия ...
... например, можно симулировать сложение (по-разрядам) ...
$RULE-END

)
Эта операция сопоставления (образец правила содержит три строки) началась на шаге 3., но еще длится, т.к. правило NUMBER никак не может получить очередную строку - ее перехватывают другие правила (в т.ч. и оно само - на более глубоком уровне).

Шаг 9. Сопоставление завершилось. Начинаем выполнять тело правила. (аналогия с шагом 6. - тело правила является отдельным текстом, который отдельно выполняется - и там тоже могут быть вложенные операции (и вложенные тексты) ). Но у NUMBER (для скорости) тело правила особое (где-то там, внутри, просто происходит сложение - без всяких фокусов, поэтому и нет "обычного" MiLK-овского исполнения). Результат исполнения - строка "8". Этот результат вставляется ВМЕСТО текст, который успешно сопоставился.

Шаг 10. Сам этот текст, который здесь для нас - вершина, может быть вложенным текстом другой цепочки (например, телом какого-то правила). Т.к. больше строк нет в этом тексте, и все операции закончены, то этот текст возвращается туда, откду был вызван. (если он часть тела правила, то вернется туда, где тектс, сопоставленный образцу правила; если это был входящий текст, то вернется в выходной файл).

Примерно так.

Это и есть взаимодействие правил. Если образцы однострочные, то взаимодействия явно не видно, т.к. прежде, чем правило с приоритетом N, получит шанс начать сопоставление, здесь уже поработают все правила с приоритетом меньшим N. В случае многострочных образцов (как у NUMBER) - взаимодействие чуть заметнее.

Тела инициации дополнительных переменных - это тоже отдельные тексты, результат обработки которых возвращается в переменную.


Цитата:

P.S.
Касательно RL(1), я просто думал вы знакомы с теорией компиляции (ну если вас это интересует, а она не такая уж сложная). Это значит что каждый токен (т.е. значимое слово/оператор и т.д.), в языке можно распознать заглянув в перед только на один символ.
ну скажем есть два оператора
qwert, qwedfgh
разница у них начинается после "е", но что бы их различить, надо заглянуть только на один символ в перед. Но если у вас например в языке есть два оператора
qwert****=>, qwert****<=
Где "*" какие либо символы, то что бы их распознать, нужно заглянуть на 5 символов в перед. Если не ошибаюсь, ваш язык попадает в класс RL(1).


Если, я правильно понял (что сомнительно), то ... кхм... мы можем определить, например правила... э-э-э-э-э... нет... похоже, не понял, или просто внутренне сопротивляюсь (какое-то дилетантское несогласие имеется) .... надо будет, пожалуй, все-же почитать, как ни стыдно признаваться...
[Ответ][Цитата]
Павел Фоменко
Сообщений: 1081
На: MiLK
Добавлено: 18 мар 08 10:07
Приветствую Плюмаж!
А скажите - что подвигло вас на то, чтобы ЗАНОВО ПЕРЕПИСАТЬ CLIPS ?
Синдром "изобретателя велосипеда", что ли?
[Ответ][Цитата]
Плюмаж
Сообщений: 110
На: MiLK
Добавлено: 18 мар 08 10:35
Цитата:
Автор: Павел Фоменко

Приветствую Плюмаж!
А скажите - что подвигло вас на то, чтобы ЗАНОВО ПЕРЕПИСАТЬ CLIPS ?
Синдром "изобретателя велосипеда", что ли?


В самом деле, Delphi - это всего-лишь переписанный Visual Basic, MsWord - это всего-навсего переписанный Notepad, а Windows - никчемная переделка MsDos 5.0

На форуме SQL.RU, в разделе "Программирование" настоящие битвы по этому поводу (Все выглядит примерно так: "А!!! " - кричит один - "VB6.0 - самая лучшая штука"; "Сам дурак!" - вопит другой. И тут начинается драка).



MiLK - это не экспертная система, и не движок для создания оных. Это просто обработчик текста. Можно, например, открыть бутылку о борт атомной подводной лодки, и недоумевать, зачем понадобилось строить такую большую "открывашку".
[Ответ][Цитата]
Павел Фоменко
Сообщений: 1081
На: MiLK
Добавлено: 18 мар 08 13:31
Цитата:
Автор: Плюмаж

Можно, например, открыть бутылку о борт атомной подводной лодки, и недоумевать, зачем понадобилось строить такую большую "открывашку".


Я бы сказал так: можно открыть бутылку о борт атомной подводной лодки, а можно:
- построить шахту
- добыть руду
- выплавить сталь
- отлить открывашку.
Вы как раз занимаетесь этим "переоткрыванием".
Что мешает взять готовое? Или в CLIPS нет тех возможностей, которые вы описали в документации к своеё проге?

Мне просто интересна цель вот таких нелепых затрат программерских человеко-часов.
[Ответ][Цитата]
Павел Фоменко
Сообщений: 1081
На: MiLK
Добавлено: 18 мар 08 13:35
Поймите, я никак не осуждаю и не критикую ваш подход - продукционные системы - сила!
Но почему бы не исспользовать стандартные средства?
[Ответ][Цитата]
Алхимик
Сообщений: 315
На: MiLK
Добавлено: 18 мар 08 16:38
2Плюмаж: к сведению - то, что читается одинаково с обеих сторон - это палиндром, анаграмма - это когда буквы переставленны.
[Ответ][Цитата]
daner
Сообщений: 4593
На: MiLK
Добавлено: 18 мар 08 23:59
Цитата:
Автор: Павел Фоменко
Мне просто интересна цель вот таких нелепых затрат программерских человеко-часов.

Думаю что та же или близкое к той, для чего вы с Corwin''ом в свое время rss-reader делали
[Ответ][Цитата]
Плюмаж
Сообщений: 110
На: MiLK
Добавлено: 19 мар 08 1:03
Цитата:
Автор: Алхимик

2Плюмаж: к сведению - то, что читается одинаково с обеих сторон - это палиндром, анаграмма - это когда буквы переставленны.


У-ж-ж-жасно.
[Ответ][Цитата]
Corwin
Сообщений: 1324
На: MiLK
Добавлено: 19 мар 08 1:06
Если честно то не совсем разобрался как сделать глобальную переменную (для всех правил)?
Пробовал что-то типа:
$ASSOCIATION-CREATE asc1

$RULE t1
R1: $%object$%
$RULE-BODY
hi
$ASSOCIATE asc1
tst
$%object$%
${asc1$tst$}
$RULE-END

$RULE t2
R2: $%object$%
$RULE-BODY
hello
${asc1$tst$}
$RULE-END

В правиле t1 переменную tst видно, а в t2 уже нет....
Или как вообще можно передать какоето значение из одного правила в другое?
[Ответ][Цитата]
Плюмаж
Сообщений: 110
На: MiLK
Добавлено: 19 мар 08 1:24
Я попробовал Ваши правила на примере:

----
r1: anna
R2: bella
-----


Ответ был:

MiLK> ----
hi
anna
hello
anna
-----


Т.е.
1. Ассоциации - это, действительно, место обмена данными между правилами
2. Работает, или я не понял вопрос.
3. Быть может, у Вас не отработало первое правило и поэтому второе поругалось, что ассоциированное значение не существует?


$ASSOCIATION-CREATE asc1

$RULE t1
R1: $%object$%
$RULE-BODY
Правило T1 cо значением "$%object$%" отработало.
$ASSOCIATE asc1
tst
$%object$%
Ассоциирование выполнено (asc1.tst="${asc1$tst$}")
$RULE-END

$RULE t2
R2: $%object$%
$RULE-BODY
Правило T2 cо значением "$%object$%" отработало.
$CHECK-TRY
${asc1$tst$}
$CHECK-THEN
Ассоциированое значение (asc1.tst="${asc1$tst$}")
$CHECK-ELSE
Ассоциированое значение НЕ СУЩЕСТВУЕТ!
$CHECK-END
$RULE-END
----
r2: ParaBellum
r1: Anna
R2: Bella
-----
MiLK> ----
Правило T2 cо значением "ParaBellum" отработало.
Ассоциированое значение НЕ СУЩЕСТВУЕТ!
Правило T1 cо значением "Anna" отработало.
Ассоциирование выполнено (asc1.tst="Anna")
Правило T2 cо значением "Bella" отработало.
Ассоциированое значение (asc1.tst="Anna")
-----
[Ответ][Цитата]
 Стр.1 (3): [1]  2  3След. > >>