2009-06-29 11 views
16

Por favor, asesorar. Soy abogado, trabajo en el campo de la Informática Jurídica. He sido programador durante mucho tiempo (Basic, RPG, Fortran, Pascal, Cobol, VB.NET, C#). Actualmente estoy interesado en F #, pero me gustaría un consejo. Mi preocupación es que F # parece ser apto para aplicaciones matemáticas. Y lo que deseo requeriría muchas operaciones matemáticas booleanas y procesamiento de lenguaje natural del texto y, si tiene éxito, habla. Estoy preocupado por el procesamiento del texto.F #: ¿está bien para desarrollar demostradores de teoremas?

Recibí un código fuente revolucionario PROLOG (revolucionario en el campo de la ley y, en particular, resolución de disputas). El programa resuelve disputas mediante la evaluación de argumentos Sí-No (verdadero-falso) presentados por dos partes en debate. Ahora, estoy aprendiendo PROLOG para poder llevar el programa a otro nivel: evaluar la fuerza de los argumentos cuando no son ni Sí o No, sino un elemento persuasivo en el proceso de argumentación.

Por lo tanto, el programa maneja el aspecto dialéctico de la argumentación, quiero que comience a procesar el aspecto retórico de la argumentación, o al menos algunos aspectos.

Actualmente, el programa puede gestionar la lógica formal. Lo que quiero es comenzar a manejar algunos aspectos de la lógica informal y para eso tendré que hacer el análisis de cadenas (cadenas largas, tal vez documentos con más palabras) para la detección de marcadores de texto, palabras como "pero" "por lo tanto" "sin embargo" "desde", etc, etc., solo una larga lista de palabras que debo buscar en cualquier discurso (verbal o escrito) y marcar, y luego evaluar el lado izquierdo y el lado derecho de la marca. Dependiendo de la marca, los lados se consideran fuertes o débiles.

Inicialmente, pensé en portar el programa Prolog a C# y usar una biblioteca Prolog. Entonces, se me ocurrió que tal vez podría ser mejor en F # puro.

+4

En caso de que alguien tenga curiosidad acerca de la demostración del teorema en F #, algunos compañeros F #'ers y yo transferimos el código del * Manual de lógica práctica y razonamiento automatizado * a F #: https://github.com/jack-pappas/ fsharp-logic-examples –

Respuesta

16

Primero, el proyecto que describes suena (y creo que este es el término legal correcto) totalmente increíble.

En segundo lugar, mientras que F # es una buena opción para aplicaciones matemáticas, también es muy adecuado para cualquier aplicación que realice un gran procesamiento simbólico. Vale la pena señalar que F # es parte de la familia ML de idiomas que fueron diseñados originalmente para el propósito específico de desarrollar demostradores de teoremas. Parece que estás escribiendo una aplicación que atrae directamente al nicho en el que están orientados los lenguajes ML.

Yo personalmente recomendaría escribir cualquier aplicación de demostración de teoremas que tenga en F # en lugar de C#, solo porque el código F # resultante será aproximadamente 1/10 del tamaño del equivalente de C#. Publiqué this sample demostrando cómo evaluar la lógica proposicional en C# y F #, puedes ver la diferencia por ti mismo.

+0

Gracias Juliet Espero que se convierta en un proyecto increíble. Esa muestra tuya me abrió los ojos. Como puedo ver claramente su punto con respecto a la lógica proposicional, me gustaría saber sus opiniones sobre el otro tema. ¿Te importaría comentar el procesamiento de texto y F #? – dde

+0

F # en realidad viene con un lector/analizador tipo Bison (escribí este tutorial sobre el análisis de SQL: http://en.wikibooks.org/wiki/F_Sharp_Programming/Lexing_and_Parsing), pero tengo la sensación de que el texto que lo analiza no lo hace. Conforme a la gramática regular. Puede terminar escribiendo su propia máquina de estados para esta tarea, por lo que no estoy 100% seguro de que F # hará el trabajo más fácil que C#. Sin embargo, me encanta la coincidencia de patrones de F #: puedes mezclar patrones y análisis de cadenas para obtener resultados interesantes: http://en.wikibooks.org/wiki/F_Sharp_Programming/Active_Patterns#Partial_Active_Patterns – Juliet

+0

Gracias por tu respuesta, ayudó y señaló a un gran material de lectura sobre Lexing y Parsing. El libro es Apress 'Expert F # de Don Syme et al, capítulo 16. – dde

1

Parece que los aspectos funcionales de F # son atractivos para usted, pero se pregunta si puede manejar los aspectos no funcionales. Debe saber que F # tiene todo el .NET Framework a su disposición. Tampoco es un lenguaje puramente funcional; puede escribir un código imperativo si lo desea.

Finalmente, si todavía hay cosas que desea hacer desde C#, es posible llamar a las funciones F # desde C#, y viceversa.

+0

Sí, esto puede ser un salvavidas si las cosas se ponen feas tratando de hacer todo en F #. – dde

3

Pasar de prolog a F # no será tan sencillo. Si bien ambos son idiomas no imperativos. Prolog es un lenguaje declarativo y f # es funcional. Nunca usé las bibliotecas de C# Prolog, pero creo que será más fácil que convertir todo a f #.

+1

Tiene razón en que un puerto de Prolog a F # no será sencillo. Pero si tiene bibliotecas de C# Prolog, probablemente sería más fácil usar esas bibliotecas desde F # y escribir todo el nuevo código en F #. –

+0

Correcto, no será sencillo, sin embargo, dado que es el programa, solo evalúa la entrada verdadera o falsa. Todo el programa es como una gran función, con sus funciones internas, y siempre devuelven verdadero/falso. Y, el objetivo del programa es ganar el debate, ya sea siguiendo la pista verdadera de la argumentación o haciendo que la otra parte se retire, lo que se interpreta como Verdadero para un lado y Falso para el otro. Es por eso que necesito evaluar argumentos que no son tan blanco y negro. Estoy de acuerdo con Nathan, puedo llamar a C# Prolog desde F #. – dde

0

Si bien F # es ciertamente más adecuado que C# para este tipo de aplicación, ya que habrá varios algoritmos que F # le permite expresar de manera muy concisa y elegante, debería considerar la diferencia entre funcional, OO, y programación lógica.De hecho, portar desde F # probablemente requiera que uses un solucionador (o implemente el tuyo) y eso puede llevarte un tiempo para acostumbrarte. De lo contrario, debería considerar hacer una biblioteca con su código de prólogo y acceder a ella desde .NET (vea más sobre interoperabilidad en this page y recuerde que todo lo que puede acceder desde C# también puede acceder desde F #).

3

F # tiene muchas características que hacen que este tipo de procesamiento lógico sea natural. Para tener una idea de cómo se ve el idioma, esta es una forma posible de decidir qué lado de un argumento ha ganado y en qué medida. Utiliza un resultado aleatorio para el argumento, ya que la parte interesante (léase "muy difícil a imposible") analizará el texto del argumento y decidirá qué tan persuasivo sería para un humano real.

/// 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 
0

F # no admite la programación lógica como Prolog. Es posible que desee comprobar el P# compiler.

Cuestiones relacionadas