fregejs
Version:
A propositional logic library written in Typescript
61 lines (47 loc) • 1.7 kB
text/typescript
import { InvalidFormulaException } from 'exceptions';
import { Formula } from 'types';
/**
* A class that provides methods to build formulas with
* the artificial language of logic syntax.
*/
export class Builder {
private static operations = {
Biconditional: this.biconditional,
Conjunction: this.conjunction,
Disjunction: this.disjunction,
Implication: this.implication,
};
private static biconditional(left: Formula, right: Formula) {
return `(${left} <-> ${right})`;
}
private static conjunction(left: Formula, right: Formula) {
return `(${left} ∧ ${right})`;
}
private static disjunction(left: Formula, right: Formula) {
return `(${left} ∨ ${right})`;
}
private static implication(left: Formula, right: Formula) {
return `(${left} -> ${right})`;
}
private static buildRecursively(formula: Formula) {
if (typeof formula === 'string') return formula;
if ('operation' in formula && formula.operation === 'Negation')
return `¬(${this.buildFormula(formula.value)})`;
if (!('operation' in formula))
throw new InvalidFormulaException('Invalid Formula.');
const left = this.buildFormula(formula.left);
const right = this.buildFormula(formula.right);
const operation = formula.operation;
return this.operations[operation](left as Formula, right as Formula);
}
/**
* Builds a formula with the syntax of logic.
* @param formula - The logical formula to build.
* @returns The builded logical formula.
* @throws {InvalidFormulaException}
*/
public static buildFormula(formula: Formula): string {
const result = this.buildRecursively(formula);
return result;
}
}