master > master: codego - aufteilen von methoden in /formulae
This commit is contained in:
parent
73b7817dcd
commit
89c8e63f4b
@ -1,283 +0,0 @@
|
|||||||
package formulae
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
/* ---------------------------------------------------------------- *
|
|
||||||
* TYPE Formula
|
|
||||||
* ---------------------------------------------------------------- */
|
|
||||||
|
|
||||||
type Formula struct {
|
|
||||||
kind string
|
|
||||||
expr string
|
|
||||||
valence int
|
|
||||||
subformulae [](*Formula)
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ---------------------------------------------------------------- *
|
|
||||||
* METHODS
|
|
||||||
* ---------------------------------------------------------------- */
|
|
||||||
|
|
||||||
func (fml *Formula) SetKind(kind string) {
|
|
||||||
fml.kind = kind
|
|
||||||
}
|
|
||||||
|
|
||||||
func (fml Formula) GetKind() string {
|
|
||||||
return fml.kind
|
|
||||||
}
|
|
||||||
|
|
||||||
func (fml *Formula) SetExpr(expr string) {
|
|
||||||
fml.expr = expr
|
|
||||||
}
|
|
||||||
|
|
||||||
func (fml Formula) GetExpr() string {
|
|
||||||
return fml.expr
|
|
||||||
}
|
|
||||||
|
|
||||||
func (fml *Formula) SetSubformulae(children [](*Formula)) {
|
|
||||||
fml.subformulae = children
|
|
||||||
fml.valence = len(children)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (fml Formula) GetSubFormulae() []Formula {
|
|
||||||
var n int = fml.valence
|
|
||||||
var children = make([]Formula, n)
|
|
||||||
for i, subfml := range fml.subformulae {
|
|
||||||
children[i] = *subfml
|
|
||||||
}
|
|
||||||
return children
|
|
||||||
}
|
|
||||||
|
|
||||||
func (fml Formula) GetChild(indexOpt ...int) Formula {
|
|
||||||
var index int = 0
|
|
||||||
if len(indexOpt) > 0 {
|
|
||||||
index = indexOpt[0]
|
|
||||||
}
|
|
||||||
var subfml Formula
|
|
||||||
if 0 <= index && index < fml.valence {
|
|
||||||
subfml = *(fml.subformulae[index])
|
|
||||||
} else {
|
|
||||||
panic(fmt.Sprintf("Instance has no child of index %d !", index))
|
|
||||||
}
|
|
||||||
return subfml
|
|
||||||
}
|
|
||||||
|
|
||||||
func (fml Formula) Pretty(preindentOpt ...string) string {
|
|
||||||
var preindent string = ""
|
|
||||||
if len(preindentOpt) > 0 {
|
|
||||||
preindent = preindentOpt[0]
|
|
||||||
}
|
|
||||||
return fml.pretty(preindent, " ", "", 0)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (fml Formula) pretty(preindent string, tab string, prepend string, depth int) string {
|
|
||||||
var indent string = preindent + strings.Repeat(tab, depth)
|
|
||||||
switch fml.valence {
|
|
||||||
case 0:
|
|
||||||
switch kind := fml.kind; kind {
|
|
||||||
case "atom", "generic":
|
|
||||||
return indent + prepend + kind + " " + fml.expr
|
|
||||||
default:
|
|
||||||
return indent + prepend + kind
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
var lines string = indent + prepend + fml.kind
|
|
||||||
prepend = "|__ "
|
|
||||||
for _, subfml := range fml.subformulae {
|
|
||||||
lines += "\n" + subfml.pretty(preindent, tab, prepend, depth+1)
|
|
||||||
}
|
|
||||||
return lines
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (fml Formula) Deepcopy() Formula {
|
|
||||||
var children = make([](*Formula), len(fml.subformulae))
|
|
||||||
for i, child := range fml.subformulae {
|
|
||||||
childCopy := child.Deepcopy()
|
|
||||||
children[i] = &childCopy
|
|
||||||
}
|
|
||||||
return Formula{
|
|
||||||
expr: fml.expr,
|
|
||||||
kind: fml.kind,
|
|
||||||
valence: fml.valence,
|
|
||||||
subformulae: children,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *
|
|
||||||
* METHODS: Basic constructions
|
|
||||||
* ---------------------------------------------------------------- */
|
|
||||||
|
|
||||||
var Tautology = Formula{
|
|
||||||
kind: "taut",
|
|
||||||
expr: "1",
|
|
||||||
valence: 0,
|
|
||||||
subformulae: [](*Formula){},
|
|
||||||
}
|
|
||||||
|
|
||||||
var Contradiction = Formula{
|
|
||||||
kind: "contradiction",
|
|
||||||
expr: "0",
|
|
||||||
valence: 0,
|
|
||||||
subformulae: [](*Formula){},
|
|
||||||
}
|
|
||||||
|
|
||||||
func Atom(expr string) Formula {
|
|
||||||
return Formula{
|
|
||||||
kind: "atom",
|
|
||||||
expr: expr,
|
|
||||||
valence: 0,
|
|
||||||
subformulae: [](*Formula){},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func NegatedAtom(expr string) Formula {
|
|
||||||
return Negation(Atom(expr))
|
|
||||||
}
|
|
||||||
|
|
||||||
func Generic(expr string) Formula {
|
|
||||||
return Formula{
|
|
||||||
kind: "generic",
|
|
||||||
expr: expr,
|
|
||||||
valence: 0,
|
|
||||||
subformulae: [](*Formula){},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func Negation(fml Formula) Formula {
|
|
||||||
return Formula{
|
|
||||||
kind: "not",
|
|
||||||
expr: "!" + " " + fml.expr,
|
|
||||||
valence: 1,
|
|
||||||
subformulae: [](*Formula){&fml},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func Conjunction2(fml1 Formula, fml2 Formula) Formula {
|
|
||||||
return Formula{
|
|
||||||
kind: "and2",
|
|
||||||
expr: "(" + fml1.expr + " && " + fml2.expr + ")",
|
|
||||||
valence: 2,
|
|
||||||
subformulae: [](*Formula){&fml1, &fml2},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func Conjunction(fmls []Formula) Formula {
|
|
||||||
var expr string = ""
|
|
||||||
var children = make([](*Formula), len(fmls))
|
|
||||||
for i, fml := range fmls {
|
|
||||||
if i > 0 {
|
|
||||||
expr += " && "
|
|
||||||
}
|
|
||||||
expr += fml.expr
|
|
||||||
children[i] = &fml
|
|
||||||
}
|
|
||||||
return Formula{
|
|
||||||
kind: "and",
|
|
||||||
expr: "(" + expr + ")",
|
|
||||||
valence: len(children),
|
|
||||||
subformulae: children,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func Disjunction2(fml1 Formula, fml2 Formula) Formula {
|
|
||||||
return Formula{
|
|
||||||
kind: "or2",
|
|
||||||
expr: "(" + fml1.expr + " || " + fml2.expr + ")",
|
|
||||||
valence: 2,
|
|
||||||
subformulae: [](*Formula){&fml1, &fml2},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func Disjunction(fmls []Formula) Formula {
|
|
||||||
var expr string = ""
|
|
||||||
var children = make([](*Formula), len(fmls))
|
|
||||||
for i, fml := range fmls {
|
|
||||||
if i > 0 {
|
|
||||||
expr += " || "
|
|
||||||
}
|
|
||||||
expr += fml.expr
|
|
||||||
children[i] = &fml
|
|
||||||
}
|
|
||||||
return Formula{
|
|
||||||
kind: "or",
|
|
||||||
expr: "(" + expr + ")",
|
|
||||||
valence: len(children),
|
|
||||||
subformulae: children,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func Implies(fml1 Formula, fml2 Formula) Formula {
|
|
||||||
return Formula{
|
|
||||||
kind: "implies",
|
|
||||||
expr: "(" + fml1.expr + " -> " + fml2.expr + ")",
|
|
||||||
valence: 2,
|
|
||||||
subformulae: [](*Formula){&fml1, &fml2},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *
|
|
||||||
* METHODS: Recognition of Formula-Types
|
|
||||||
* ---------------------------------------------------------------- */
|
|
||||||
|
|
||||||
func (fml Formula) IsIrreducible() bool {
|
|
||||||
return fml.valence == 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func (fml Formula) IsAtom() bool {
|
|
||||||
return fml.kind == "atom"
|
|
||||||
}
|
|
||||||
|
|
||||||
func (fml Formula) IsPositiveLiteral() bool {
|
|
||||||
return fml.IsAtom()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (fml Formula) IsNegativeLiteral() bool {
|
|
||||||
return fml.IsNegation() && fml.GetChild().IsAtom()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (fml Formula) IsLiteral() bool {
|
|
||||||
return fml.IsPositiveLiteral() || fml.IsNegativeLiteral()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (fml Formula) IsGeneric() bool {
|
|
||||||
return fml.kind == "generic"
|
|
||||||
}
|
|
||||||
|
|
||||||
func (fml Formula) IsTautologySymbol() bool {
|
|
||||||
return fml.kind == "taut"
|
|
||||||
}
|
|
||||||
|
|
||||||
func (fml Formula) IsContradictionSymbol() bool {
|
|
||||||
return fml.kind == "contradiction"
|
|
||||||
}
|
|
||||||
|
|
||||||
func (fml Formula) IsConnective() bool {
|
|
||||||
return fml.valence > 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func (fml Formula) IsNegation() bool {
|
|
||||||
return fml.kind == "not"
|
|
||||||
}
|
|
||||||
|
|
||||||
func (fml Formula) IsConjunction2() bool {
|
|
||||||
return fml.kind == "and2"
|
|
||||||
}
|
|
||||||
|
|
||||||
func (fml Formula) IsConjunction() bool {
|
|
||||||
return fml.kind == "and" || fml.kind == "and2"
|
|
||||||
}
|
|
||||||
|
|
||||||
func (fml Formula) IsDisjunction2() bool {
|
|
||||||
return fml.kind == "or2"
|
|
||||||
}
|
|
||||||
|
|
||||||
func (fml Formula) IsDisjunction() bool {
|
|
||||||
return fml.kind == "or" || fml.kind == "or2"
|
|
||||||
}
|
|
||||||
|
|
||||||
func (fml Formula) IsImplication() bool {
|
|
||||||
return fml.kind == "implies"
|
|
||||||
}
|
|
119
codego/aussagenlogik/formulae/formulae_basic.go
Normal file
119
codego/aussagenlogik/formulae/formulae_basic.go
Normal file
@ -0,0 +1,119 @@
|
|||||||
|
package formulae
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------- *
|
||||||
|
* TYPE Formula
|
||||||
|
* ---------------------------------------------------------------- */
|
||||||
|
|
||||||
|
type Formula struct {
|
||||||
|
kind string
|
||||||
|
expr string
|
||||||
|
valence int
|
||||||
|
subformulae [](*Formula)
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------- *
|
||||||
|
* METHODS
|
||||||
|
* ---------------------------------------------------------------- */
|
||||||
|
|
||||||
|
func (fml *Formula) SetKind(kind string) { fml.kind = kind }
|
||||||
|
|
||||||
|
func (fml Formula) GetKind() string { return fml.kind }
|
||||||
|
|
||||||
|
func (fml *Formula) SetExpr(expr string) { fml.expr = expr }
|
||||||
|
|
||||||
|
func (fml Formula) GetExpr() string { return fml.expr }
|
||||||
|
|
||||||
|
func (fml *Formula) SetSubformulae(children [](*Formula)) {
|
||||||
|
fml.subformulae = children
|
||||||
|
fml.valence = len(children)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (fml Formula) GetSubFormulae() []Formula {
|
||||||
|
var n int = fml.valence
|
||||||
|
var children = make([]Formula, n)
|
||||||
|
for i, subfml := range fml.subformulae {
|
||||||
|
children[i] = *subfml
|
||||||
|
}
|
||||||
|
return children
|
||||||
|
}
|
||||||
|
|
||||||
|
func (fml Formula) GetChild(indexOpt ...int) Formula {
|
||||||
|
var index int = 0
|
||||||
|
if len(indexOpt) > 0 {
|
||||||
|
index = indexOpt[0]
|
||||||
|
}
|
||||||
|
var subfml Formula
|
||||||
|
if 0 <= index && index < fml.valence {
|
||||||
|
subfml = *(fml.subformulae[index])
|
||||||
|
} else {
|
||||||
|
panic(fmt.Sprintf("Instance has no child of index %d !", index))
|
||||||
|
}
|
||||||
|
return subfml
|
||||||
|
}
|
||||||
|
|
||||||
|
func (fml Formula) Pretty(preindentOpt ...string) string {
|
||||||
|
var preindent string = ""
|
||||||
|
if len(preindentOpt) > 0 {
|
||||||
|
preindent = preindentOpt[0]
|
||||||
|
}
|
||||||
|
return fml.pretty(preindent, " ", "", 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (fml Formula) pretty(preindent string, tab string, prepend string, depth int) string {
|
||||||
|
var indent string = preindent + strings.Repeat(tab, depth)
|
||||||
|
switch fml.valence {
|
||||||
|
case 0:
|
||||||
|
switch kind := fml.kind; kind {
|
||||||
|
case "atom", "generic":
|
||||||
|
return indent + prepend + kind + " " + fml.expr
|
||||||
|
default:
|
||||||
|
return indent + prepend + kind
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
var lines string = indent + prepend + fml.kind
|
||||||
|
prepend = "|__ "
|
||||||
|
for _, subfml := range fml.subformulae {
|
||||||
|
lines += "\n" + subfml.pretty(preindent, tab, prepend, depth+1)
|
||||||
|
}
|
||||||
|
return lines
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (fml Formula) Deepcopy() Formula {
|
||||||
|
var children = make([](*Formula), len(fml.subformulae))
|
||||||
|
for i, child := range fml.subformulae {
|
||||||
|
childCopy := child.Deepcopy()
|
||||||
|
children[i] = &childCopy
|
||||||
|
}
|
||||||
|
return Formula{
|
||||||
|
expr: fml.expr,
|
||||||
|
kind: fml.kind,
|
||||||
|
valence: fml.valence,
|
||||||
|
subformulae: children,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *
|
||||||
|
* METHODS: Recognition of Formula-Types
|
||||||
|
* ---------------------------------------------------------------- */
|
||||||
|
|
||||||
|
func (fml Formula) IsIrreducible() bool { return fml.valence == 0 }
|
||||||
|
func (fml Formula) IsAtom() bool { return fml.kind == "atom" }
|
||||||
|
func (fml Formula) IsPositiveLiteral() bool { return fml.IsAtom() }
|
||||||
|
func (fml Formula) IsNegativeLiteral() bool { return fml.IsNegation() && fml.GetChild().IsAtom() }
|
||||||
|
func (fml Formula) IsLiteral() bool { return fml.IsPositiveLiteral() || fml.IsNegativeLiteral() }
|
||||||
|
func (fml Formula) IsGeneric() bool { return fml.kind == "generic" }
|
||||||
|
func (fml Formula) IsTautologySymbol() bool { return fml.kind == "taut" }
|
||||||
|
func (fml Formula) IsContradictionSymbol() bool { return fml.kind == "contradiction" }
|
||||||
|
func (fml Formula) IsConnective() bool { return fml.valence > 0 }
|
||||||
|
func (fml Formula) IsNegation() bool { return fml.kind == "not" }
|
||||||
|
func (fml Formula) IsConjunction2() bool { return fml.kind == "and2" }
|
||||||
|
func (fml Formula) IsConjunction() bool { return fml.kind == "and" || fml.kind == "and2" }
|
||||||
|
func (fml Formula) IsDisjunction2() bool { return fml.kind == "or2" }
|
||||||
|
func (fml Formula) IsDisjunction() bool { return fml.kind == "or" || fml.kind == "or2" }
|
||||||
|
func (fml Formula) IsImplication() bool { return fml.kind == "implies" }
|
117
codego/aussagenlogik/formulae/formulae_construction.go
Normal file
117
codego/aussagenlogik/formulae/formulae_construction.go
Normal file
@ -0,0 +1,117 @@
|
|||||||
|
package formulae
|
||||||
|
|
||||||
|
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *
|
||||||
|
* CONSTANTS
|
||||||
|
* ---------------------------------------------------------------- */
|
||||||
|
|
||||||
|
var Tautology = Formula{
|
||||||
|
kind: "taut",
|
||||||
|
expr: "1",
|
||||||
|
valence: 0,
|
||||||
|
subformulae: [](*Formula){},
|
||||||
|
}
|
||||||
|
|
||||||
|
var Contradiction = Formula{
|
||||||
|
kind: "contradiction",
|
||||||
|
expr: "0",
|
||||||
|
valence: 0,
|
||||||
|
subformulae: [](*Formula){},
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *
|
||||||
|
* METHODS: Constructions
|
||||||
|
* ---------------------------------------------------------------- */
|
||||||
|
|
||||||
|
func Atom(expr string) Formula {
|
||||||
|
return Formula{
|
||||||
|
kind: "atom",
|
||||||
|
expr: expr,
|
||||||
|
valence: 0,
|
||||||
|
subformulae: [](*Formula){},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func NegatedAtom(expr string) Formula {
|
||||||
|
return Negation(Atom(expr))
|
||||||
|
}
|
||||||
|
|
||||||
|
func Generic(expr string) Formula {
|
||||||
|
return Formula{
|
||||||
|
kind: "generic",
|
||||||
|
expr: expr,
|
||||||
|
valence: 0,
|
||||||
|
subformulae: [](*Formula){},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func Negation(fml Formula) Formula {
|
||||||
|
return Formula{
|
||||||
|
kind: "not",
|
||||||
|
expr: "!" + " " + fml.expr,
|
||||||
|
valence: 1,
|
||||||
|
subformulae: [](*Formula){&fml},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func Conjunction2(fml1 Formula, fml2 Formula) Formula {
|
||||||
|
return Formula{
|
||||||
|
kind: "and2",
|
||||||
|
expr: "(" + fml1.expr + " && " + fml2.expr + ")",
|
||||||
|
valence: 2,
|
||||||
|
subformulae: [](*Formula){&fml1, &fml2},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func Conjunction(fmls []Formula) Formula {
|
||||||
|
var expr string = ""
|
||||||
|
var children = make([](*Formula), len(fmls))
|
||||||
|
for i, fml := range fmls {
|
||||||
|
if i > 0 {
|
||||||
|
expr += " && "
|
||||||
|
}
|
||||||
|
expr += fml.expr
|
||||||
|
children[i] = &fml
|
||||||
|
}
|
||||||
|
return Formula{
|
||||||
|
kind: "and",
|
||||||
|
expr: "(" + expr + ")",
|
||||||
|
valence: len(children),
|
||||||
|
subformulae: children,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func Disjunction2(fml1 Formula, fml2 Formula) Formula {
|
||||||
|
return Formula{
|
||||||
|
kind: "or2",
|
||||||
|
expr: "(" + fml1.expr + " || " + fml2.expr + ")",
|
||||||
|
valence: 2,
|
||||||
|
subformulae: [](*Formula){&fml1, &fml2},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func Disjunction(fmls []Formula) Formula {
|
||||||
|
var expr string = ""
|
||||||
|
var children = make([](*Formula), len(fmls))
|
||||||
|
for i, fml := range fmls {
|
||||||
|
if i > 0 {
|
||||||
|
expr += " || "
|
||||||
|
}
|
||||||
|
expr += fml.expr
|
||||||
|
children[i] = &fml
|
||||||
|
}
|
||||||
|
return Formula{
|
||||||
|
kind: "or",
|
||||||
|
expr: "(" + expr + ")",
|
||||||
|
valence: len(children),
|
||||||
|
subformulae: children,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func Implies(fml1 Formula, fml2 Formula) Formula {
|
||||||
|
return Formula{
|
||||||
|
kind: "implies",
|
||||||
|
expr: "(" + fml1.expr + " -> " + fml2.expr + ")",
|
||||||
|
valence: 2,
|
||||||
|
subformulae: [](*Formula){&fml1, &fml2},
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user