Главная Макинтош Регистрация

Вход

Приветствую Вас Гость | RSSПятница, 28.07.2017, 21:49
Наш опрос
Оцените мой сайт
Всего ответов: 3

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Форма входа


Главная » 2013 » Октябрь » 8 » Что-то тихо здесь
11:36
Что-то тихо здесь
Посмотрел, что в коммуне слишком тихо, вот и попросился у уважаемого модератора права на запись. Давайте что-то обсудим, что ли. :) Например, вот что есть в моём скромном маленьком проекте (на вебе уже живёт, но ссылку не даю, во избежание): Разбор естественного человеческого языка (тайского) с помощью FParsec. Сам автор ФПарсека, Stephan Tolksdorf, сказал, что он никогда не думал, что его детищем могут парсить натуральные языки. Скоро будет также лаосский, камбоджийский, санскрит и деванагари.Монадическая модель доказательства к логическому выводу, написанная с нуля (советы будут приняты с огромной радостью, ибо написано на коленке).Про FParsec всё понятно, кроме того, что он используется для нечёткого парсинга, примерно такого же, который используется для парсинга некомпилирующегося кода в проектах типа ReSharper. Другими словами, производится иерархический парсинг с возвратом до тех пор, пока не будет обнаружен чёткий признак, что парсинг можно прервать. Затем все получившиеся цепочки взвешиваются и выбирается самая "e;качественная"e;: val variants: Parser<'T seq> -> Parser<'T list list> Где на входе список правил, а на выходе список, каждый элемент в котором - упорядоченный список правил, которые могут быть применены ко входному потоку. Про модель доказательства в двух словах. Рассматриваем каждую функцию как механизм получения логического вывода. Аргументы - это некоторые аксиомы, поданные на вход ("e;икс равен пяти"e;). Функция может обращаться к другим функциям, которые, в свою очередь, тоже делают какие-то выводы по таким же правилам. Моя цель была - провести "e;трассу"e; логических выводов сквозь все частные выводы к конечной цели. Для этого каждая функция возвращает не просто сам по себе результат, а'TResult * Tree<'TProof>Где дерево упрощённо выглядит как Tree<'T> = | Empty | Leaf of 'T | Node of 'T * List<Tree<'T>> Цепочка функций сопрягается примерно так: let increment a = proven "e;incremented"e;     let! _ = a <!?> "e;argument a"e;    return a 1     let mymethod x y = proven "e;mymethod"e;     let! _ = x <!?> "e;argument x"e;    let! _ = y <!?> "e;argument y"e;    let! x2 = increment x    let! y2 = increment y    return x2 y2     let result, resultProof = mymethod 5 20Такой вызов вернёт resultProof, который можно представить в виде: Goal: mymethod = 27 because| (1) argument x = 5| AND (2) argument y = 20| AND (3) incremented = 6 because| | (3.1) argument a = 5| AND (4) incremented = 21 because| | (4.1) argument a = 20 Оператор <!?> - это shortcut на простой метод 'T -> 'T * Leaf<string> Да, и ещё. На самом деле, дерево не просто из стрингов состоит, а из Lazy<string>. То есть, само дерево формируется сразу, а логический вывод, который не всегда нужен юзеру, да ещё и активно вызывающий sprintf (который тяжёлый), формируется только тогда, когда мы уже дерево визуализируем в текст или XML.
Просмотров: 164 | Добавил: admin | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *:
Поиск

Календарь
«  Октябрь 2013  »
ПнВтСрЧтПтСбВс
 123456
78910111213
14151617181920
21222324252627
28293031

Архив записей

Copyright MyCorp © 2017Хостинг от uCoz