-
Notifications
You must be signed in to change notification settings - Fork 2
VerboseTableuxCalculus
George Plotnikov edited this page Feb 7, 2022
·
5 revisions
let VerboseTableuxCalculus (formulaCalcList: Formula list) (formulaInterpritations: bool list list) : string =
let sb = new System.Text.StringBuilder()
let subFormulasVals = new Dictionary<Formula, bool>()
let _saveFormulaValueAndPrint =
fun formula value ->
if not (subFormulasVals.ContainsKey(formula)) then
subFormulasVals.Add(formula, value)
else
subFormulasVals.Item(formula) <- value
bprintf sb $"{value}\t"
let len = ((VerboseFormula formula).Length / 8)
for _ = 1 to len do
bprintf sb "\t"
for i = 0 to formulaInterpritations.Length - 1 do
let rowVarValues = formulaInterpritations.Item i
let mutable j = 0
formulaCalcList
|> List.iter (fun f ->
match f with
| Formula.Var (_) ->
bprintf sb $"{rowVarValues.Item(j)} \t"
j <- j + 1
| Formula.Neg (Var (x)) ->
let index =
formulaCalcList
|> List.findIndex (fun h -> h = Var(x))
let calc = CalcFormula(Formula.Neg(Formula.Const(rowVarValues.Item(index))))
_saveFormulaValueAndPrint f calc
| Formula.Conj (Var (x), Var (y)) ->
let indexX =
formulaCalcList
|> List.findIndex (fun h -> h = Var(x))
let indexY =
formulaCalcList
|> List.findIndex (fun h -> h = Var(y))
let calc =
CalcFormula(Conj(Const(rowVarValues.Item(indexX)), Const(rowVarValues.Item(indexY))))
_saveFormulaValueAndPrint f calc
| Formula.Disj (Var (x), Var (y)) ->
let indexX =
formulaCalcList
|> List.findIndex (fun h -> h = Var(x))
let indexY =
formulaCalcList
|> List.findIndex (fun h -> h = Var(y))
let calc =
CalcFormula(Disj(Const(rowVarValues.Item(indexX)), Const(rowVarValues.Item(indexY))))
_saveFormulaValueAndPrint f calc
| Formula.Bic (Var (x), Var (y)) ->
let indexX =
formulaCalcList
|> List.findIndex (fun h -> h = Var(x))
let indexY =
formulaCalcList
|> List.findIndex (fun h -> h = Var(y))
let calc =
CalcFormula(Bic(Const(rowVarValues.Item(indexX)), Const(rowVarValues.Item(indexY))))
_saveFormulaValueAndPrint f calc
| Formula.Bic (Var (x), y) ->
let rightVal = subFormulasVals.GetValueOrDefault(y)
let indexX =
formulaCalcList
|> List.findIndex (fun h -> h = Var(x))
let calc = CalcFormula(Bic(Const(rowVarValues.Item(indexX)), Const(rightVal)))
_saveFormulaValueAndPrint f calc
| Formula.Bic (x, Var (y)) ->
let leftVal = subFormulasVals.GetValueOrDefault(x)
let indexY =
formulaCalcList
|> List.findIndex (fun h -> h = Var(y))
let calc = CalcFormula(Bic(Const(rowVarValues.Item(indexY)), Const(leftVal)))
_saveFormulaValueAndPrint f calc
| Formula.Bic (x, y) ->
let leftVal = subFormulasVals.GetValueOrDefault(x)
let rightVal = subFormulasVals.GetValueOrDefault(y)
let calc = CalcFormula(Bic(Const(rightVal), Const(leftVal)))
_saveFormulaValueAndPrint f calc
| Formula.Impl (Var (x), Var (y)) ->
let leftVal =
formulaCalcList
|> List.findIndex (fun h -> h = Var(x))
let rightVal =
formulaCalcList
|> List.findIndex (fun h -> h = Var(y))
let calc =
CalcFormula(Impl(Const(rowVarValues.Item(leftVal)), Const(rowVarValues.Item(rightVal))))
_saveFormulaValueAndPrint f calc
| Formula.Impl (x, Var (y)) ->
let leftVal = subFormulasVals.GetValueOrDefault(x)
let rightVal =
formulaCalcList
|> List.findIndex (fun h -> h = Var(y))
let calc = CalcFormula(Impl(Const(leftVal), Const(rowVarValues.Item(rightVal))))
_saveFormulaValueAndPrint f calc
| Formula.Impl (Var (x), y) ->
let rightVal = subFormulasVals.GetValueOrDefault(y)
let leftVal =
formulaCalcList
|> List.findIndex (fun h -> h = Var(x))
let calc = CalcFormula(Impl(Const(rowVarValues.Item(leftVal)), Const(rightVal)))
_saveFormulaValueAndPrint f calc
| Formula.Impl (x, y) ->
let leftVal = subFormulasVals.GetValueOrDefault(x)
let rightVal = subFormulasVals.GetValueOrDefault(y)
let calc = CalcFormula(Impl(Const(leftVal), Const(rightVal)))
_saveFormulaValueAndPrint f calc
| _ -> printf "unknown formula %A" f)
bprintf sb "\r\n"
sb.ToString()
This formula calculates trivial formulas and builds string output in the table view. Trivial formulas calculation is performed by using CalcFormula method.
There is one inner method:
let _saveFormulaValueAndPrint =
fun formula value ->
if not (subFormulasVals.ContainsKey(formula)) then
subFormulasVals.Add(formula, value)
else
subFormulasVals.Item(formula) <- value
bprintf sb $"{value}\t"
let len = ((VerboseFormula formula).Length / 8)
for _ = 1 to len do
bprintf sb "\t"
Then it does iterates through all possible interpretations and saves the output as a string. To find a particular Variable value it searches for
let leftVal = formulaCalcList |> List.findIndex(fun h -> h = Var(x))
index of the Variable and make up an Atom
Impl(Const(rowVarValues.Item(leftVal))
and then evaluates by CalcFormula method.
Input:
Formula.Impl(Conj(Var "P", Var "Q"), Bic(Var "R", Neg(Var "S")))
Output:
P Q R S ~S (P && Q) (R <=> ~S) ((P && Q) -> (R <=> ~S))
True True True True False True False False
True True True False True True True True
True True False True False True True True
True True False False True True False False
True False True True False False False True
True False True False True False True True
True False False True False False True True
True False False False True False False True
False True True True False False False True
False True True False True False True True
False True False True False False True True
False True False False True False False True
False False True True False False False True
False False True False True False True True
False False False True False False True True
False False False False True False False True
let frm = Formula.Impl(Conj(Var "P", Var "Q"), Bic(Var "R", Neg(Var "S")))
let formulaCalcList =
BuildFormulaCalcList frm
|> List.sortBy (fun f -> CalcFormulaDepth f)
let formulaInterpritations = BuildAllFormulasInterpritations formulaCalcList
let output = VerboseTableuxCalculus formulaCalcList formulaInterpritations
Functions