As an exercise, I take a scrap of argumentation, expand it into a tree diagram (using FreeMind), and then formalize the argument (in Automath). This towards the goal of creating "rationality augmentation" software. In the short term, my suspicion is that such software would look like a group of existing tools glued together with human practices.
About my choice of tools: I investigated Araucaria, Rationale, Argumentative, and Carneades. With the exception of Rationale, they're not as polished graphically as FreeMind, and the rigid argumentation-theory structure was annoying in the early stages of analysis. Using a general-purpose mapping/outlining tool may not be ideal, but it's easy to obtain. The primary reason I used Automath to formalize the argument was because I'm somewhat familiar with it. Another reason is that it's easy to obtain and build (at least, on GNU/Linux).
Automath is an ancient and awesomely flexible proof checker. (Of course, other more modern proof-checkers are often just as flexible, maybe more flexible, and may be more useable.) The amount of "proof checking" done in this example is trivial - roughly, what the checker is checking is: "after assuming all of these bits and pieces of opaque human reasoning, do they form some sort of tree?" - but cutting down a powerful tool leaves a nice upgrade path, in case people start using exotic forms of logic. However, the argument checkers built into the various argumentation-theory tools do not have such upgrade paths, and so are not really credible as candidates to formalize the arguments on this site.
Here's a piece of argumentation, abstracted from something that I was really thinking about at work:
There aren't any memory leaks in this method, but how would I argue it? If I had tested it with a tool like Valgrind or mtrace, I would have some justification - but I didn't. By eye, it doesn't look like it does any allocations from the heap. Of course, if a programmer violated coding standards, they could conceal an allocation from casual inspection. However, the author of the code wouldn't violate the coding standard that badly. Why do I believe that they wouldn't violate the coding standard? Well, I can't think of a reason for them to violate the coding standard deliberately, and they're competent enough to avoid making such an egregious mistake by accident.
In order to apply the argument diagramming technique, try to form a tree structure, with claims supported by independent reasons. Reasons are small combinations of claims, which do not support the conclusion alone, but do support it together. This is what I came up with (png, svg, FreeMind's native mm format).
Some flaws in this analysis:
1. The cursory inspection might be an independent reason for believing there are no allocations.
2. There isn't any mention in the analysis of the egregiousness of the mistake.
3. The treatment of benevolence and competence is asymmetrical.
(My understanding with argument diagramming so far is that bouncing between "try to diagram the argument as best you can" and "try to explain in what ways the diagram is still missing aspects of the original text" is helpful.)
In order to translate this informal argument into Automath, I used a very simple logical framework. Propositions are a kind of thing, and each justification is of some proposition. There are no general-purpose inference rules like modus ponens or "From truth of a proposition, conclude necessity of that proposition". This means that every reason in the argument needs to assume its own special-case inference rule, warranting that step.
# A proposition is a kind of thing, by assumption.
* proposition
: TYPE
= PRIM
# a justification of a proposition is a kind of thing, by assumption
* [p : proposition]
justification
: TYPE
= PRIM
To translate a claim in this framework, we create (by assuming) a the proposition, with a chunk like this:
* claim_foo
: proposition
= PRIM
To translate a reason for a claim "baz" from predecessor claims "foo" and "bar", first we create (by assuming) the inference rule, with a chunk like this:
* [p:justification(claim_foo)]
[q:justification(claim_bar)]
reason_baz
: justification(claim_baz)
= PRIM
Secondly, we actually use the inference rule (exactly once), with a chunk like this:
* justification_baz
: justification(claim_baz)
= reason_baz(justification_foo, justification_bar)
My formalization of the above scrap of reasoning is here. Running "aut" is really easy. Do something like:
aut there_are_no_leaks.aut
Where to go next:
- Formalize more arguments, and bigger arguments.
- Investigate more tools (a more modern proof checker?).
- The translation from Freemind diagram to Automath is probably automatable via FreeMind's XSLT export.
- How do we incorporate other tools into the workflow? For example Google, Genie&Smile, or some sort of checklist tool?
- What argument schemes (reflective inconsistency? don't be continually surprised?) do we actually use?
- Try to get some experimental evidence that formalization actually helps rationality somehow.
This is really interesting. I had the idea to do something like this about 10 years ago (when I was 15). I never did get anywhere with it though, and I haven't spent very much time at all working on it. Seems that you've gotten a lot farther than I have. In fact, I think this article, about practical guidelines for debating productively, is much more useful than anything I've done on formalization.
I think the central idea of the project is reducing arguments to their constituent parts. I call the basic parts "atoms". Practically, there's no way to completely reduce them to first principles, the way it's done in formalizations of mathematical systems (like the libraries of Isabelle, Coq, or Metamath). Doing that would probably be GAI-complete. So the best we can do is come up with some practical rules of thumb, some set of criteria that can be applied relatively unambiguously to determine whether some assertion or whatnot makes a good atom, or needs to be decomposed further. And further analysis, looking deeper into the issue, can always uncover the need for decomposition where it was previously not recognized. In fact, such further decomposition would probably be a central part of explicating new arguments in the system.
I think the first main hurdle, and maybe the last one, is determining what types of atoms are necessary, and what types of relationships between them, and how they correspond to the rules of probability. If you want automated checking, each atom has to be related by a rather basic, simple relationship to other atoms. Otherwise you can't formalize it. So what are the relationship types? What are the atom types?
The system has to have some way of representing facts/beliefs, but those can be disputed. People assign different probabilities to them. So how do you deal with that? You can't automate that away. Maybe you have some way of letting the user fill in their own belief ratios for all the tree's leaf nodes (i.e. the premises) and then propagate those up the tree. Perhaps you give the premises default values, given by the argument's author, or a consensus number, or both.
How do you handle the extra-logical parts of the argument, those relating to semantics? For instance, special definitions of terms used in other atoms. A lot of argument comes down to arguing over definitions.