89 lines
2.6 KiB
Go
89 lines
2.6 KiB
Go
package recursion
|
|
|
|
import (
|
|
"logik/aussagenlogik/formulae"
|
|
)
|
|
|
|
/* ---------------------------------------------------------------- *
|
|
* METHOD: compute NNF
|
|
* ---------------------------------------------------------------- */
|
|
|
|
// NOTE: diese bedarf einer Art Doppeltrekursion
|
|
func NNF(fml formulae.Formula) formulae.Formula {
|
|
// Definiere Schema:
|
|
var schema = func(fml formulae.Formula, prevValues []formulae.FormulaPair) formulae.FormulaPair {
|
|
// separate out positive and negative parts:
|
|
var pairs = formulae.NewFormulaPairs(prevValues)
|
|
var prevPos = pairs.Pos()
|
|
var prevNeg = pairs.Neg()
|
|
// compute value from previous positive/negative parts:
|
|
if fml.IsPositiveLiteral() {
|
|
return formulae.FormulaPair{
|
|
Pos: fml.Deepcopy(),
|
|
Neg: formulae.Negation(fml),
|
|
}
|
|
} else if fml.IsNegativeLiteral() {
|
|
return formulae.FormulaPair{
|
|
Pos: fml.Deepcopy(),
|
|
Neg: prevPos[0],
|
|
}
|
|
} else if fml.IsTautologySymbol() {
|
|
return formulae.FormulaPair{
|
|
Pos: formulae.Tautology,
|
|
Neg: formulae.Contradiction,
|
|
}
|
|
} else if fml.IsContradictionSymbol() {
|
|
return formulae.FormulaPair{
|
|
Pos: formulae.Contradiction,
|
|
Neg: formulae.Tautology,
|
|
}
|
|
} else if fml.IsNegation() {
|
|
return formulae.FormulaPair{
|
|
Pos: prevNeg[0],
|
|
Neg: prevPos[0],
|
|
}
|
|
} else if fml.IsConjunction2() {
|
|
return formulae.FormulaPair{
|
|
Pos: formulae.Conjunction2(prevPos[0], prevPos[1]),
|
|
Neg: formulae.Disjunction2(prevNeg[0], prevNeg[1]),
|
|
}
|
|
} else if fml.IsConjunction() {
|
|
return formulae.FormulaPair{
|
|
Pos: formulae.Conjunction(prevPos),
|
|
Neg: formulae.Disjunction(prevNeg),
|
|
}
|
|
} else if fml.IsDisjunction2() {
|
|
return formulae.FormulaPair{
|
|
Pos: formulae.Disjunction2(prevPos[0], prevPos[1]),
|
|
Neg: formulae.Conjunction2(prevNeg[0], prevNeg[1]),
|
|
}
|
|
} else if fml.IsDisjunction() {
|
|
return formulae.FormulaPair{
|
|
Pos: formulae.Disjunction(prevPos),
|
|
Neg: formulae.Conjunction(prevNeg),
|
|
}
|
|
} else if fml.IsImplication() {
|
|
return formulae.FormulaPair{
|
|
Pos: formulae.Disjunction2(prevNeg[0], prevPos[1]),
|
|
Neg: formulae.Conjunction2(prevPos[0], prevNeg[1]),
|
|
}
|
|
} else if fml.IsDoubleImplication() {
|
|
return formulae.FormulaPair{
|
|
Pos: formulae.Conjunction2(
|
|
formulae.Disjunction2(prevNeg[0], prevPos[1]),
|
|
formulae.Disjunction2(prevNeg[1], prevPos[0]),
|
|
),
|
|
Neg: formulae.Disjunction2(
|
|
formulae.Conjunction2(prevPos[0], prevNeg[1]),
|
|
formulae.Conjunction2(prevPos[1], prevNeg[0]),
|
|
),
|
|
}
|
|
} else {
|
|
panic("Could not evaluate expression!")
|
|
}
|
|
}
|
|
// Erzeuge Funktion aus Schema und berechne Wert:
|
|
fn := formulae.CreateFromSchemeFmlPairValued(schema)
|
|
return fn(fml).Pos
|
|
}
|