Вопрос по – F #: это нормально для разработки доказательств теорем?

17

Пожалуйста, порекомендуйте. Я юрист, работаю в области юридической информатики. Я был программистом в течение длительного времени (Basic, RPG, Fortran, Pascal, Cobol, VB.NET, C #). В настоящее время я интересуюсь F #, но мне бы хотелось посоветовать. Меня беспокоит, что F # подходит для математических приложений. И то, что я хочу, потребовало бы большого количества операций с булевой математикой и обработки текста на естественном языке и, в случае успеха, речи. Я беспокоюсь об обработке текста.

Я получил революционный исходный код PROLOG (революционный в области права и, в частности, разрешения споров). Программа разрешает споры, оценивая аргументы Да-Нет (истина-ложь), выдвинутые двумя участниками дискуссии. Сейчас я изучаю PROLOG, чтобы я мог вывести программу на другой уровень: оценить силу аргументов, когда они не являются ни «да», ни «нет», а являются убедительным элементом в процессе аргументации.

Итак, программа обрабатывает диалектический аспект аргументации, я хочу, чтобы она начала обрабатывать риторический аспект аргументации или, по крайней мере, некоторые аспекты.

В настоящее время программа может управлять формальной логикой. Я хочу начать управлять некоторыми аспектами неформальной логики, и для этого мне понадобится выполнить синтаксический анализ строк (длинные строки, возможно, документы MS Word) для обнаружения текстовых маркеров, таких слов, как & quot; но & quot; & Quot; следовательно, & Quot; & Quot, однако & Quot; & Quot; так & Quot; и т. д., и т. д., только длинный список слов, которые я должен найти в любой речи (устной или письменной) и отметить, а затем оценить левую и правую стороны знака. В зависимости от знака стороны считаются сильными или слабыми.

Сначала я подумал о переносе программы Prolog на C # и использовании библиотеки Prolog. Затем мне показалось, что в чистом F # могло бы быть и лучше.

В случае, если кому-то интересно узнать о теоремах в F #, некоторые коллеги из F # и я перенесли код из Руководство по практической логике и автоматическому рассуждению в F #: Github.com / Джек-Папас / FSharp-логика-примеры Jack P.

Ваш Ответ

6   ответов
3

являются императивными языками. Пролог является декларативным языком, а f # функционален. Я никогда не использовал библиотеки C # Prolog, но думаю, что будет проще, чем конвертировать все в f #.

Вы правы, что порт из Пролога в F # не будет простым. Но если у вас есть библиотеки C # Prolog, вероятно, было бы проще использовать эти библиотеки из F # и написать весь новый код на F #. Nathan Shively-Sanders
Right, однако, не будет простым, так как это программа только оценивает любой ввод в true или false. Вся программа похожа на одну большую функцию со своими внутренними функциями, и они всегда возвращают true / false. И весь смысл программы в том, чтобы победить в дебатах, либо придерживаясь Истинного пути аргументации, либо заставляя другую сторону отступить, что интерпретируется как Истина для одной стороны и Ложь для другой. Вот почему мне нужно оценить аргументы, которые не так черно-белые. Я согласен с Натаном, я могу позвонить на C # Пролог из F #. dde
17

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

Во-вторых, хотя F # является хорошим выбором для математических приложений, он также чрезвычайно хорошо подходит для любых приложений, которые выполняют много символьной обработки. Стоит отметить, что F # является частью семейства языков ML, которые изначально были разработаны для конкретной цели разработки средств доказательства теорем. Похоже, вы пишете приложение, которое обращается непосредственно к нишевым языкам ML.

Я лично рекомендовал бы написание любых приложений для доказательства теорем на F #, а не на C # - только потому, что полученный код F # будет примерно на 1/10 размера эквивалента C #. Я отправил этот образец демонстрируя, как оценивать пропозициональную логику в C # и F #, вы можете увидеть разницу для себя.

Спасибо, Джульетта. Надеюсь, это станет потрясающим проектом. Этот твой образец открыл мне глаза. Поскольку я ясно вижу вашу точку зрения относительно логики высказываний, я хотел бы узнать ваши мысли по другому вопросу. Не могли бы вы прокомментировать обработку текста и F #? dde
F # на самом деле поставляется с Bison-подобным лексером / парсером (я написал это руководство по синтаксическому анализу SQL: En.wikibooks.org / вики / F_Sharp_Programming / Lexing_and_Parsing), но я чувствую, что текст, разбираемый вами, не соответствует обычной грамматике. Вы можете написать собственный конечный автомат для этой задачи, поэтому я не уверен на 100%, что F # сделает работу легче, чем C #. Тем не менее, я действительно люблю сопоставление с образцом в F # - вы можете смешивать сопоставление с образцом и разбор строк для получения интересных результатов: En.wikibooks.org / вики / F_Sharp_Programming / ... Juliet
Спасибо за ваш ответ, он помог мне и показал отличный материал для чтения по Lexing и парсингу. Книга «Эксперт Апресса», F # Дона Сайма и др., Глава 16. dde
4

@ F # есть много функций, которые делают этот тип логической обработки естественным. как выглядит язык, вот один из возможных способов определить, какая сторона аргумента выиграла и на сколько. Использует случайный результат для аргумента, так как интересная часть (читай «очень трудно или невозможно») будет анализировать текст аргумента и решать, насколько убедительным он будет для реального человека.

/// Declare a 'weight' unit-of-measure, so the compiler can do static typechecking
[<Measure>] type weight

/// Type of tokenized argument
type Argument = string

/// Type of argument reduced to side & weight
type ArgumentResult =
    | Pro of float<weight>
    | Con of float<weight>
    | Draw

/// Convert a tokenized argument into a side & weight
/// Presently returns a random side and weight
let ParseArgument =
    let rnd = System.Random()
    let nextArg() = rnd.NextDouble() * 1.0<weight>
    fun (line:string) ->
        // The REALLY interesting code goes here!
        match rnd.Next(0,3) with
        | 1 -> Pro(nextArg())
        | 2 -> Con(nextArg())
        | _ -> Draw

/// Tally the argument scored
let Score args = 
    // Sum up all pro & con scores, and keep track of count for avg calculation
    let totalPro, totalCon, count =
        args
        |> Seq.map ParseArgument
        |> Seq.fold
            (fun (pros, cons, count) arg ->
                match arg with
                | Pro(w) -> (pros+w, cons, count+1)
                | Con(w) -> (pros, cons+w, count+1)
                | Draw   -> (pros, cons,   count+1)
                )
             (0.0<weight>, 0.0<weight>, 0)
    let fcount = float(count)
    let avgPro, avgCon = totalPro/fcount, totalCon/ fcoun
    let diff = avgPro - avgCon
    match diff with
    // consider < 1% a draw
    | d when abs d < 0.01<weight>   -> Draw
    | d when d > 0.0<weight>        -> Pro(d)
    | d                             -> Con(-d)

let testScore = ["yes"; "no"; "yes"; "no"; "no"; "YES!"; "YES!"]
                |> Score
printfn "Test score = %A" testScore
1

вам нравятся функциональные аспекты F #, но вам интересно, справится ли он с нефункциональными аспектами. Вы должны знать, что F # имеет в своем распоряжении весь .NET Framework. Это также не чисто функциональный язык; Вы можете написать императивный код в нем, если хотите.

Наконец, если есть какие-то вещи, которые вы хотите сделать из C #, можно вызывать функции F # из C # и наоборот.

Да, это может стать спасением, если все пойдет не так, если попытаться сделать все в F #. dde
0

безусловно, более подходит, чем C #, для такого рода приложений, поскольку будет несколько алгоритмов, которые F # позволяет выразить очень кратким и элегантным способом, вы должны учитывать разницу между функциональным, ОО и логическим программированием. , На самом деле, портирование с F #, скорее всего, потребует от вас использования решателя (или реализации вашего собственного), и это может занять некоторое время, чтобы привыкнуть. В противном случае вам следует рассмотреть возможность создания библиотеки с кодом пролога и доступа к ней из .NET (подробнее о взаимодействии см. Наэта страниц и помните, что все, что вы можете получить доступ из C #, вы можете получить доступ из F #).

0

как Пролог. Вы можете проверить P # компилятор.

Похожие вопросы