18

Please advise. I am a lawyer, I work in the field of Law Informatics. I have been a programmer for a long time (Basic, RPG, Fortran, Pascal, Cobol, VB.NET, C#). I am currently interested in F#, but I'd like some advise. My concern is F# seems to be fit for math applications. And what I want would require a lot of Boolean Math operations and Natural Language Processing of text and, if successful, speech. I am worried about the text processing.

I received a revolutionary PROLOG source code (revolutionary in the field of Law and in particular Dispute Resolution). The program solves disputes by evaluating Yes-No (true-false) arguments advanced by two debating parties. Now, I am learning PROLOG so I can take the program to another level: evaluate the strenght of arguments when they are neither a Yes or No, but a persuasive element in the argumentation process.

So, the program handles the dialectics aspect of argumentation, I want it to begin processing the rhetoric aspect of argumentation, or at least some aspects.

Currently the program can manage formal logic. What I want is to begin managing some aspects of informal logic and for that I would need to do parsing of strings (long strings, maybe ms word documents) for the detection of text markers, words like "but" "therefore" "however" "since" etc, etc, just a long list of words I have to look up in any speech (verbal or written) and mark, and then evaluate left side and right side of the mark. Depending on the mark the sides are deemed strong or weak.

Initially, I thought of porting the Prolog program to C# and use a Prolog library. Then, it ocurred to me maybe it could be better in pure F#.

dde
  • 650
  • 8
  • 18
  • 4
    In case anyone is curious about theorem proving in F#, some fellow F#'ers and I ported the code from the *Handbook of Practical Logic and Automated Reasoning* to F#: https://github.com/jack-pappas/fsharp-logic-examples – Jack P. Apr 26 '13 at 11:22

6 Answers6

17

First, the project you describe sounds (and I believe this is the correct legal term) totally freaking awesome.

Second, while F# is a good choice for math applications, its also extremely well-suited for any applications which perform a lot of symbolic processing. Its worth noting that F# is part of the ML family of languages which were originally designed for the specific purpose of developing theorem provers. It sounds like you're writing an application which appeals directly to the niche ML languages are geared for.

I would personally recommend writing any theorem proving applications you have in F# rather than C# -- only because the resulting F# code will be about 1/10th the size of the C# equivalent. I posted this sample demonstrating how to evaluate propositional logic in C# and F#, you can see the difference for yourself.

Community
  • 1
  • 1
Juliet
  • 80,494
  • 45
  • 196
  • 228
  • Thanks Juliet I do hope it becomes an awesome project. That sample of yours opened my eyes. Since I can clearly see your point regarding propositional logic I'd like to know your thoughts on the other issue. Would you care to comment on text processing and F#? – dde Jun 30 '09 at 03:34
  • F# actually comes with a Bison-like lexer/parser (I wrote this tutorial on parsing SQL: http://en.wikibooks.org/wiki/F_Sharp_Programming/Lexing_and_Parsing), but I get the feeling the text parsing your doing doesn't conform to regular grammar. You might end up writing your own state machine for this task, so I'm not 100% sure that F# will make the job any easier than C#. However, I really love F#'s pattern matching -- you can mix pattern matching and string parsing together for interesting results: http://en.wikibooks.org/wiki/F_Sharp_Programming/Active_Patterns#Partial_Active_Patterns – Juliet Jun 30 '09 at 12:00
  • Thanks for your reply, it helped and pointed me to a great reading material on Lexing and Parsing. The book is Apress' Expert F# by Don Syme et al, chapter 16. – dde Jul 03 '09 at 12:26
4

F# has many features that make this type of logic processing natural. To get a feel for what the language looks like, here is one possible way to decide which side of an argument has won, and by how much. Uses a random result for the argument, since the interesting (read "very hard to impossible") part will be parsing out the argument text and deciding how persuasive it would be to an actual human.

/// 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
James Hugard
  • 3,232
  • 1
  • 25
  • 36
3

Porting from prolog to F# wont be that straight forward. While they are both non-imperative languages. Prolog is a declarative language and f# is functional. I never used C# Prolog libraries but I think it will be easier then converting the whole thing to f#.

Marcom
  • 4,621
  • 8
  • 54
  • 78
  • 1
    You are right that a port from Prolog to F# won't be straightforward. But if you have C# Prolog libraries, it'd probably be easier to use those libraries from F# and write all the new code in F#. – Nathan Shively-Sanders Jun 29 '09 at 12:58
  • Right, wont be straightforward, however, as it is the program only evaluates whatever input to true or false. The whole program is like one big function, with its inner functions,and they always return true/false. And, the whole point of the program is to win the debate either by keeping on the True track of the argumentation or by making the other party withdraw which is interpreted as True for one side and False for the other. This is why I need to evaluate arguments that are not so black and white. I agree with Nathan, I can call C# Prolog from F#. – dde Jun 30 '09 at 03:49
1

It sounds like the functional aspects of F# are appealing to you, but you wonder if it can handle the non-functional aspects. You should know that F# has the entire .NET Framework at its disposal. It also is not a purely functional language; you can write imperative code in it if you want to.

Finally, if there are still things you want to do from C#, it is possible to call F# functions from C#, and vice versa.

Robert Harvey
  • 178,213
  • 47
  • 333
  • 501
  • Yes, this may be a lifesaver if things get nasty by trying to do everything in F#. – dde Jun 30 '09 at 03:56
0

While F# is certainly more suitable than C# for this kind of application since there're going to be several algorithms which F# allows you to express in a very concise and elegant way, you should consider the difference between functional, OO, and logic programming. In fact, porting from F# will most likely require you to use a solver (or implement your own) and that might take you some time to get used to. Otherwise you should consider making a library with your prolog code and access it from .NET (see more about interop at this page and remember that everything you can access from C# you can also access from F#).

em70
  • 6,088
  • 6
  • 48
  • 80
0

F# does not support logic programming as Prolog does. you might want to check out the P# compiler.

MovGP0
  • 7,267
  • 3
  • 49
  • 42