LINUX.ORG.RU

Что-то непонятно, в чем основная идея и какую проблему они решают?

anonymous
()
Ответ на: комментарий от anonymous

> Что-то непонятно, в чем основная идея и какую проблему они решают?

сперва была практическая задача -- нужно было сделать high-level
wrapper над библиотекой.  Нужно представлять много разных сущностей:
узлы сетей, возможные значения этих сетей, типы узлов,
названия переменных и неизвестно что еще.  Названия могут быть
идентификаторами, целыми числами, или даже парами чисел в случае
решеток.

И возникла идея сделать один универсальный супертип, который будет очень емким
и способен выразить много и разных вещей.  Насколько я понимаю
некая аналогия этого -- ASN.1  Но он слишком сложный и не для людей.
Этот тип должен компактно записываться.

Я пришел вот к какой конструкции.
Нотационально этот тип это последовательность слов разделенных
сепаратором.

Например rock^0.2 или prev_comp_turn^rock^prev_hum_turn^paper^0.333

Еще есть некое глобальное динамическое дерево идентификаторов.
Например:

                                             rock
                                            /
                               cur_hum_turn-paper
                              /             \
                             /               scsissors
                            /
                           /
                          /                 /rock
                 node--cat-----prev_hum_turn-paper
                /    \    \                 \scsissors
  my_first_bnet/      \    \
 /                     \    \              /rock
                        \    prev_comp_turn-paper
                         \                 \scsissors
                          num
 
Каждый токен может резолвиться с учетом контекста.  Дискретные идентификаторы
при этом превращаются в узлы этого дерева.

Семантически токен это как раз пара -- 0, 1 или больше узлов дерева (это как
бы суть токена), и опциональный массив флоатов (это как бы полезная нагрузка).

Например токен rock^0.2 -- если контекст слишком широкий то он не разрезолвится
из-за двухсмысленности, но в контексте например cur_hum_turn он разрезолвится
в один узел дерева.  Плюс полезная нагрузка в виде одного флоата.

Токен cur_hum_turn^rock^0.2 разрезолвится и в более широком контексте,
потому что в нем устранена двухсмысленность.  Резолвится в тот же самый узел
что и предыдущий токен.

Токен prev_comp_turn^rock^prev_hum_turn^paper^0.333 резолвится в пару узлов.

Токен my_first_bnet^cur_hum_turn резолвится в один узел.

То есть идея резолва -- последовательность дискретных идентификаторов в токене
намечает путь в дереве и тем самым определяет узел.  Если заходим в тупик,
пытаемся найти следующий узел.

На токенах определена операция ^.  Кроме того их можно организовывать в массивы.
Их можно сравнивать (нетранзитивное сравнение)

dilmah ★★★★★
() автор топика
Ответ на: комментарий от dilmah

То есть решается проблема поиска объектов (которые некоторым образом классифицированы) в зависимости от контекста, в котором мы находимся?

anonymous
()
Ответ на: комментарий от anonymous

> То есть решается проблема поиска объектов (которые некоторым образом классифицированы) в зависимости от контекста, в котором мы находимся?

ну скорее не самого поиска, а компактной записи.

dilmah ★★★★★
() автор топика
Ответ на: комментарий от yuriy123

> И что?

ну типа ожидал, вдруг в фидбеке встретился бы какой-нибудь комментарий -- похожая штука делалась там-то, или "дык блин, у тебя тут design flaw", или совет что изменить/добавить/убрать.

Ну и наконец просто ознакомить общественность.

dilmah ★★★★★
() автор топика
Ответ на: комментарий от yuriy123

> type a = A of a list | V of float;;

насколько я понимаю это не совсем то.. конечно токены можно выразить в ML или в другом языке, например их текущая реализация на C++..

но они гораздо больше чем просто список идентификаторов. Токен это еще способ их интерпретации. Если токен полностью резолвится то идентификаторы определяют узлы дерева. Несколько идентификаторов могут определять один узел. Разные наборы идентификаторов могут определять один узел..

Например ты пишешь какую-то функцию скриптового рэппера. Все аргументы ее это токены или массивы токенов. В прологе функции ты резолвишь аргументы в том контексте в котором хочешь. После этого ты будешь иметь в токенах узлы дерева, с которыми легко работать. Пользователь тоже доволен потому что он употребил компактную запись в понятных ему идентификаторах. И главное есть единообразная схема резолва/сравнения/прочих операций с токенами, которую сделал один раз и потом забыл.

dilmah ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.