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