F #: это нормально для разработки теоретических доказательств?
Просьба сообщить. Я юрист, я работаю в области юридической информатики. Я был программистом в течение длительного времени (Basic, RPG, Fortran, Pascal, Cobol, VB.NET, С#). В настоящее время я заинтересован в F #, но мне хотелось бы посоветовать. Моя забота - F #, кажется, подходит для математических приложений. И то, что я хочу, потребует много логических операций Math и обработки естественного языка текста и, в случае успеха, речи. Меня беспокоит обработка текста.
Я получил революционный исходный код PROLOG (революционный в области права и, в частности, разрешение споров). Программа решает споры, оценивая аргументы Да-Нет (истинные-ложные), выдвинутые двумя дискуссионными сторонами. Теперь я изучаю PROLOG, чтобы я мог перенести программу на другой уровень: оцените силу аргументов, когда они не являются ни да, ни нет, но являются убедительными элементами процесса аргументации.
Итак, программа обрабатывает диалектический аспект аргументации, я хочу, чтобы он начал обрабатывать риторический аспект аргументации или, по крайней мере, некоторые аспекты.
В настоящее время программа может управлять формальной логикой. Я хочу, чтобы начать управлять некоторыми аспектами неформальной логики, и для этого мне нужно будет обрабатывать строки (длинные строки, может быть, ms word documents) для обнаружения текстовых маркеров, например слова "но" "поэтому", "так как" и т.д. и т.д., просто длинный список слов, которые я должен искать в любой речи (устной или письменной) и отмечать, а затем оценивать левую и правую стороны знака. В зависимости от марки стороны считаются сильными или слабыми.
Первоначально я думал о переносе программы Prolog на С# и использовании библиотеки Prolog. Тогда, это пошло мне, возможно, это может быть лучше в чистом F #.
Ответы
Ответ 1
Во-первых, проект, который вы описываете, звучит (и я считаю, что это правильный юридический термин), полностью волнующий.
Во-вторых, в то время как F # - хороший выбор для математических приложений, он также очень хорошо подходит для любых приложений, которые выполняют много символической обработки. Стоит отметить, что F # является частью семейства языков ML, которые изначально были предназначены для конкретной цели разработки теоретических доказательств. Похоже, вы пишете приложение, которое обращается непосредственно к нишевым ML-языкам, которые предназначены для.
Я лично рекомендовал бы написать любую теорему, доказывающую приложения, которые у вас есть в F #, а не на С#, - только потому, что полученный F # -код будет примерно на 1/10 размера С# эквивалентен. Я разместил этот пример, демонстрируя, как оценивать пропозициональную логику в С# и F #, вы можете увидеть разницу для себя.
Ответ 2
Портирование из пролога в F # не будет таким прямым. Хотя они оба являются неимперативными языками. Prolog - это декларативный язык, а f # - функциональный. Я никогда не использовал библиотеки С# Prolog, но я думаю, что будет легче преобразовать все это в f #.
Ответ 3
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
Ответ 4
Похоже, что функциональные аспекты F # привлекательны для вас, но вам интересно, может ли он справиться с нефункциональными аспектами. Вы должны знать, что F # имеет всю платформу .NET Framework. Это также не чисто функциональный язык; вы можете написать в нем императивный код, если хотите.
Наконец, если все еще есть вещи, которые вы хотите сделать с С#, можно вызвать функции F # из С# и наоборот.
Ответ 5
В то время как F #, безусловно, более подходит, чем С# для такого приложения, поскольку есть несколько алгоритмов, которые F # позволяет вам выразить очень кратким и изящным способом, вы должны рассмотреть разницу между функциональными, OO и логическое программирование. Фактически, перенос с F #, скорее всего, потребует от вас использования решателя (или его реализации), и вам может понадобиться некоторое время, чтобы привыкнуть. В противном случае вам следует подумать о создании библиотеки с вашим прологовым кодом и получить доступ к ней из .NET(подробнее см. В разделе на этой странице и помните, что все, что вы можно получить доступ с С#, к которому вы также можете получить доступ из F #).
Ответ 6
F # не поддерживает логическое программирование, как это делает Prolog. вы можете проверить P # компилятор.