diff --git a/codego/aussagenlogik/formulae/formulae_advanced.go b/codego/aussagenlogik/formulae/formulae_advanced.go new file mode 100644 index 0000000..d62a7fe --- /dev/null +++ b/codego/aussagenlogik/formulae/formulae_advanced.go @@ -0,0 +1,23 @@ +package formulae + +/* ---------------------------------------------------------------- * + * METHOD Get Atoms + * ---------------------------------------------------------------- */ + +func schemeGetAtoms(fml Formula, prevValues [](*[]Formula)) *[]Formula { + if fml.IsAtom() { + return &[]Formula{fml.Copy()} + } else { + var results = []Formula{} + for _, prevValue := range prevValues { + results = append(results, *prevValue...) + } + return &results + } +} + +var fnGetAtoms = CreateFromSchemeFmlsValued(schemeGetAtoms) + +func (fml Formula) GetAtoms() []Formula { + return *fnGetAtoms(fml) +} diff --git a/codego/aussagenlogik/formulae/formulae_basic.go b/codego/aussagenlogik/formulae/formulae_basic.go index 3085c8a..55315e6 100644 --- a/codego/aussagenlogik/formulae/formulae_basic.go +++ b/codego/aussagenlogik/formulae/formulae_basic.go @@ -28,18 +28,36 @@ 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) SetSubformulae(subfmls [](*Formula)) { + fml.subformulae = subfmls + fml.valence = len(subfmls) } func (fml Formula) GetSubFormulae() []Formula { var n int = fml.valence - var children = make([]Formula, n) + var subfmls = make([]Formula, n) for i, subfml := range fml.subformulae { - children[i] = *subfml + subfmls[i] = *subfml } - return children + return subfmls +} + +func (fml Formula) GetAllSubFormulae() []Formula { + var subfml = fml.GetSubFormulae() + var result = []Formula{fml.Copy()} + for _, child := range subfml { + result = append(result, child.GetAllSubFormulae()...) + } + return result +} + +func (fml Formula) GetAllSubFormulaeStrict() []Formula { + var subfml = fml.GetSubFormulae() + var result = []Formula{} + for _, child := range subfml { + result = append(result, child.GetAllSubFormulae()...) + } + return result } func (fml Formula) GetChild(indexOpt ...int) Formula { @@ -84,17 +102,27 @@ func (fml Formula) pretty(preindent string, tab string, prepend string, depth in } } +// shallow copy +func (fml Formula) Copy() Formula { + return Formula{ + expr: fml.expr, + kind: fml.kind, + valence: fml.valence, + subformulae: fml.subformulae, + } +} + func (fml Formula) Deepcopy() Formula { - var children = make([](*Formula), len(fml.subformulae)) - for i, child := range fml.subformulae { - childCopy := child.Deepcopy() - children[i] = &childCopy + var subfmls = make([](*Formula), len(fml.subformulae)) + for i, subfml := range fml.subformulae { + subfmlCopy := subfml.Deepcopy() + subfmls[i] = &subfmlCopy } return Formula{ expr: fml.expr, kind: fml.kind, valence: fml.valence, - subformulae: children, + subformulae: subfmls, } }