/**
* This program (working title: MAS Prover) is an automated tableaux prover
* for epistemic logic (S5n).
* Copyright (C) 2007 Elske van der Vaart and Gert van Valkenhoef
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 as published
* by the Free Software Foundation.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package nl.rug.ai.mas.oops.tableau;
import java.util.*;
import nl.rug.ai.mas.oops.formula.*;
import nl.rug.ai.mas.oops.parser.Context;
public class PropositionalRuleFactory {
public static String CONJ = "∧";
public static String DISJ = "∨";
public static String NEG = "¬";
public static String IMPL = "→";
public static String BIIM = "↔";
private PropositionalRuleFactory() {
}
public static Vector<Rule> build(Context context) {
Vector<Rule> rules = new Vector<Rule>(7);
rules.add(buildNeg(context));
rules.add(buildCon1(context));
rules.add(buildCon2(context));
rules.add(buildCon3(context));
rules.add(buildCon4(context));
rules.add(buildDis1(context));
rules.add(buildDis2(context));
rules.add(buildDis3(context));
rules.add(buildDis4(context));
return rules;
}
public static Rule buildNeg(Context context) {
String html = NEG;
// variables occuring
Variable<Formula> r = new Variable<Formula>("R");
FormulaReference rref = new FormulaReference(r,
context.getFormulaCodeMap().code(r));
// the formula
Formula f = new Negation(new Negation(rref));
// the rewrites
Vector<Formula> rwt = new Vector<Formula>(1);
rwt.add(rref);
return new LinearRule("NEG", html, f, rwt);
}
public static Rule buildCon1(Context context) {
String html = CONJ + "<sub>" + CONJ + "</sub>";
// variables
Variable<Formula> l = new Variable<Formula>("L");
FormulaReference lref = new FormulaReference(l,
context.getFormulaCodeMap().code(l));
Variable<Formula> r = new Variable<Formula>("R");
FormulaReference rref = new FormulaReference(r,
context.getFormulaCodeMap().code(r));
// formula
Formula f = new Conjunction(lref, rref);
// rewrites
Vector<Formula> rwt = new Vector<Formula>(2);
rwt.add(lref);
rwt.add(rref);
return new LinearRule("CON1", html, f, rwt);
}
public static Rule buildCon2(Context context) {
String html = CONJ + "<sub>" + DISJ + "</sub>";
// variables
Variable<Formula> l = new Variable<Formula>("L");
FormulaReference lref = new FormulaReference(l,
context.getFormulaCodeMap().code(l));
Variable<Formula> r = new Variable<Formula>("R");
FormulaReference rref = new FormulaReference(r,
context.getFormulaCodeMap().code(r));
// formula
Formula f = new Negation(new Disjunction(lref, rref));
// rewrites
Vector<Formula> rwt = new Vector<Formula>(2);
rwt.add(new Negation(lref));
rwt.add(new Negation(rref));
return new LinearRule("CON2", html, f, rwt);
}
public static Rule buildCon3(Context context) {
String html = CONJ + "<sub>" + IMPL + "</sub>";
// variables
Variable<Formula> l = new Variable<Formula>("L");
FormulaReference lref = new FormulaReference(l,
context.getFormulaCodeMap().code(l));
Variable<Formula> r = new Variable<Formula>("R");
FormulaReference rref = new FormulaReference(r,
context.getFormulaCodeMap().code(r));
// formula
Formula f = new Negation(new Implication(lref, rref));
// rewrites
Vector<Formula> rwt = new Vector<Formula>(2);
rwt.add(lref);
rwt.add(new Negation(rref));
return new LinearRule("CON3", html, f, rwt);
}
public static Rule buildCon4(Context context) {
String html = CONJ + "<sub>" + BIIM + "</sub>";
// variables
Variable<Formula> l = new Variable<Formula>("L");
FormulaReference lref = new FormulaReference(l,
context.getFormulaCodeMap().code(l));
Variable<Formula> r = new Variable<Formula>("R");
FormulaReference rref = new FormulaReference(r,
context.getFormulaCodeMap().code(r));
// formula
Formula f = new Negation(new BiImplication(lref, rref));
// rewrites
Vector<Formula> rwt = new Vector<Formula>(2);
rwt.add(new Negation(new Conjunction(
new Negation(lref), new Negation(rref))));
rwt.add(new Negation(new Conjunction(
lref, rref)));
return new LinearRule("CON4", html, f, rwt);
}
public static Rule buildDis1(Context context) {
String html = DISJ + "<sub>" + DISJ + "</sub>";
// variables
Variable<Formula> l = new Variable<Formula>("L");
FormulaReference lref = new FormulaReference(l,
context.getFormulaCodeMap().code(l));
Variable<Formula> r = new Variable<Formula>("R");
FormulaReference rref = new FormulaReference(r,
context.getFormulaCodeMap().code(r));
// formula
Formula f = new Disjunction(lref, rref);
// rewrites
Vector<Formula> rwt = new Vector<Formula>(2);
rwt.add(lref);
rwt.add(rref);
return new SplitRule("DIS1", html, f, rwt);
}
public static Rule buildDis2(Context context) {
String html = DISJ + "<sub>" + CONJ + "</sub>";
// variables
Variable<Formula> l = new Variable<Formula>("L");
FormulaReference lref = new FormulaReference(l,
context.getFormulaCodeMap().code(l));
Variable<Formula> r = new Variable<Formula>("R");
FormulaReference rref = new FormulaReference(r,
context.getFormulaCodeMap().code(r));
// formula
Formula f = new Negation(new Conjunction(lref, rref));
// rewrites
Vector<Formula> rwt = new Vector<Formula>(2);
rwt.add(new Negation(lref));
rwt.add(new Negation(rref));
return new SplitRule("DIS2", html, f, rwt);
}
public static Rule buildDis3(Context context) {
String html = DISJ + "<sub>" + IMPL + "</sub>";
// variables
Variable<Formula> l = new Variable<Formula>("L");
FormulaReference lref = new FormulaReference(l,
context.getFormulaCodeMap().code(l));
Variable<Formula> r = new Variable<Formula>("R");
FormulaReference rref = new FormulaReference(r,
context.getFormulaCodeMap().code(r));
// formula
Formula f = new Implication(lref, rref);
// rewrites
Vector<Formula> rwt = new Vector<Formula>(2);
rwt.add(new Negation(lref));
rwt.add(rref);
return new SplitRule("DIS3", html, f, rwt);
}
public static Rule buildDis4(Context context) {
String html = DISJ + "<sub>" + BIIM + "</sub>";
// variables
Variable<Formula> l = new Variable<Formula>("L");
FormulaReference lref = new FormulaReference(l,
context.getFormulaCodeMap().code(l));
Variable<Formula> r = new Variable<Formula>("R");
FormulaReference rref = new FormulaReference(r,
context.getFormulaCodeMap().code(r));
// formula
Formula f = new BiImplication(lref, rref);
// rewrites
Vector<Formula> rwt = new Vector<Formula>(2);
rwt.add(new Conjunction(new Negation(lref), new Negation(rref)));
rwt.add(new Conjunction(lref, rref));
return new SplitRule("DIS4", html, f, rwt);
}
}